任务队列,消息队列和rpc的区别是什么?

首先,这几个概念本就不是同一层次上的东西,本身风马牛不相及。

RPC

RPC通常指的是PRC框架(分布式框架),或者PRC协议,如GRPC,JSON-RPC等。这类框架主要解决远程通信间的问题,所以底层的通信机制是不需要使用者去关心去实现就能很好实现远程通信的,最出名的莫过于阿里的dubbo。

任务队列

这是个逻辑概念,即比如饭店高峰期时,顾客单子不得不按照下单顺序一个个放在厨房,进行先后炒菜处理,这一堆的单子就是任务队列。

消息队列

消息队列(MQ)可以理解成两个应用程序间(生产者消费者间)的通信,例如短信发送模块,因为模块的发送速度跟不上,这时候需要有一个容器,暂存一下,缓解下压力,那么“消息队列”就是在消息的传输过程中保存消息的“容器”。然后短信模块就可以从容不怕的去消息队列取出要发出的短信内容,进行发送处理。

在工作中,任务队列,消息队列和rpc都是常用的实践方案,但是这三者解决的问题似乎没有什么相关性。如:任务队列往往是需要大规模处理业务逻辑时,将相关的任务入队列,进行异步调用,从而解决任务阻塞的问题;消息队列是异构系统(或者说系统)之间异步通信的一种方法,主要是用来解决系统间信息同步问题的;而rpc是一种远程调用方式,是在代码的实现层面异步调用外部服务用的。就这种描述来看,三者之间的确没有什么瓜葛。

但是出于好奇,我在网上搜索了这个问题,发现知乎有相同的问题,并且有大神【灵剑】给出了比较专业的答案,我将其答案描述如下。

任务队列、消息队列、rpc是不同层次上的东西,任务队列是逻辑模型,消息队列是通信模型,RPC是包含了通信模型的编程模型(或者框架)。

消息队列(MQ)是一种能实现生产者到消费者单向通信的通信模型,一般来说是指实现这个模型的中间件,比如RabbitMQ。它可以是一个产品,或者是操作系统提供的一种服务之类。

RPC一般来说是具体指某一种RPC编程框架或协议,如JSON-RPC、GRPC等,它自己有一整套通信的规范,而在此之上实现什么功能是可以定制的。对于RPC来说,调用方不太关心底层的通信机制,只关心它能实现远程调用这一点;框架则不太关心上面承载的究竟是怎样的应用,只负责将调用过程发送到执行端,并将结果回传。

任务队列则是个逻辑上的概念,即将抽象的任务发送到执行的worker的组件,有的时候包含了后端的worker,有的时候不包含,并没有什么具体的形式,也没有什么规范。

这三者并没有特别大的联系,但也不一定是完全不同的东西,比如说RPC可以通过MQ来实现,而任务队列可以通过MQ实现,也可以利用RPC实现,底层可能都是相同的东西,但是因为暴露出了不同性质的接口所以也换了不同的名字。以上的区分也不绝对,很多情况下只是怎么方便就怎么叫。

任务队列是逻辑模型,消息队列是通信模型,RPC是包含了通信模型的编程模型(或者框架),概念清晰,很有概括性,这个答案值得读,也值得了解和学习。尤其是底层的东西可能是相同的,但是封装之后对于提供的接口和功能起不同的名字,更是软件开发中的普遍现象。

发表评论