Kafka、RabbitMQ、RocketMQ等消息中间件的对比

Kafka、RabbitMQ、RocketMQ等消息中间件的对比

十二月 17, 2019

消息中间件现在有不少,网上很多文章都对其做过对比,在这我对其做进一步总结与整理。

RocketMQ

阿里系下开源的一款分布式、队列模型的消息中间件,原名Metaq,3.0版本名称改为RocketMQ,是阿里参照kafka设计思想使用java实现的一套mq。同时将阿里系内部多款mq产品(Notify、metaq)进行整合,只维护核心功能,去除了所有其他运行时依赖,保证核心功能最简化,在此基础上配合阿里上述其他开源产品实现不同场景下mq的架构,目前主要多用于订单交易系统。
具有以下特点:

  • 能够保证严格的消息顺序
  • 提供针对消息的过滤功能
  • 提供丰富的消息拉取模式
  • 高效的订阅者水平扩展能力
  • 实时的消息订阅机制
  • 亿级消息堆积能力

官方提供了一些不同于kafka的对比差异:
https://rocketmq.apache.org/docs/motivation/

Kafka

Apache下的一个子项目,使用scala实现的一个高性能分布式Publish/Subscribe消息队列系统,具有以下特性:

  • 快速持久化:通过磁盘顺序读写与零拷贝机制,可以在O(1)的系统开销下进行消息持久化;
  • 高吞吐:在一台普通的服务器上既可以达到10W/s的吞吐速率;
  • 高堆积:支持topic下消费者较长时间离线,消息堆积量大;
  • 完全的分布式系统:Broker、Producer、Consumer都原生自动支持分布式,依赖zookeeper自动实现复杂均衡;
  • 支持Hadoop数据并行加载:对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。

RabbitMQ

RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。

ActiveMQ

Apache下的一个子项目。使用Java完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,少量代码就可以高效地实现高级应用场景。可插拔的传输协议支持,比如:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports。RabbitMQ、ZeroMQ、ActiveMQ均支持常用的多种语言客户端 C++、Java、.Net,、Python、 Php、 Ruby等。

有关测试结论

Kafka的吞吐量高达17.3w/s,不愧是高吞吐量消息中间件的行业老大。这主要取决于它的队列模式保证了写磁盘的过程是线性IO。此时broker磁盘IO已达瓶颈。

RocketMQ也表现不俗,吞吐量在11.6w/s,磁盘IO %util已接近100%。RocketMQ的消息写入内存后即返回ack,由单独的线程专门做刷盘的操作,所有的消息均是顺序写文件。

RabbitMQ的吞吐量5.95w/s,CPU资源消耗较高。它支持AMQP协议,实现非常重量级,为了保证消息的可靠性在吞吐量上做了取舍。我们还做了RabbitMQ在消息持久化场景下的性能测试,吞吐量在2.6w/s左右。

在服务端处理同步发送的性能上,Kafka>RocketMQ>RabbitMQ。

对比了最简单的小消息发送场景,Kafka暂时胜出。但是,作为经受过历次双十一洗礼的RocketMQ,在互联网应用场景中更有它优越的一面。

阿里官网对比

功能 消息队列 RocketMQ ApacheRocketMQ(开源) 消息队列Kafka ApacheKafka(开源) RabbitMQ开源)
安全防护 支持 不支持 支持 不支持 支持
主子账号支持 支持 不支持 支持 不支持 不支持
可靠性 同步刷盘
同步双写
超3份数据副本
99.99999999%
同步刷盘
异步刷盘
同步刷盘
同步双写
超3份数据副本
99.99999999%
异步刷盘,丢数据概率高 同步刷盘
可用性 非常好,99.95%
Always Writable
非常好,99.95%
Always Writable
横向扩展能力 支持平滑扩展
支持百万级 QPS
支持 支持平滑扩展
支持百万级 QPS
支持 集群扩容依赖前端
LVS 负载均衡调度
LVS 负载均衡调度 支持 不支持 支持 不支持 不支持
消费模型 Push / Pull Push / Pull Push / Pull Pull Push / Pull
定时消息 支持(可精确到秒级) 支持(只支持18个固定 Level) 暂不支持 不支持 支持
事务消息 支持 不支持 不支持 不支持 不支持
顺序消息 支持 支持 暂不支持 支持 不支持
全链路消息轨迹 支持 不支持 暂不支持 不支持 不支持
消息堆积能力 百亿级别
不影响性能
百亿级别
不影响性能
百亿级别
不影响性能
影响性能 影响性能
消息堆积查询 支持 支持 支持 不支持 不支持
消息回溯 支持 支持 支持 不支持 不支持
消息重试 支持 支持 暂不支持 不支持 支持
死信队列 支持 支持 不支持 不支持 支持
性能(常规) 非常好
百万级 QPS
非常好
十万级 QPS
非常好
百万级 QPS
非常好
百万级 QPS
非常好
万级 QPS
性能(万级 Topic 场景) 非常好
百万级 QPS
非常好
十万级 QPS
非常好
十万级 QPS
性能(海量消息堆积场景) 非常好
百万级 QPS
非常好
十万级 QPS
非常好
百万级 QPS

对比