消息队列是什么,或者说什么是消息队列、你用过哪些消息队列,几乎是在求职面试中经常问到的问题,我自己也经常问面试者这个问题,简单说消息队列是一个能先进先出且存储消息的容器。
基本组成部分
基本的消息队列主要有生产者(Producer)、代理(Broker)、消费者(Consumer)组成。
- 生产者:消息的产生者,消息的调用端,主要负责消息具体承载的信息的实例化,具体一个队列的发起方
- 代理:队列的大脑,主要的处理单元,负责消息的存储、投递、及各种队列附加功能的实现,是消息队列最核心的组成部分
- 消费者:一个消息队列的终端,也是消息的调用端,具体是根据消费的消息承载的信息,处理各种业务业务逻辑
目前市场上常用的MQ中间件基本上都是基于这3个主要的基础组件扩展而成的,尤其是扩展代理,比如延迟队列、主题 等等
使用场景
消息队列使用的场景非常多,常见的有异步处理、应用解耦、流量削峰等等
- 异步处理
异步处理主要应用于对实时性要求不严格的场景,比如:用户注册发送验证码、下单通知、发送优惠券等等。A服务只需要把协商好的消息发送到消息队列,剩下的有消费消息的服务去处理就好,不用等待消费服务返回结果。
- 应用解耦
应用解耦可以看作是把相关但耦合度不高的系统联系起来,比如,订单系统与WMS、EHR系统,有关联但又不是哪么紧密,每个系统之间只需要把约定的消息发送到MQ,另外的系统去消费即可,同时也解决了各个系统可以采用不同的架构、语言来实现,极大的增加了整个大系统的灵活性。
- 流量削峰
流量削峰一般应用在大流量入口且短时间内业务需求处理不完的服务中心,为了权衡高可用,把大量的并行任务发送到MQ中,依据MQ的存储及分发功能,平稳的处理后续的业务,起到一个大流量缓冲的作用。
常见消息队列
目前常见的消息队列有ActiveMQ、RabbitMQ、Kafka、RocketMQ。但真正项目中使用的是后3种,ActiveMQ在实际的项目中并不常用,一般作为教程了解原理还是不错的。另外要说明的是下列对比的表格并不完整,比如:RabbitMQ支持死信队列,RocketMQ支持事务消息,还有跟Kafka对标的的Pulsar,并没有列出,想具体了解每个MQ,建议针去查看官方资料。
特性 |
ActiveMQ |
RabbitMQ |
Kafka |
RocketMQ |
PRODUCER-COMSUMER |
支持 |
支持 |
支持 |
支持 |
PUBLISH-SUBSCRIBE |
支持 |
支持 |
支持 |
支持 |
REQUEST-REPLY |
支持 |
支持 |
- |
支持 |
API完备性 |
高 |
高 |
高 |
低(静态配置) |
多语言支持 |
支持,JAVA优先 |
语言无关 |
支持,JAVA优先 |
支持 |
单机呑吐量 |
万级 |
万级 |
十万级 |
单机万级 |
消息延迟 |
- |
微秒级 |
毫秒级 |
- |
可用性 |
高(主从) |
高(主从) |
非常高(分布式) |
高 |
消息丢失 |
- |
低 |
理论上不会丢失 |
- |
消息重复 |
- |
可控制 |
理论上会有重复 |
- |
文档的完备性 |
高 |
高 |
高 |
中 |
提供快速入门 |
有 |
有 |
有 |
无 |
首次部署难度 |
- |
低 |
中 |
高 |
总结
在现在的项目中,不管是TO C还是TO B ,消息队列(MQ)几乎是标配的中间件,建议在熟悉原理的基础上,并能清楚每种消息中间件的不同点,这样才能根据业务需求的场景更有效的采用合适的中间件。知识的积累在于沉淀,我们共同进步,做新时代的农民工。