概述
消息队列(MessageQueue,MQ)是分布式系统中的重要组件。主要是用于解决异步、解耦、削峰等问题,通过高效可靠的消息传递机制进行平台无关的数据交流,可以在分布式环境下扩展进程间的通信,基于数据通信来进行分布式系统的集成,以实现高性能、高可用、可伸缩和最终一致性架构。
特性
- 先进先出
消息队列本质上还是一个队列,而队列是一种先进先出(FIFO)的数据结构,消息由生产者发送到消息队列进行排队,然后按进队列的的顺序由消息的消费者依次取出处理(QQ/微信就是典型的消息队列)。
- 持久化
消息队列能像数据库一样将储存核心数据。
- 分布式
消息队列的定位就是一个高性能中间件,可以在分布式环境下扩展进程间的通信,通过高效可靠的消息传递机制进行平台无关的数据交流。
主要作用
-
异步
- 栗子:快递员发快递,一定要找到客户面对面送货效率会很低,引用快递驿站后,快递员只需要把快递放到驿站,就可以继续发其他快递去了,客户自行安排时间去驿站取快递。
- 作用:异步能提高系统的响应速度、吞吐量。
- 也可以使用Future实现(Java中)
-
解耦(高内聚【对外界的依赖低】,低耦合)
-
栗子:快递员发快递,一定要找到客户面对面送货就一定要等到双方都有空才能完成投递操作,既依赖于用户是否有时间,也依赖于快递员是否有时间,引用快递驿站后,快递员只需要把快递放到驿站,就可以继续发其他快递去了,客户自行安排时间去驿站取快递。
-
作用:
- 服务之间进行解耦,才可以减少服务之间的影响,提高系统整体的稳定性以及可扩展性。
- 另外,解耦后可以实现数据分发。生产者发送一个消息后,可以由一个或者多个消费者进行消费,并且消费者的增加或者减少对生产者没有影响。
-
-
削峰(流量,时间换空间)
- 栗子:虽然长江每年都会涨水,但是下游出水口的速度是基本稳定的,就是因为引入大坝后,可以把水储存起来,下游慢慢排水。
- 作用:以稳定的系统资源应对突发的流量冲击(以免系统崩溃,避免使用限流的方式先把数据圈住)
缺点
- 系统可用性降低
系统引入的外部依赖增多(如果消息队列突然消失。。。),系统的稳定性就会变差,一旦消息队列宕机,对业务会产生巨大影响(考虑如何保证MQ的高可用)。
- 系统复杂度提高
引入消息队列后系统的复杂度会大大提高,数据的链路就会变得更加复杂,还会带来如消息重复、消息乱序等一系列问题。
- 消息一致性问题
一个系统处理完业务,通过消息队列发送消息给另一个系统进行后续的业务处理,如果一个系统处理成功,;另一个系统处理失败怎么办?(考虑如何保证消息数据处理的一致性)
通讯模式
- 点对点模式
(RabbitMQ)
只能消费一次,消费完就没了,是最传统和常见的通讯方式,支持一对一、多对一、多对多、网状等多种拓扑结构。
- 发布/订阅模式(类似广播📢)
被订阅者同时消费,发布/订阅功能使得发送者和接收者之间的耦合关系变得更为松散(解耦合),发送者不必关心接收者是谁,而接收者也不必关心消息是从哪里发出的,而只是根据消息的主题进行消息的收发。
- 集群(Cluster)
(Kafka、RocketMQ)
消费者可以组成一个一个的集群(也可以理解为分组),一个集群消费不会影响别的集群再次消费(每个集群只会消费一次),是高可用的体现(可以使用集群模拟广播)。
常见消费队列概述
RabbitMQ
官方地址


RabbitMQ 是部署最广泛的开源消息代理,拥有数万名用户,是最受欢迎的开源消息代理之一,使用erlang语言开发,是高级消息队列协议AMQP的标准实现,RabbitMQ 是轻量级的,易于在本地和云中部署,它支持多种消息传递协议和流媒体。RabbitMQ可以部署在分布式和联合配置中,以满足高规模、高可用性的需求。
特性
-
性能极好,延时很低(使用erlang语言开发+推模型)
- 推模型延时可以达到微秒级,但是实现比较复杂
- 拉模型延时一般在毫秒级
-
功能完备,吞吐量到万级
-
开源界面优秀 + 社区活跃 = 好用
Kafka
官方地址:

Kafka

主题一旦多,性能急剧下降
RocketMQ
官方地址:

RocketMQ是阿里开源的消息中间件,纯Java开发,高吞吐,高性能,高可用,功能全面,适合大规模分布式系统应用。 起源于Kafka,但是相比较Kafka更注重性能,RocketMQ侧重于MQ功能的完善,它对消息的可靠传输以及事务性方面做了优化,目前广泛用于交易充值、流计算、消息推送等场景(阿里双十一用的就是RocketMQ)。
特性
常见消息队列的比较
常用的MQ产品包括Kafka、RabbitMQ和RocketMQ。我们对这三个产品做下简单的比较,重点需要理解他们的适用场景。
优点 | 缺点 | 适用场景 | ||
---|---|---|---|---|
kafka | 单线程,不重试 | 吞吐量非常大,性能非常好,集群高可用 | 会丢数据,功能比较单一 | 日志分析,大数据采集 |
RabbitMQ | 多线程 | 消息可靠性高,功能全面 | 吞吐量比较低,消息积累会影响性能,erlang语言不好控制 | 小规模场景 |
RocketMQ | 多线程 | 高吞吐,高性能,高可用,功能全面 | 开源版功能不如云上版,官方文档比较简单,客户端只支持Java | 几乎全场景 |
RabbitMQ集群支持性不太好,需要自己搭建
关于RabbitMQ的更多功能特性,可以在官网( www.rabbitmq.com/ )