RPC和MQ消息队列在分布式场景占据了非常重要的地位,具体两者有什么核心区别,各自的应用场景是怎样的呢?
今天分享RPC和MQ的4大核心区别,我先从MQ谈起@mikechen
消息队列(Message Queue,简称MQ),指保存消息的一个容器,本质是个队列。
消息(Message)是指在应用之间传送的数据,消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。
下图便是消息队列的基本模型,向消息队列中存放数据的叫做生产者,从消息队列中获取数据的叫做消费者。
RabbitMQ、RocketMQ、Kafka等
1.异步处理
消息队列的主要特点是异步处理,主要目的是减少请求响应时间,实现非核心流程异步化,提高系统响应性能。
举一个用户注册的例子,用户注册成功后,系统需要发送注短信注册成功通知,以及赠送注册成功的积分。
1)同步
同步的总耗时:10ms+100ms+100ms=210ms
由于短信通知与增加积分为非核心流程,为了提升系统响应性能,从而我把它改造为异步。
2)异步
改造后就变成上图,之前需要等用户注册10ms+短信通知100ms+增加积分100ms才能返回,现在把短信通知和增加积分改为异步的形式,用户注册后写入消息10ms左右立即返回成功给客户端,无需等待耗时较久的同步(短信+积分)就可以返回,从而极大的提升了系统的吞吐量。
所以异步的典型场景就是将比较耗时而且不需要即时(同步)返回结果的操作,通过消息队列来实现异步化。
2.应用解耦
使用了消息队列后,只要保证消息格式不变,消息的发送方和接收方并不需要彼此联系,也不需要受对方的影响,即解耦。
每个成员不必受其他成员影响,可以更独立自主,只通过消息队列MQ来联系,典型的上下游解耦如下图所示:
3.流量削锋
流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。
这种场景中系统的峰值流量往往集中于一小段时间内,所以为了防止系统在短时间内的峰值流量冲垮,往往采用消息队列来削弱峰值流量,相当于消息队列做了一次缓冲。
RPC,即Remote Procedure Call,翻译过来就是远程过程调用,主要解决远程网络通信间的问题。
知名度较高的有gRPC(Google)、Thrift(Facebook )、Dubbo(阿里)。
RPC的一般需要经历4个步骤:
1、建立通信
首先要解决通讯的问题:即A机器想要调用B机器,首先得建立起通信连接。
主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输,连接可以是长连接,多个远程过程调用共享同一个连接。
2、服务寻址
要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么。
3、网络传输
1)序列化
网络协议是基于二进制的,所有我们传输的参数数据都需要先进行序列化Serialize。
2)反序列化
对接收到的参数等信息进行反序列化操作,也就是序列化的逆操作。
4、服务调用
B服务器进行本地调用:主要是通过代理Proxy之后得到了返回值,此时还需要经过序列化操作,然后再经过网络传输将二进制数据发送回A服务器。
通常,一次完整的PRC调用需要经历如上4个步骤。
1.架构区别
RPC和MQ的差异点是,Message有一个中间结点Message Queue,可以把消息存储。
2.调用区别
对于要立即返回处理结果的同步场景,RPC首选。
3.功能区别
MQ一方面是基于性能的考虑,比如服务端不能快速的响应客户端(或客户端也不要求实时响应),需要在队列里缓存。
另外一方面,MQ更侧重数据的传输,因此方式更加多样化,除了点对点外,还有订阅发布等功能。
4.性能区别
随着业务增长,有的处理端处理量会成为瓶颈,会进行同步调用改造为异步调用,这个时候可以优先考虑使用MQ。
以上是就是RPC和MQ消息队列的区别介绍,更多分布式架构系列、Dubbo等微服务系列等等,请查看以下文章:
联系客服