神刀安全网

Kafka vs RocketMQ——单机系统可靠性

前几期中我们对比了Kafka和RocketMQ的单机性能和系统稳定性,本期我们要引入另一个评判软件优劣的重要概念“软件的可靠性”。

那什么是可靠性呢?正如汽车不仅要在良好的路况上稳定运行,还要能应对各类恶劣环境的考验,如雨雪天、砂石路、碰撞等,故障率低的车型才是可靠性高的。类似,“软件的可靠性”就是要求软件在资源发生突发情况下也能保证数据安全、不引发系统故障,如磁盘损坏、进程意外退出、操作系统宕机或者硬件掉电等。

对于消息中间件来说,“可靠性”最直接的指标就是保证消息数据不丢,这对交易、计费类型的业务来说非常重要。此外,消息不重投、服务一主多备等特性也能从侧面评估消息中间件的可靠性。

那么Kafka和RocketMQ在可靠性上孰优孰劣呢?本期测试中,我们会模拟服务进程退出、服务机掉电宕机的场景,来看看Kafka和RocketMQ单机服务的可靠性。

测试目的

在收发消息过程中,分别模拟broker服务进程被kill、物理机器掉电的异常场景,多次实验,查看极端情况下消息系统的可靠性。

测试场景

模拟进程退出

默认发送一个Topic,分区数为8,只启动一个订阅者。在收发消息的过程中kill -9 broker的进程后重启,得到可靠性数据如下:

产品 发送方式 刷盘策略 并发 服务kill时刻的消息发送tps 消息丢失 消息重复 KAFKA 同步发送 异步刷盘 3 600 不丢 不重复 同步发送 异步刷盘 30 10500 不丢 不重复 同步发送 异步刷盘 150 49200 不丢 重复7条 RMQ 同步发送 异步刷盘 1 4066 不丢 不重复 同步发送 异步刷盘 3 10900 不丢 不重复 同步发送 异步刷盘 140 52458 不丢 不重复

说明:

测试场景中Kafka的异步刷盘间隔是1秒钟;Kafka在同步发送消息时需设置request.required.acks=1,否则会丢消息。

可以看出在Broker进程被kill时,Kafka和RocketMQ都能保证同步发送的消息不丢,因为进程退出后操作系统能确保将该进程遗留在内存的数据刷到磁盘上。实验中,Kafka出现了少量的消息重复,两者的可靠性都很高。

模拟机器掉电

在收发消息的过程中让服务物理机掉电后重启机器及broker,得到可靠性数据如下:

产品 发送方式 刷盘策略 并发 服务kill时刻的消息发送tps 消息丢失 消息重复 KAFKA 同步发送 异步刷盘 5 2000 丢3条 掉电前发送的消息都重新消费 同步发送 同步刷盘 5 300 不丢 重复3条 同步发送 同步刷盘 60 500 不丢 重复2W条 RMQ 同步发送 异步刷盘 5 2500 丢19条 不重复 同步发送 异步刷盘 5 800 不丢 掉电前发送的消息都重新消费 同步发送 异步刷盘 50 4000 不丢 掉电前发送的消息都重新消费

我们发现,Kafka和RocketMQ在异步刷盘时都丢失了少量的消息,而同步刷盘时都没出现丢消息。这说明同步刷盘比异步刷盘的可靠性要高,这是为什么呢?我们先科普一下两类刷盘方式:

Kafka vs RocketMQ——单机系统可靠性

同步刷盘是在每条消息都确认落盘了之后才向发送者返回响应;而异步刷盘中,只要消息保存到Broker的内存就向发送者返回响应,Broker会有专门的线程对内存中的消息进行批量存储。所以异步刷盘的策略下,当机器突然掉电时,Broker内存中的消息因无法刷到磁盘导致丢失。

Kafka本身不支持同步刷盘,所以产品设定的可靠性不高。但用户可以自定义异步刷盘的频率,实验中的“同步刷盘”就是设置log.flush.interval.messages=1来模拟的,即每条消息都刷一次盘,而磁盘的读写性能是有极限的,所以Kafka在同步刷盘时吞吐量只有500,基本不能满足用户需求。RocketMQ同步刷盘的吞吐量可以达到4000,是Kafka的8倍。所以相同可靠度下,RocketMQ的表现更优异。

另外,实验中不同刷盘方式下都出现了消息重复,说明消费位点的提交并不是同步落盘的。不过,Kafka和RocketMQ都提供了修改消费位点的方法来避免大量的重复消费。

测试结论

  1. Broker进程被kill时,Kafka和RocketMQ都能保证同步发送的消息不丢,可靠性高。
  2. Kafka本身不支持同步刷盘,产品设定的可靠性不高。当Broker意外掉电时,Kafka异步刷盘的策略容易发生消息丢失。所以在单机可靠性方面,RocketMQ综合表现更优异。

附录:

测试环境

服务端为单机部署,机器配置如下:

CPU 24核
内存 94G
硬盘 Seagate Constellation ES (SATA 6Gb/s) 2.00 TB 7202 rpm
网卡 1000Mb/s

应用版本:

消息中间件 版本
Kafka 0.8.2
RocketMQ 3.4.8

测试脚本:

压力端 Jmeter的java客户端
消息大小 128 字节
Topic分区数量 8
说明 Kafka的同步刷盘是设置log.flush.interval.messages=1来模拟的;Kafka在同步发送时需设置request.required.acks=1

未完待续

本期测试中,RocketMQ比Kafka具有更高的单机可靠性。对于普通业务,部署异步刷盘模式可以得到更高的性能;对于丢消息零容忍的业务,则更适用RocketMQ同步刷盘的模式,能够在高可靠性保障的同时拥有高吞吐量。实际上,Kafka和RocketMQ都提供了主备模式来解决服务器单点故障的问题,这点我们在后续会关注。敬请期待接下来的比拼!

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » Kafka vs RocketMQ——单机系统可靠性

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址