RPC和MQ的区别
- 同步调用:对于要立即等待返回处理结果的场景,RPC是首选。
- MQ 的使用:
- 一方面是基于性能的考虑,比如服务端不能快速的响应客户端(或客户端也不要求实时响应),需要在队列里缓存。
- 另外一方面,它更侧重数据的传输,因此方式更加多样化,除了点对点外,还有订阅发布等功能。
- 随着业务增长,有的处理端处理量会成为瓶颈,会进行同步调用改造为异步调用,这个时候可以考虑使用MQ。
RPC和MQ分别的适用场景
- RPC比较适合–调用需要立即得到返回结果
比如在一个ERP系统中,有一个管理仓储的微服务,以及一个负责订单的微服务。新建订单时需要查知当前的存货是否充足,如果不充足就通知用户;提交订单时预订指定数量的货物,如果此时货物不错,也要终止订单的提交,并通知用户。显然在这种场景下是不允许较大的延迟,否则会影响用户体验。所以应该使用RPC,及时返回仓储情况。
- MQ比较适合的场景
在一个由多个微服务构成的大系统中,会有一些非关键服务,用来执行一些不需要立刻得到结果的计算。而且它们的计算结果并不会返回给消息的发送者。这个时候就应该使用MQ。
比如在一个ERP系统中有一些日志服务、业务监控服务等。这些服务会发布一些系统事件,针对这些事件可能有多个应用关注。对于日志服务,当系统出现某些异常情况时需要浏览日志,查找问题的根源;也可以在分析系统运行的瓶颈时提供关键数据。对于业务监控系统,例如货物入仓出仓的消息,可以被报表系统关注,生成报表;也可以被配货系统关注,及时补足所需库存。
RPC的调用过程
1、建立通信
首先要解决通讯的问题:即A机器想要调用B机器,首先得建立起通信连接,主要是通过在客户端和服务器之间建立TCP连接。
2、服务寻址
要解决寻址的问题,A服务器上如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称是什么。
3、网络传输
- 序列化
当A服务器上的应用发起一个RPC调用时,调用方法和参数数据都需要先进行序列化。 - 反序列化
当B服务器接收到A服务器的请求之后,又需要对接收到的参数等信息进行反序列化操作。
4、服务调用
B服务器进行本地调用(通过代理Proxy)之后得到了返回值,此时还需要再把返回值发送回A服务器,同样也需要经过序列化操作,然后再经过网络传输将二进制数据发送回A服务器。