最近浏览 帖子[1] 的时候看到一个有意思的吐槽。

图片

大概意思是架构师没有选用 RPC 框架来做服务间调用,而选择用 MQ 来代替。是不是很意外?

当然不出意外的,评论区炸了!

图片

现在提出一些疑问:

  • 这个架构师的做法对吗 ?

  • MQ 是否能做 RPC 调用 ?

RPC 框架的职责

回答上面问题之前,稍微捋一下 RPC 框架。目前市面上比较流行的 RPC 框架其实并不多。

  • Java: SpringCloud,Dubbo 等

  • Go: Dubbogo,go-micro,rpcx,go-zero 等

  • 其他:Thrift,gRPC 等

当然还有其他的一些框架,这里就不再罗列。虽说 RPC 多如牛毛,但是大家干的事情基本都差不多,都是稳定,高效、准确的进行服务间远程调用。

说起 RPC 应该大部分人下意识会联想到 gRPC,不过 gRPC 只提供的了服务间通信的能力,但却没有开源对应的服务治理的能力,需要进行二次开发。Thrift 也是同样的问题。

下面以 Dubbogo 为例,大概介绍下 Dubbogo 实现的功能。

图片

Dubbo-go 还有下面这些特点:

  • 传输支持 http2

  • 双向流模式 rpc

  • 应用级服务发现

  • 跟 Dubbo(Java) 版本对齐,互相之间能稳定通信,同时也打通与其他微服务框架的通信,如:SpringCloud、gRPC

综上,Dubbo-go 为了保证数据准确、高效、稳定传输,做了各种各样的架构设计。随着 dubbo 3.0 的发布,在易用性、超大规模微服务实践、云原生基础设施适配等几大方向上进行了全面升级。

MQ 代替 RPC ?

接着说 MQ 是否能替代 RPC。先看看 MQ 被写进八股文里面的几大特性:

  • 服务间解耦

  • 最终一致性

  • 流量削峰

  • 异步消费

MQ 是微服务框架中必不可少的一环,上面的特性是我们日常开发中最常用的。这些特性确实能让系统的稳定性得到增强,同时也让系统的构建出现更多的可能性。

但是是否能让 MQ 来代替 RPC,做服务间的调用?回答这个问题之前,我们再来看看 RPC 是如何工作的。

图片

大概流程(资料节选 dubbogo website[2])

  • 类似本地调用,Client 调用远程服务

  • Client stub 收到调用,把调用方法、参数序列化

  • Client 通过 socket 把消息发送到服务端

  • Server stub 收到消息后,将消息对象反序列化

  • Server stub 根据解码结果调用本地的服务,并将结果返回给 Server stub

  • Server stub 将返回结果序列化,通过 sockets 将消息发送到客户端

  • Client stub 接收到结果消息,对返回消息反序列化

  • 客户端得到最终结果

简单概括下 RPC 调用就是 Client 通过 TCP 调用 Server 的一个函数,得到一个返回结果。

再简单点,是不是可以拆分下面两个过程:

  1. Client 发起一个调用到 Server

  2. Server 返回一个结果到 Client

那么是不是可以用 MQ 模拟这个过程。

图片

当然这个流程并不是我瞎写的,这是 RabbitMQ 的官方教程 Remote procedure call (RPC)[3],有兴趣的可以看文末的参考链接。

RabbitMQ tutorial 这篇文章基本就是 MQ 代替 RPC 的理论支持,所以文章开篇帖子提到的 Java 架构师的方案也不算无的放矢,也不算是错的。

MQ 代替 RPC 的真实情况

正常情况有点规模互联网公司内部都是会有一套 RPC 框架的,要么是基于开源版本的二次开发版本,要么完全自研的,使用过或者维护公司框架的都会被各种问题折磨到死,比如:限流、熔断、重试、服务注册发现、网络问题,SDK 升级等。

如果能用 MQ 代替 RPC 做服务间调用,那是不是只用维护一套 MQ 基础组件就可以了,既减少了人力的配置,又能将问题归纳。

理想很丰满,真相往往却很残酷。

如果你下意识去搜一下:用 MQ 代替 RPC 进行服务间通信,你会发现网上只有寥寥几个 Demo 而已,并没有太多真实实践。

没有太多实践 并不代表没有人在项目中实战过,比如那个 Java 架构师。曾经专门向朋友请教过这个设计,话说某大厂曾经在某个项目做了 MQ 代替 RPC 的实践,但是三个月不到这个项目就被毙了。所以你看不到这个设计方案的缺点:因为很多人不能把失败的案例放出来而已。

简单说下这个方案的缺点吧:

  • 本来 一次 TCP 通信就搞定的事情,用 MQ 后会被拆分成 四*次* TCP,耗时增加不少。

  • 目前 MQ 大部分消费端是 Pull 模型,有一定的耗时成本

  • 服务间调用完全依赖于 MQ 的稳定性。从目前使用 MQ 经验来看,MQ 稳定性的维护成本比 RPC 复杂太多了。如果做异步调用还能容忍出错、延时,做同步调用的话,这些都是不能忽略的问题

  • 如果用 MQ 代替 RPC,那些 RPC 框架做的服务治理的事情,MQ 都需要实现一遍,工作量并没有减少

  • 。。。

现在说一下统一结论:

用 MQ 代替 RPC 只是一种理论,但是高可用无法保障,而且对业务开发来说就更加黑盒了,出现问题就只能干瞪眼了,不建议业务开发实践。

感谢来自京东的架构师H哥,的经常解读。

