比较对象:RabbitMQ、RocketMQ、Kafka

对于网上的那些对比表格个人认为混淆性太大,有的过时了!所以参考以下回答做出个人的理解

三方回答

华为云官方

image.pngimage.png

Kafka采用拉取(Pull)方式消费消息,吞吐量相对更高,适用于海量数据收集与传递场景,例如日志采集和集中分析。 RabbitMQ在吞吐量方面略有逊色,但支持更多的消息队列功能。 RocketMQ出自 阿里公司的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进。在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景。 以下从性能、数据可靠性、服务可用性、功能等方面给出具体的对比分析,供用户选型参考。

性能

消息中间件的性能主要衡量吞吐量,Kafka的吞吐量比RabbitMQ要高出1~2个数量级,RabbitMQ的单机QPS在万级别,Kafka的单机QPS能够达到百万级别。RocketMQ单机写入TPS单实例约7万条/秒,单机部署3个Broker,可以跑到最高12万条/秒,消息大小10个字节,Kafka如果开启幂等、事务等功能,性能也会有所降低。

数据可靠性

Kafka与RabbitMQ都具备多副本机制,数据可靠性较高。RocketMQ支持异步实时刷盘,同步刷盘,同步Replication,异步Replication。

服务可用性

Kafka采用集群部署,分区与多副本的设计,使得单节点宕机对服务无影响,且支持消息容量的线性提升。RabbitMQ支持集群部署,集群节点数量有多种规格。RocketMQ是分布式架构,可用性高。

功能

Kafka与RabbitMQ都是比较主流的两款消息中间件,具备消息传递的基本功能,但在一些特殊的功能方面存在差异,RocketMQ在阿里集团内部有大量的应用在使用。

个人答主

image.pngimage.pngimage.png

非常好的一个问题。大部分同学都没回答到点子上,或者找的一些证据就是错的,还有同学找了网上那个 ActiveMQ、RabbitMQ、Kafka、RocketMQ的对比表格,表格里也有一些错误或是早就过时的信息。

总的来说,三大原因,语言、潮流、生态。

MQ这种东西,当你的消息量不大的时候,用啥是没多大区别的。特别是在过去20年里,有些阶段你没多 少开源的MQ可选,所以最开始ActiveMQ和RabbitMQ还是很火的。

ActiveMQ、RabbitMQ、Kafka/RocketMQ,包括最近很火的pulsar,都非常有自己的特色,但是中间件 这条线上,越早出现的,包袱越大,功能可能更多,比如ActiveMQ发展16年了,,,有大几百个功 能,,你能想到的所有消息领域的特性,它全都有,所有消息协议,都支持,搞的太重了。淘宝最早期的 notify,就是借鉴ActiveMQ来的。

京东多年使用大规模的ActiveMQ集群,10年前就有几百台了,然后发现古老的MQ模型,broker太重, 量一大就卡(90%用ActiveMQ,但是有一定规模的数据量,这个问题都搞不好搞),然后慢慢发展了自 己的JMQ。当年大家消息吞吐量都不大的时候,RabbitMQ就是神器,吞吐高出ActiveMQ几倍。但是慢 慢大家发现,真有什么问题,团队没有erlang高手的话,没任何办法。比如说,一天几个亿、几十亿的消 息,RabbitMQ一卡主,上下游所有交易订单处理,全都蹦掉了。

这个时候,linkedin搞出来了kafka,天然支持消息堆积。然后很快twitter之类的公司快速跟上,在传输消 息量非常大的几个领域,大数据的数据传输,日志和监控数据收集,等领域就支持称霸了。这个几年的代 差,让大家不在一个起跑线上。紧接着淘宝尝试用kafka效果不错,但是搞不定scala,然后像从ActiveMQ 发展出来了notify一样,,基本上用java把kafka翻译了一遍,有了metaq,,,然后再逐渐出来了 RocketMQ,发展了很多年,跟Kafka有一些小的差异,本质上还是那一套。

特别是最近这5-6年,随着整个互联网数据量的进一步增大,kafka/rocketmq在越来越丰富的场景下证明 了分布式+支持堆积消息的优越性。大家积累了大量的经验和应用场景,然后发现日常做业务也可以放心 大胆用mq处理了。

最后kafka和RocketMQ本身社区活跃,工具体系丰富,发展的很快(ActiveMQ中间尝试6.x版本浪费了很 多年,最近两年跟hornetq合并才有新的发展方向。RabbitMQ中间也错失了一些机会。特别是RabbitMQ 属于pivotal,spring品牌所在的公司,有个erlang的产品,跟其他的东西相比,蛮奇怪的,也许这也有些 原因)。

总而言之,现在技术发展太快了,越是后起之秀,越能站上前辈的肩膀上,实现弯道超车。 Kafka/RocketMQ,首先是基于JVM和Java,其次就是赶上了数据量爆发的快车道,最后是体系工具非常 丰富,所以目前基本上占山为王(时至今日,几乎可以说,rpc和mq是分布式大厦门口最基础的两块砖)。

Kafka在stream流处理的道路上越走越远,下一波大的技术浪潮也许还能赶上。 个人非常看好pulsar,在kafka的基础上,进一步的分离计算和存储(计算存储分离是下一代基础软件的大 趋势),国内很多人在负责和参与这个新的MQ项目。 对了,前面提到的所有MQ,只有RabbitMQ是pivotal的,其他的都属于Apache开源基金会。

总结

  1. Kafka 主要特点是基于 Pull 的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输,适合产生大量数据的互联网服务的数据收集业务。大型公司建议可以选用,如果有日志采集功能,肯定是首选 kafka 了。

  2. 如果自己所处公司业务比较平稳,未来几年内不会出现飞速发展,而且没有什么改源码的特殊需求的话,在面对选择MQ的时候就可以选用RabbitMQ。结合 erlang 语言本身的并发优势,性能好时效性微秒级,社区活跃度也比较高,管理界面用起来十分方便,如果你的数据量没有那么大,中小型公司优先选择功能比较完备的 RabbitMQ,吞吐量逊色。

  3. 基于kafka使用Java编写了RocketMQ,定位于非日志的可靠性传输,多使用于订单、交易、充值、流计算、消息推送。天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法及时处理的情况。RoketMQ 在稳定性上可能更值得信赖,这些业务场景在阿里双 11 已经经历了多次考验,如果你的业务有上述并发场景,建议可以选择 RocketMQ。