前言
消息中间件是目前互联网项目应用特别广泛的一个中间件,主要用于处理异步操作,系统之间的应用解耦,以及并发下的流量削峰等等应用场景,今天开我们就进入消息中间件MQ的讲解,主流的MQ有很多,我们只需要掌握其中一种就可以了,基本都大同小异,OK,正式开始今天的MQ之旅。

什么是MQ?
MQ(Message Queue)消息队列,是一种应用程序之间通信的方式,可以理解为一个存放消息的队列,生产者负责生产消息,并将生产的消息存放入队列中,消费者负责从队列中获取对应的消息进行消费,生产者无需关心消息是否被消费,只需要关心是否将消息正确的存入队列即可,同样消费者也无需关心消息从哪生产或者说消息是否生产成功,只需要正确的处理消息即可,以这样一种方式实现了生产者和消费者之间的完全解耦。


MQ有什么作用?
异步:可以将某些业务逻辑,进行异步处理,加快用户响应时间
解耦:可以将某些业务逻辑拆分,通过MQ进行多个系统之间业务解耦

流量削峰:在并发情况下,可以将瞬间流量访问写入MQ,然后开启多个消费者处理消息,达到减压削峰的效果

日志处理:日志收集直接写入消息队列,消费者端订阅消费处理日志,生成可视化监控数据


主流的MQ有哪些?
主流的MQ有很多,网上的总结对比也有很多在,这里我就你不去一一列举了,下面列几个业界比较火的MQ简单对比下:
特性
ActiveMQ
RabbitMQ
RocketMQ
Kafka
API完备性
高
高
高
高
多语言支持
支持
支持
JAVA
支持
单机吞吐量
万级
万级
万级
十万级
消息延迟
毫秒
微秒
毫秒
毫秒
可用性
高(主从)
高(主从)
非常高(分布式)
非常高(分布式)
消息丢失
低
低
理论上不会
理论上不会
文档完备性
高
高
高
高
社区活跃度
高
高
中
高
成熟度
成熟
成熟
比较成熟
成熟
集群
支持
支持
支持
支持
负载均衡
支持
支持
支持
支持
特点
功能齐全、被大量开源项目使用
Erlang语言开发,性能很好
各环节分布式扩展设计,主从HA,支持上万个队列,性能很好
吞吐量很高
评价
优点:成熟的产品,已经在很多公司得到应用,各种协议支持较好,有多种语言成熟的客户端。
缺点:会出一些莫名其妙的问题,会丢消息,笔试和上千队列,目前社区活跃度不高,5.X后维护较少。
优点:由于erlang语言的特性,性能很好,管理界面较为丰富,在互联网公司都有较大规模的应用。
缺点:erlang语言难度大,不支持动态扩展
优点:模型简单,接口易用,阿里内部大规模成功应用。
缺点:产品较新,文档比较缺乏,没有实现JMS接口规范
日志领域应用广泛

RocketMQ是什么?
RocketMQ是一款分布式、队列模型的消息中间件,天生自带分布式,负载(这里后面会介绍),生产者Producer和消费者Consumer以及队列都可以分布式,Producer向队列轮流发送消息,队列的集合称为主题Topic,Consumer有2种消费模式:
集群消费:多个Consumer实例平均消费这个Topic对应的所有队列
工作模式如下图所示:

物理部署结构如下图:


RocketMQ的特点?
较少的依赖
提供丰富的消息拉取模式
实时的消息订阅机制
较少的依赖

RocketMQ的优势?
海量消息堆积能力,消息堆积后,写入低延迟
消息失败重试机制
开源社区活跃
MQ的简单认识就到这,下节开始我们正式讲解如何玩转RocketMQ,欢迎阅读,让我们一起沉浸在MQ的世界里!!!

原文始发于微信公众号(Justin的后端书架):