消息队列(MQ)是一种不同应用程序之间(跨进程)的通信方法,用于上下游应用程序之间传递消息。

基本原理

消息队列(MQ)我们拆分来看:

  • 消息:应用程序通过写入和检索出入列队的数据(消息)来通信。
  • 队列:除去了接收和发送应用程序同时执行的要求。

这样就实现了上游与下游之间的解耦,上游向MQ发送消息,下游从MQ接收消息,上游下游互不依赖,它们只依赖MQ。因为有队列的存在,MQ可在上下游之间进行缓冲,把上游信息先缓存起来,下游根据自己的能力从MQ中拉去信息,起到削峰的作用。

所有的MQ的基本逻辑架构都是如下

我们在设计和实现mq的时候主要要考虑以下的因素

主要的使用场景

可以使用MQ的场景有很多,最常用是业务解耦/最终一致性/广播/错峰削峰流控等。反之,如果需要强一致性,关注业务逻辑的处理结果,则RPC显得更为合适。主要是用来解决异步处理的耗时操作,否则就会增加系统的负载。

对比

目前mq的相关产品可以说是百花齐放,有activemqkafkansqrabbitmqrocketmqemq等,我们对其在支持的功能结合上面设计mq的因素来做一个简单的对比(图片来自网络)。

可见目前比较性能好,使用比较多的就是kafka和阿里云的rocketmq。

这边提一下redis,首先Redis的设计是用来做缓存的,但是由于它自身的某种特性使得他可以用来做消息队列(Redis的List数据结构比较适合做MQ)。它有几个阻塞式的API可以使用,正是这些阻塞式的API让他有做消息队列的能力。 另外做消息队列的其他特性,例如FIFO也很容易实现,只需要一个list对象从头取数据,从尾部塞数据即可实现。 Redis能做消息队列得益于它的list对象blpop brpop接口以及Pub/Sub(发布/订阅)的某些接口。他们都是阻塞版的,所以可以用来做消息队列。