在微服务中是用队列好还是 RPC 好

2019-07-04 18:11:01 +08:00
 springmarker

个人浅薄的认识,在大多数场景下可以用队列替换 RPC(指代通常的 RPC,不是由队列实现的 RPC)。
队列的优点:
1.消息可以堆积,只要队列稳定,消息丢失的概率就比直接 RPC 低。
2.由接收端主动获取消息的话,负载就由接收端控制了,不会像 RPC 一样无法均衡的负载。
3.没有类似 Zookeeper 的注册中心,发送端和接收端只要面对队列就可以,发送端不用同时面对注册中心和多个接收端。

缺点的话就是性能不如直接 RPC、需要手动写异步转同步。

我看很多微服务都用的是 GRPC 和 Dubbo 之类的 RPC,甚至 Spring Cloud 的 RPC,如果替换成队列会有什么影响吗?不需要高性能的场景下可以互相替换吗?

本人了解甚少,上面都是班门弄斧的瞎说,如有不对,希望大神能指教一二。

16824 次点击
所在节点    程序员
129 条回复
scnace
2019-07-04 23:53:22 +08:00
业界本来就有这种实践吧 用 MQ 就属于消息型接口了 这种情况下我觉得不太适合高并发的场景?当然也能做但是相比 rpc 的实现来说,这种实现是不是成本也会更高了(比如还要多考虑下 MQ 的 backend ) 还有,容错方面 ,如果哪天 MQ 的集群因为某些原因炸了,那我的接口是不是都炸了? 但是我始终觉得存在就是合理的,比如这种消息型接口在某些允许离线的工作模式下面价值就可以发挥出来(大晚上 XJB 乱打的)
Raymon111111
2019-07-05 00:12:09 +08:00
阿里, 京东订单的状态流转是全部消息队列推动的.
petelin
2019-07-05 07:52:40 +08:00
那你有想过为了付出消息队列的你说的这两个特性需要付出多少代价吗

我觉得你这个有搞头但不可能像 http2.0 对 http1.1 那样的颠覆性
算是加 feature 不算是升级
HunterPan
2019-07-05 08:25:07 +08:00
zeroMQ 了解下,就是队列形式
luozic
2019-07-05 08:39:39 +08:00
两个有关系么?队列里面也可以塞 rpc 啊。有些 rpc 也支持队列啊。
luozic
2019-07-05 08:51:59 +08:00
rpc 不等价于同步。rpc 讲的是数据传输层的活;消息队列是传输数据的组织方式。 一个是用啥交通工具(汽车,飞机,火车),一个是物流方式,无中心点对点,还是有物流中心集中调配。怎么就可以对比了?
hhyvs111
2019-07-05 08:52:08 +08:00
两者都不是一个类型,有什么好比的?
no1xsyzy
2019-07-05 09:15:46 +08:00
微服务本来就是队列的( erlang ),只不过后来发现写面向对象的写不来队列才这样的。
本来同步就是伪问题,我们活在爱因斯坦的世界。
blackccc
2019-07-05 09:36:56 +08:00
学习了
reus
2019-07-05 09:39:30 +08:00
队列服务也可以有 rpc 接口。rpc 接口也可以用队列来处理请求。
两者不是互斥的
Takamine
2019-07-05 09:59:06 +08:00
要什么队列要什么 RPC,大家一起走 HTTP 接口不好吗。
q397064399
2019-07-05 10:03:19 +08:00
看你的整体的架构风格,很多系统可以拆分成 事件驱动来完成的话,消息队列很明显是一个非常好的东西,没有强一致性需求的时候 是非常不错的。
justRua
2019-07-05 10:07:31 +08:00
@Takamine 走 http 也算是 RPC 啊,RPC 可以通过 tcp http 等的方式实现,消息载体可以是 json、xml、二进制等
Takamine
2019-07-05 10:17:40 +08:00
@justRua 我说的 HTTP 接口就是最直接的封装好暴露接口的业务逻辑,哪怕是一个 1+1,我也写个接口给你,要什么队列,要什么 RPC :doge:。
javaWeber
2019-07-05 10:27:01 +08:00
"Spring Cloud 的 RPC ?"
其实,SpringCloud 是基于 restful 的。Dubbo 才是基于 rpc 的。
rpc 是远程远程调用。通过某些协议调用其他模块的接口。
restful 是类似于用 url 进行 http 请求。
index90
2019-07-05 10:42:45 +08:00
可行,微信的后台就有类似实践
Aresxue
2019-07-05 11:06:38 +08:00
@javaWeber http 也属于广义的 RPC,RPC 这个概念被滥用了,如果不严格限制的话消息队列也算是一种异步的 RPC。。。狭义的 RPC 才是 dubbo、hsf、grpc 这些
Duluku
2019-07-05 11:16:49 +08:00
这个可不是同步和异步的关系、异步 gRPC 调用也是有的…
springmarker
2019-07-05 11:22:48 +08:00
@petelin #63 ...... 我没有说颠覆性,我理解的优缺点我开头就说了,实现所需要付出的代价肯定是有的,但是同时也会带来一些队列的特性,我想知道如果两者放在微服务效果是怎样的,是否值得。我不是鼓吹队列肯定比传统 RPC 好,你们只是一个劲的反驳,看的我莫名其妙。

@scnace #61 性能不如传统 RPC 是必然的,但是同时高并发的压力也会转移到队列中一部分去。关于炸了,个人觉得现在队列都有分布式,应该还好。

@luozic #66 都可以放在微服务通讯中,为什么不可以比较?

@reus #70 我想的就是因为不是互斥的,在某些场景是可以替换的,想知道两者在微服务中的差距。

@javaWeber #75 关于 Spring Cloud,我在开头专门给它和其他传统 RPC 做了逗号分隔,就是因为 较真的话,http 也可以实现 RPC 的,只是不像我们理解的传统 RPC 是 socket 流传输的,其实 GRPC 默认还是 HTTP2 传输的呢。
springmarker
2019-07-05 11:24:33 +08:00
@Duluku #78 我知道,是楼上们在较真同步和异步的调用,跟他们解释好费劲。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/580080

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX