MQ中间件选择对比

在日常系统里会系统解耦、异步调用、流量削峰的时候使用消息中间件,在系统里被使用到的MQ主要有:RocketMQ、kafka,考虑到避免引入多种中间件,降低业务的下游系统需要同时接入多种消息中间,想讨论是否可以选择一种消息中间件,后续大家都尽量使用统一的MQ作为技术栈。

简单介绍:

RocketMQ

RocketMQ是一款阿里巴巴开源的消息中间件,在2017年9月份成为Apache的顶级项目,是国内首个互联网中间件在 Apache 上的顶级项目。

RocketMQ的起源受到另一款消息中间件Kafka的启发。最初,淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介,可完全水平扩容。为了进一步降低成本和提升写入性能,需要在存储部分可以进一步优化,2011年初,Linkin开源了Kafka这个优秀的消息中间件,淘宝中间件团队在对Kafka做过充分Review之后,被Kafka无限消息堆积,高效的持久化速度所吸引。

不过当时Kafka主要定位于日志传输,对于使用在淘宝交易、订单、充值等场景下还有诸多特性不满足,例如:延迟消息,消费重试,事务消息,消息过滤等,这些都是一些企业级消息中间件需要具备的功能。为此,淘宝中间件团队重新用Java语言编写了RocketMQ,定位于非日志的可靠消息传输。不过随着RocketMQ的演进,现在也支持了日志流式处理。

目前RocketMQ经过了阿里多年双十一大促的考验,性能和稳定性得到了充分的严重。目前在业界被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binlog分发等场景。

Kafka

Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息

对比维度

数据可靠性

RocketMQ支持异步实时刷盘,同步刷盘,同步复制,异步复制

Kafka使用异步刷盘方式,异步复制/同步复制

总结:RocketMQ的同步刷盘在单机可靠性上比Kafka更高,不会因为操作系统Crash,导致数据丢失。Kafka同步Replication理论上性能低于RocketMQ的同步Replication,原因是Kafka的数据以分区为单位组织,意味着一个Kafka实例上会​​有几百个数据分区,RocketMQ一个实例上只有一个数据分区,RocketMQ可以充分利用IO组Commit机制,批量传输数据,配置同步Replication与异步Replication相比,性能损耗约20%~30%,Kafka没有亲自测试过,但是个人认为理论上会低于RocketMQ

性能对比

Kafka单机写入TPS约在百万条/秒,消息大小10个字节

RocketMQ单机写入TPS单实例约7万条/秒,单机部署3个Broker,可以跑到最高12万条/秒,消息大小10个字节

多Topic对性能稳定性的影响

当topic的数量从64上升到256,Kafka的吞吐量下降了98.37%

当topic的数量从64上升到256,RocketMQ的吞吐量下降了16%

When the number of topics increases from 64 to 256, the throughput of Kafka dropped by 98.37%.

这种差异是由于Kafka的每个主题和分区对应于一个物理文件。当主题数量增加时,将消息分散存储到磁盘的策略将导致磁盘IO竞争,从而导致性能瓶颈。相反,Apache RocketMQ中的所有消息存储在同一物理文件中。主题和分区的数量只是Apache RocketMQ的逻辑划分™. 所以越来越多的主题不会对ApacheRocketMQ产生巨大的影响性能

消费失败重试

卡夫卡消费失败不支持重试。

RocketMQ消费失败支持定时重试,每次重试间隔时间顺延

总结:例如充值类应用,当前时刻调用运营商网关,充值失败,可能是对方压力过多,稍后再调用就会成功,如支付宝到银行扣款也是类似需求。这里的重试需要可靠的重试,即失败重试的消息不因为Consumer宕机导致丢失

严格的消息顺序

卡夫卡支持消息顺序,但是一台代理宕机后,就会产生消息乱序

RocketMQ支持严格的消息顺序,在顺序消息场景下,一台Broker宕机后,发送消息会失败,但是不会乱序

开源社区活跃度和开源技术支持

卡夫卡社区人气火爆

RocketMQ的GitHub更新较慢

|

|

Reference:

https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines

https://www.confluent.io/blog/how-choose-number-topics-partitions-kafka-cluster/

https://www.alibabacloud.com/blog/kafka-vs-rocketmq--multiple-topic-stress-test-results_69781

http://jm.taobao.org/2016/04/20/kafka-vs-rocketmq-3/

你可能感兴趣的:(MQ中间件选择对比)