虽然是一个听上去挺好笑的事儿,但是细究下去为什么不能用MQ完全替代RPC又涉及到MQ、RPC两者的应用场景和特性,希望大家能在看笑话的时候也能收获到相关的技术知识和选项决策。

给网管个星标,第一时间吸我的知识 

趣说技术 | 用MQ 能完全替代 RPC 调用?相关推荐

  1. 开发中的坑:MQ 也能做 RPC 调用?

    hi, 大家好,我是 haohongfan. 最近浏览 帖子[1] 的时候看到一个有意思的吐槽. 大概意思是架构师没有选用 RPC 框架来做服务间调用,而选择用 MQ 来代替.是不是很意外? 当然不出 ...

  2. php 嵌套while循环,PHP/SQL在嵌套while循环中替代db调用

    我的第一篇文章,尽可能地做到尽可能详尽,如果我弄错了某些东西,请提前道歉.我是PHP/SQL的新手,请耐心等待.我发现了几个有关循环内循环的类似问题,但我不确定这些解决方案适用于我的情况.PHP/SQ ...

  3. java调用easyxml接口_【技术教程】如何通过Java程序调用RTSP拉流协议视频平台EasyNVR程序接口?...

    原标题:[技术教程]如何通过Java程序调用RTSP拉流协议视频平台EasyNVR程序接口? RTSP协议视频平台EasyNVR经过多年的积累,已经是一套成熟且完善的视频平台了,用户可以通过网页直接访 ...

  4. 从核心概念和技术层面着眼,系统化认识RPC 2017-09-26 张旭 InfoQ 作者|张旭 编辑|田光 RPC(Remote Procedure Call),即远程过程调用,是一个分布式系统间

    从核心概念和技术层面着眼,系统化认识RPC 转自:https://mp.weixin.qq.com/s/6AX2-zjvcpesSe93HihVoA 2017-09-26  张旭  InfoQ 作者| ...

  5. bilibili go框架_当红语言只认Go!趣头条技术沙龙聚焦Golang应用热点

    4月13日,趣头条联合极客邦科技在上海举办了首届 Go 语言技术沙龙--Golang 在工程实践中的应用.虽然只是一场持续半天的技术沙龙活动,但是现场参会者的参与热情.从沙龙带回的收获与感悟,其意义已 ...

  6. 替代反射调用的几种方式及性能测试

    园子里和这个话题的相关文章比较多,本文是旧话重提,外加个小的总结.主要因为近期看到很多同事.朋友都已经使用 VS2012 进行 .NET 4.5 开发了,却还在大量使用反射,不知道用新的方式.或有所了 ...

  7. ibm mq java 发布订阅,JMS调用IBM MQ 监听模式的点对点模式

    JMS调用IBM MQ 监听方式的点对点模式 前面三篇,第一篇讲了安装IBM MQ时遇到的一些问题.第二篇讲了点对点模式的调用.第三篇讲了发布订阅模式.本篇说一下监听模式. 监听模式只是在消费者端监听 ...

  8. 使用虚拟机自省技术在R0层监控获取进程调用的dll库和dll版本

    一.问题提出 在Windows操作系统中,dll属性查看的版本信息是在R3层获取的,如下图所示,在项目中经常要保证监控获取的透明性,能否在R0层直接获取这些信息? 二.libvmi简介 libvmi是 ...

  9. 【微信技术-微信小程序】------ 小程序调用第三方的url地址页面例如调用:www.pipixia.com/index/index.html的页面

    一,通过微信小程序调用第三方的url地址页面. 1.微信官方文档说明可以支持调用第三方的url地址页面如下:  2.注意事项:(在微信开发工具中测试不用先配置,真正使用需要配置) 1.需要在" ...

最新文章

  1. C#Array(数组) 一维、多维数组
  2. php面向对象及tp框架初识,thinkphp面向对象的问题
  3. Scala教程之:可变和不变集合
  4. HTTP协议中常见请求方法以及一些常见错误代码
  5. iphone手机备忘录迁移_如何在iPhone和iPad上使用语音备忘录
  6. Android OpenGLES2.0(十四)——Obj格式3D模型加载
  7. 错误票据java_【蓝桥杯】错误票据 - osc_bskh1wlw的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. “内心强大的人”依然会被移出首页
  9. PLC系统的选型技巧
  10. CSS的行内样式与内联样式,看完就会了
  11. 使用文档检查器后,think-cell 元素损坏
  12. 【六维空间】即将免费开放注册
  13. Swift游戏实战-跑酷熊猫 14 熊猫打滚
  14. 眨眼网杨莹,能写代码能玩时尚的美女CEO-搜狐
  15. linux 如何清理垃圾文件,清理Linux系统垃圾文件操作方法图文步骤详解
  16. Windows10超级好用的虚拟机
  17. 车联网:基于spark的车辆分析
  18. 学习篇之华为快应用的开发(一)
  19. Nginx页面报错404及解决办法
  20. WebRTC基础实践 - 5.通过RTCPeerConnection传输流媒体视频

热门文章

  1. 20165231 2017-2018-2 《Java程序设计》第8周学习总结
  2. 黑客侵入电子签名供应商DocuSign的数据库 随后向用户发起钓鱼攻击
  3. 33 windows_33_Proc_windows_job 进程,windows作业
  4. OSChina 周二乱弹 ——胸大的烦恼!
  5. chkdsk 和sfc.exe修复命令
  6. 设置内外网互发电子邮件(exchange2010)
  7. [总结]SqlServer中如何实现自动备份数据!
  8. 第一天:认识python
  9. mod_rewrite
  10. Type class-Typeclass-泛型基础上的二次抽象