参考资料:
ActiveMQ
Java开发的,Apache的项目,是JMS规范的参考实现,也是Apache旗下的老牌消息服务引擎,在该Apache顶级项目下拥有不少子项目,包括由HornetMQ演变而来的Artemis,基于Scala号称下一代AMQ的Apollo
等。
官网介绍:Apollo 是一个更快、更可靠、更容易维护的消息代理,它是由最初的ActiveMQ的基础构建的。它使用一个完全不同的线程和消息调度架构来实现这一点。与ActiveMQ一样,Apollo 是一个多协议代理,支持 STOMP、AMQP、MQTT、Openwire、SSL 和 WebSockets 。
优点:
- 客户端语言: Java,C,C++,C#,Ruby,Perl,Python,PHP
- 支持协议:
JMS
,OpenWire
,STOMP
,XMPP
,AMQP
- 支持
MQTT
(个人比较关注这点) - 支持SpringBoot-Starter(
spring-boot-starter-activemq
) - 支持集群,负载均衡,事务,持久化
- 对Spring的支持,可以很容易内嵌到使用Spring的系统里面去
- 支持通过JDBC和journal提供高速的消息持久化
- 支持独立部署和嵌入部署
缺点:
- 团队重心放到
Apollo
上去了,目前社区不活跃,且对 5.x 维护较少。 - 不适合用于上千个队列的应用场景,并发高容易丢消息。
评价:
ActiveMQ 作为老牌MQ,支持很多协议,很全面,但以 JMS
为主,在很多公司得到了应用,但是更新力度不够。
RabbitMQ
Erlang开发的,是AMQP规范的参考实现,AMQP是一个线路层协议,面面俱到,很系统,也稍显复杂。目前已经成为OpenStack Iaas平台首选的消息服务,其背后的支持力度不言而喻。
优点:
- 客户端语言: 支持力度大,覆盖大部分语言。
- 支持协议:
AMQP
,STOMP
- 支持
MQTT
(RabbitMQ supports MQTT as of 3.0
) ,它是以插件的形式支持了MQTT
。 - 支持Spring Boot-Starter (
spring-boot-starter-amqp
) - Spring Cloud Bus 默认使用它作为中间层。
- 支持集群,负载均衡,持久化
- 团队和社区支持力度大
- 高并发性能好,在互联网公司有较大规模的应用。
缺点:
- 集群不支持动态扩展
- 不支持嵌入式部署
评价:
很有活力的项目,以 AMQP
协议为主,不断开始兼容其他协议,如MQTT
。
Kafka
Java开发的,也是Apache的项目,最初被设计用来做日志处理,是一个不折不扣的大数据通道,追求高吞吐,存在丢消息的可能。
优点:
- Spring Cloud Bus 中间层的第二选择。
- 并发高,吞吐量大
缺点:
- 很多东西不支持
评价:
比较适合用于日志。
RocketMQ
Java开发的,阿里开发,后来捐给了Apache。天生为金融互联网领域而生,追求高可靠、高可用、高并发、低延迟。
优点:
- 高可靠、高可用、高并发、低延迟,支持上万个队列。
- 理论上不会丢失消息
缺点:
- 阿里自己实现的一套协议。
- 还没有支持 Spring Boot-Starter
评价:
如果单纯使用MQ,并且很注重消息的丢失,没有其他协议的兼容问题,可以支持一下国产软件。
Mosquitto
C语言开发的轻量级开源MQTT Broker,实现了MQTT协议版本3.1和3.1.1。可以说是MQTT协议坚定的执行者,现在已经是eclipse的项目。
Mosquitto不太属于此文讨论的MQ产品,但有些MQ产品也支持MQTT ,我觉得Mosquitto应该数最好的MQTT Broker了,也比较一下吧。
优点:
- 专注于做MQTT协议
- 轻量级
缺点:
- 客户端只有C库
- 无管理界面(轻量级嘛)
评价:
单纯做MQTT Broker的话,这是首选。RabbitMQ 和 ActiveMQ都是已插件的方式支持MQTT协议。另外Mosquitto这个项目提供的C库libmosquitto很适合嵌入式设备。
我的选型
- 开发语言 Java
- 框架 Spring Boot ,Spring Cloud
- 要用到
订阅/发布模式
(所有MQ产品都支持) 和 MQTT - 将来可能会使用到 Spring Cloud Bus
- 并发要求不是特别高
结果:RabbitMQ 优先,ActiveMQ随后。