前言
消息中间件是目前互联网项目应用特别广泛的一个中间件,主要用于处理异步操作,系统之间的应用解耦,以及并发下的流量削峰等等应用场景,今天开我们就进入消息中间件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对应的所有队列
-
集群消费:多个Consumer实例平均消费这个Topic对应的所有队列
工作模式如下图所示:
物理部署结构如下图:
RocketMQ的特点?
-
能够保证严格的消息顺序
-
提供丰富的消息拉取模式
-
高效的订阅者水平扩展能力
-
实时的消息订阅机制
-
亿级消息堆积能力
-
较少的依赖
RocketMQ的优势?
-
强调集群无单点,可扩展,任意一点高可用,水平可扩展
-
海量消息堆积能力,消息堆积后,写入低延迟
-
支持上万个队列
-
消息失败重试机制
-
消息可查询
-
开源社区活跃
-
比较成熟稳定,经过阿里多次双十一验证
MQ的简单认识就到这,下节开始我们正式讲解如何玩转RocketMQ,欢迎阅读。