咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

MQ产品对比

参考资料:

MQ产品比较-ActiveMQ-RocketMQ

MQ选型对比文档

专访RocketMQ联合创始人:项目思路、技术细节和未来规划

ActiveMQ

Java开发的,Apache的项目,是JMS规范的参考实现,也是Apache旗下的老牌消息服务引擎,在该Apache顶级项目下拥有不少子项目,包括由HornetMQ演变而来的Artemis,基于Scala号称下一代AMQ的Apollo等。

官网介绍:Apollo 是一个更快、更可靠、更容易维护的消息代理,它是由最初的ActiveMQ的基础构建的。它使用一个完全不同的线程和消息调度架构来实现这一点。与ActiveMQ一样,Apollo 是一个多协议代理,支持 STOMP、AMQP、MQTT、Openwire、SSL 和 WebSockets 。

优点:

  1. 客户端语言: Java,C,C++,C#,Ruby,Perl,Python,PHP
  2. 支持协议: JMS,OpenWire,STOMP,XMPP,AMQP
  3. 支持 MQTT (个人比较关注这点)
  4. 支持SpringBoot-Starter( spring-boot-starter-activemq )
  5. 支持集群,负载均衡,事务,持久化
  6. 对Spring的支持,可以很容易内嵌到使用Spring的系统里面去
  7. 支持通过JDBC和journal提供高速的消息持久化
  8. 支持独立部署和嵌入部署

缺点:

  1. 团队重心放到Apollo上去了,目前社区不活跃,且对 5.x 维护较少。
  2. 不适合用于上千个队列的应用场景,并发高容易丢消息。

评价:

ActiveMQ 作为老牌MQ,支持很多协议,很全面,但以 JMS 为主,在很多公司得到了应用,但是更新力度不够。

RabbitMQ

Erlang开发的,是AMQP规范的参考实现,AMQP是一个线路层协议,面面俱到,很系统,也稍显复杂。目前已经成为OpenStack Iaas平台首选的消息服务,其背后的支持力度不言而喻。

优点:

  1. 客户端语言: 支持力度大,覆盖大部分语言。
  2. 支持协议:AMQP , STOMP
  3. 支持 MQTT (RabbitMQ supports MQTT as of 3.0) ,它是以插件的形式支持了MQTT
  4. 支持Spring Boot-Starter (spring-boot-starter-amqp)
  5. Spring Cloud Bus 默认使用它作为中间层。
  6. 支持集群,负载均衡,持久化
  7. 团队和社区支持力度大
  8. 高并发性能好,在互联网公司有较大规模的应用。

缺点:

  1. 集群不支持动态扩展
  2. 不支持嵌入式部署

评价:

很有活力的项目,以 AMQP 协议为主,不断开始兼容其他协议,如MQTT

Kafka

Java开发的,也是Apache的项目,最初被设计用来做日志处理,是一个不折不扣的大数据通道,追求高吞吐,存在丢消息的可能。

优点:

  1. Spring Cloud Bus 中间层的第二选择。
  2. 并发高,吞吐量大

缺点:

  1. 很多东西不支持

评价:

比较适合用于日志。

RocketMQ

Java开发的,阿里开发,后来捐给了Apache。天生为金融互联网领域而生,追求高可靠、高可用、高并发、低延迟。

优点:

  1. 高可靠、高可用、高并发、低延迟,支持上万个队列。
  2. 理论上不会丢失消息

缺点:

  1. 阿里自己实现的一套协议。
  2. 还没有支持 Spring Boot-Starter

评价:

如果单纯使用MQ,并且很注重消息的丢失,没有其他协议的兼容问题,可以支持一下国产软件。

Mosquitto

C语言开发的轻量级开源MQTT Broker,实现了MQTT协议版本3.1和3.1.1。可以说是MQTT协议坚定的执行者,现在已经是eclipse的项目。

Mosquitto不太属于此文讨论的MQ产品,但有些MQ产品也支持MQTT ,我觉得Mosquitto应该数最好的MQTT Broker了,也比较一下吧。

优点:

  1. 专注于做MQTT协议
  2. 轻量级

缺点:

  1. 客户端只有C库
  2. 无管理界面(轻量级嘛)

评价:

单纯做MQTT Broker的话,这是首选。RabbitMQ 和 ActiveMQ都是已插件的方式支持MQTT协议。另外Mosquitto这个项目提供的C库libmosquitto很适合嵌入式设备。

我的选型

  1. 开发语言 Java
  2. 框架 Spring Boot ,Spring Cloud
  3. 要用到 订阅/发布模式 (所有MQ产品都支持) 和 MQTT
  4. 将来可能会使用到 Spring Cloud Bus
  5. 并发要求不是特别高

结果:RabbitMQ 优先,ActiveMQ随后。