针对消息中间件的选择能够从如下方面进行考虑:(主要对比ActiveMQ和RocketMQ)php
优先级:咱们的项目对此需求不是特别明显,RocketMQ须要新建一个特殊队列来接收优先级高的队列,没法实现从0-65535这种细粒度的控制,ActiveMQ能够精细控制java
顺序:咱们的消息总线中的消息应该都是无状态的,因此对消息的处理顺序没有严格的要求,若是有特殊要求的话能够在业务层进行控制,activeMQ没法保证严格的顺序,RocketMQ能够保证严格的消费顺序python
持久化:都支持数据库
稳定性:RoketMQ在稳定性上可能更值得信赖,支持多种集群方案,毕竟已经撑过几个双十一缓存
消息过滤:ActiveMQ仅支持在客户端消费的时候进行判断是不是本身须要的消息,RocketMQ能够在broker端进行过滤,对于咱们的消息总线,这里能够节省大量的网络传输是否会有消息重发形成的重复消费:RocketMQ能够保证,ActiveMQ没法保证网络
回溯消费:即从新将某一个时刻以前的消息从新消费一遍,咱们对于这种需求应该不多,RocketMQ支持,ActiveMQ不支持(RocketMQ的队列是持久化到硬盘的,按期进行清除并发
事务:都支持负载均衡
定时消费:RocketMQ支持分布式
消息堆积:就是当缓存消息的内存满了以后的解决方案,一种是丢弃策略,这种不会影响吞吐量,还有一种就是将消息持久化到磁盘,这种会影响吞吐量,在评估影响程度上,RocketMQ的成绩稍微好一点性能
客户端不在线:RocketMQ能够在客户端上线后继续将未消费的消息推送到客户端
目前比较活跃的几种MQ中间件产品的对好比下:(仅统计开源的项目)
ActiveMQ | RabbitMQ | RocketMq | ZeroMQ | |
---|---|---|---|---|
关注度 | 高 | 高 | 中 | 中 |
成熟度 | 成熟 | 成熟 | 比较成熟 | 不成熟 |
所属社区/公司 | Apache | Mozilla Public License | Alibaba | |
社区活跃度 | 高 | 高 | 中 | 低 |
文档 | 多 | 多 | 中 | 中 |
特色 | 功能齐全,被大量开源项目使用 | 因为Erlang 语言的并发能力,性能很好 | 各个环节分布式扩展设计,主从 HA;支持上万个队列;多种消费模式;性能很好 | 低延时,高性能,最高 43万条消息每秒 |
受权方式 | 开源 | 开源 | 开源 | 开源 |
开发语言 | Java | Erlang | Java | C |
支持的协议 | OpenWire、STOMP、REST、XMPP、AMQP | AMQP | 本身定义的一套(社区提供JMS–不成熟) | TCP、UDP |
客户端支持语言 | Java、C、C++、Python、PHP、Perl、.net 等 | Java、C、C++、Python、 PHP、Perl 等 | Java C++(不成熟) | python、 java、 php、.net 等 |
持久化 | 内存、文件、数据库 | 内存、文件 | 磁盘文件 | 在消息发送端保存 |
事务 | 支持 | 支持 | 支持 | 不支持 |
集群 | 支持 | 支持 | 支持 | 不支持 |
负载均衡 | 支持 | 支持 | 支持 | 不支持 |
管理界面 | 通常 | 好 | 好 | 无 |
部署方式 | 独立、嵌入 | 独立 | 独立 | 独立 |
评价 | 优势:成熟的产品,已经在不少公司获得应用(非大规模场景)。有较多的文档。各类协议支持较好,有多重语言的成熟的客户端;缺点:根据其余用户反馈,会出莫名其妙的问题,切会丢失消息。 其重心放到activemq6.0 产品—apollo 上去了,目前社区不活跃,且对 5.x 维护较少;Activemq 不适合用于上千个队列的应用场景 | 优势: 因为erlang语言的特性,mq 性能较好;管理界面较丰富,在互联网公司也有较大规模的应用;支持amqp系诶,有多中语言且支持 amqp 的客户端可用缺点:erlang语言难度较大。集群不支持动态扩展。 | 优势:模型简单,接口易用(JMS 的接口不少场合并不太实用)。在阿里大规模应用。目前支付宝中的余额宝等新兴产品均使用rocketmq。集群规模大概在50 台左右,单日处理消息上百亿;性能很是好,能够大量堆积消息在broker 中;支持多种消费,包括集群消费、广播消费等。开发度较活跃,版本更新很快。缺点:没有在 mq 核心中去实现JMS 等接口 |