本文将从多个维度综合对比Kafka、RabbitMQ、RocketMQ、ActiveMQ这4款当前最主流的MQ消息中间件产品,希望能为您的下一次产品的架构设计和MQ消息中间件选型提供参考依据。

特点RabbitMQActiveMQKafkaRocketMQ
资料文档资料数量多资料数量多资料数量中等资料数量少,建议去官网上看
开发语言ErlangJavaScalaJava
支持的协议AMQPOpenWire、STOMP、REST、XMPP、AMQP自己定义的一套…(基于TCP)自己定义的一套…
消息存储内存、磁盘。支持少量堆积内存、磁盘、数据库。支持少量堆积。内存、磁盘、数据库。支持大量堆积磁盘。支持大量堆积。

消息事务

支持。客户端将信道设置为事务模式,只有当消息被RabbitMQ接收,事务才能提交成功,否则在捕获异常后进行回滚。使用事务会使得性能有所下降支持支持支持
负载均衡负载均衡的支持不好支持负载均衡。基于zookeeper实现负载均衡。支持支持
集群方式支持简单集群,'复制'模式,对高级集群模式支持不好。支持简单集群模式,比如'主-备',对高级集群模式支持不好。天然的‘Leader-Slave’无状态集群,每台服务器既是Master也是Slave。常用 多对'Master-Slave' 模式,开源版本需手动切换Slave变成Master。
管理界面一般一般有管理后台, 但不是项目里自带, 需要自己启动一个单独的管理后台实例
可用性高(主从)高(主从)非常高(分布式)非常高(分布式)
消息重复支持at least once、at most once支持at least once支持at least once、at most once支持at least once
吞吐量(TPS)比较大比较大极大。Kafka按批次发送消息和消费消息。发送端将多个小消息合并,批量发向Broker,消费端每次取出一个批次的消息批量处理。大。RocketMQ接收端可以批量消费消息,可以配置每次消费的消息数,但是发送端不是批量发送。
顺序消息不支持不支持支持
 
支持
消息回溯不支持不支持支持指定分区offset位置的回溯支持指定分区offset位置的回溯
消息重试不支持,但是可以利用消息确认机制实现。不支持不支持,但是可以利用消息确认机制实现支持
并发度并发度极高。本身是用Erlang语言写的,并发性能高。并发度高并发度高并发度高。

综上对比:从各个维度对目前主流的MQ进行,以及目前的使用情况来看,针对日志的较大的场景,建议使用Kafka,就并发和消息的堆积能力来说,这方面kafka是最优秀的,ActivitMQ,和rabbitMQ作为老牌MQ,由于入场时间较早,已经占领了较大的市场,市场占有率较高,但由于实现的语言比较小众,扩展方面存在一定的短板;RocketMQ作为国产的MQ,且开源时间较晚,高并发情况下有很不错的性能表现,特别是在多个topic的情况下,性能依旧非常稳定,且支持已上绝大多数的特性,特别是用java开发,所以有比较好的扩展性,是一个不错的选择,后续的关于MQ的文章也是基于RocketMQ来写。

 

 

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