https://www.jianshu.com/p/fd50befccfdd

引言

前几期的评测中,我们对比了Kafka和RocketMQ的吞吐量和稳定性,本期我们要引入一个新的评测标准——软件可靠性。

何为“可靠性”?

先看下面这种情况:有A,B两辆越野汽车,在城市的周边地区均能很好应对泥泞的路况。当一同开去穿越西藏,A车会因为西藏本地的汽油不达标,导致油路受阻无法点火,而B车顺利完成了穿越。因此我们说,B车的可靠性比A车高。

何为“软件可靠性”?

“软件的可靠性”就是考察软件在各种异常突发的情况下的应对能力。常见的软件异常有:磁盘损坏、进程意外退出、宿主机宕机等情况。

何为“消息中间件的可靠性”?

对于消息中间件来说,“可靠性”最直接的指标就是——消息数据不丢失。此外,消息不重投、服务一主多备等特性也可以用来评估可靠性。

那么Kafka和RocketMQ(以下简称RMQ)在可靠性上孰优孰劣呢?和我们走进本期的测试比拼吧!

测试目的

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

测试场景

以下场景使用多个发送端向一个Topic发送消息,发送方式为同步发送,分区数为8,只启动一个订阅者。

场景1.模拟进程退出

在消息收发过程中,利用Kill -9 命令使Broker进程终止,然后重新启动,得到可靠性数据如下:

 

注:以上测试场景中Kafka的异步刷盘间隔为1秒钟,同步发送需设置request.required.acks=1,否则会出现消息丢失。

在Broker进程被终止重启,Kafka和RMQ都能保证同步发送的消息不丢,因为进程退出后操作系统能确保将该进程遗留在内存的数据刷到磁盘上。实验中,Kafka出现了极少量的消息重复。再次可以确定此场景中,二者的可靠性都很高。

场景2.模拟机器掉电

在消息收发过程中,直接拔掉Broker所在的宿主机电源,然后重启宿主机和Broker应用。因受到机房断电限制,我们在本场景测试中使用的是普通PC机器。得到可靠性数据如下:

 

测试发现,即使在并发很低的情况下,Kafka和RMQ都无法保证掉电后不丢消息。这个时候,就需要改变刷盘策略了。我们把刷盘策略由“异步刷盘”变更为“同步刷盘”,就是说,让每一条消息都完成存储后才返回,以保证消息不丢失。

注:关于两种刷盘模式的详细区别可以参照文档最下方的说明

重新执行上面的测试,得到数据如下:

 

首先,设置同步刷盘时,二者都没出现消息丢失的情况。限于我们使用的是普通PC机器,两者吞吐量都不高。此时Kafka的最高TPS仅有500条/秒,RMQ可以达到4000条/秒,已经是Kafka的8倍。

为什么Kafka的吞吐量如此低呢?因为Kafka本身是没有实现任何同步刷盘机制的,就是说在这种场景下测试,Kafka注定是要丢消息的。但要想做到每一条消息都在落盘后才返回,我们可以通过修改异步刷盘的频率来实现。设置参数log.flush.interval.messages=1,即每条消息都刷一次磁盘。这样的做法,Kafka也不会丢消息了,但是频繁的磁盘读写直接导致性能的下降。

另外,二者在服务恢复后,均出现了消息重复消费的情况,这说明消费位点的提交并不是同步落盘的。不过,幸好Kafka和RMQ都提供了自定义消费位点的接口,来避免大量的重复消费。

测试结论

在Broker进程被Kill的场景, Kafka和RocketMQ都能在保证吞吐量的情况下,不丢消息,可靠性都比较高。

在宿主机掉电的场景,Kafka与RocketMQ均能做到不丢消息,此时Kafka的吞吐量会急剧下跌,几乎不可用。RocketMQ则仍能保持较高的吞吐量。

在单机可靠性方面,RocketMQ综合表现优于Kafka。

附录:

测试环境

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

 

应用版本:

 

测试脚本

 

同步刷盘和异步刷盘的区别

 

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

[转帖]Kafka 与RocketMQ 落盘机制比较的更多相关文章

  1. 面试题:了解MySQL的Flush-List吗?顺便说一下脏页的落盘机制!(文末送书)

    Hi,大家好!我是白日梦! 今天我要跟你分享的MySQL话题是:"了解Flush-List吗?顺便说一下脏页的落盘机制!(文末送书)" 本文是MySQL专题的第 8 篇,共110篇 ...

  2. Kafka与RocketMq文件存储机制对比

    一个商业化消息队列的性能好坏,其文件存储机制设计是衡量一个消息队列服务技术水平和最关键指标之一. 开头问题 kafka文件结构和rocketMQ文件结构是什么样子?特点是什么? 一.目录结构 Kafk ...

  3. Kafka vs RocketMQ——单机系统可靠性-转自阿里中间件

    引言 前几期的评测中,我们对比了Kafka和RocketMQ的吞吐量和稳定性,本期我们要引入一个新的评测标准--软件可靠性. 何为"可靠性"? 先看下面这种情况:有A,B两辆越野汽 ...

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

    引言 前几期的评测中,我们对比了Kafka和RocketMQ的吞吐量和稳定性,本期我们要引入一个新的评测标准——软件可靠性. 何为“可靠性”? 先看下面这种情况:有A,B两辆越野汽车,在城市的周边地区 ...

  5. Kafka vs RocketMQ——多Topic对性能稳定性的影响-转自阿里中间件

    引言 上期我们对比了RocketMQ和Kafka在多Topic场景下,收发消息的对比测试,RocketMQ表现稳定,而Kafka的TPS在64个Topic时可以保持13万,到了128个Topic就跌至 ...

  6. Kafka vs RocketMQ—— Topic数量对单机性能的影响-转自阿里中间件

    引言 上一期我们对比了三类消息产品(Kafka.RabbitMQ.RocketMQ)单纯发送小消息的性能,受到了程序猿们的广泛关注,其中大家对这种单纯的发送场景感到并不过瘾,因为没有任何一个网站的业务 ...

  7. Kafka vs RocketMQ——多Topic对性能稳定性的影响

    引言 上期我们对比了RocketMQ和Kafka在多Topic场景下,收发消息的对比测试,RocketMQ表现稳定,而Kafka的TPS在64个Topic时可以保持13万,到了128个Topic就跌至 ...

  8. Kafka vs RocketMQ—— Topic数量对单机性能的影响

    引言 上一期我们对比了三类消息产品(Kafka.RabbitMQ.RocketMQ)单纯发送小消息的性能,受到了程序猿们的广泛关注,其中大家对这种单纯的发送场景感到并不过瘾,因为没有任何一个网站的业务 ...

  9. 30分钟带你了解「消息中间件」Kafka、RocketMQ

    消息中间件的应用场景 主流 MQ 框架及对比 说明 Kafka 优点 Kafka 缺点 RocketMQ Pulsar 发展趋势 各公司发展 Kafka Kafka 是什么? Kafka 术语 Kaf ...

  10. kafka对比RocketMQ(转)

    淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,2011年初,Linkin开源了Kaf ...

随机推荐

  1. Cesium案例解析(七)——Layers在线地图服务

    目录 1. 概述 2. 案例 2.1. Blue Marble 2.2. ArcGIS地形 2.3. Cesium地形 2.4. Natural Earth II 2.5. Earth at Nigh ...

  2. 原理一、Java中的HashMap的实现

    文章从JDK1.7和JDK1.8两个版本解析HashMap的实现原理及其中常见的面试题(两个版本HashMap最大的区别,1.7版HashMap=数组+链表,1.8版HashMap=数组+红黑树+链表 ...

  3. CutMix&Mixup详解与代码实战

    摘要:本文将通过实践案例带大家掌握CutMix&Mixup. 本文分享自华为云社区<CutMix&Mixup详解与代码实战>,作者:李长安. 引言 最近在回顾之前学到的知识 ...

  4. LiteOS内核源码分析:动态内存之Bestfit分配算法

    摘要:本文为大家剖析LiteOS动态内存模块bestfit算法的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 内存管理模块管理系统的内存资源,它是操作系统的核心模块之一,主要 ...

  5. 从Encoder-Decoder模型入手,探索语境偏移解决之道

    摘要:在本文中,我们展示了CLAS,一个全神经网络组成,端到端的上下文ASR模型,通过映射所有的上下文短语,来融合上下文信息.在实验评估中,我们发现提出的CLAS模型超过了标准的shallow fus ...

  6. 提速 10 倍!深度解读字节跳动新型云原生 Spark History Server

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 前不久,在 6月29日 Databricks 举办的 Data + AI Summit 上,火山引擎向大家首次介绍 ...

  7. Jenkins + SVN/Git + Maven + Docker + 阿里云镜像 + Kubernetes(K8S)

    Jenkins 2361.2 + Maven Integration + SVN/GIT + Docker + 阿里云镜像 + Kubernetes(K8S) 本文用于学习,了解原理,和实际应用,有所 ...

  8. SpringBoot 自定义初始化任务 Runner

    在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.可以通过实现Runner接口完成以上工作. 两者只是参数上的区别 方式一 实现 CommandLineRunner 接口 ...

  9. python jira 取提出指向未解决的问题

    #!/usr/bin/python # -*- coding: utf-8 -*- import sys, os,time,requests,datetime import schedule from ...

  10. peewee 操作 sqlite 锁表问题分析

    在使用python orm 框架 peewee 操作数据库时时常会抛出以一个异常,具体的报错就是 database is locked 初步了解是因为sqlite锁的颗粒度比较大,是库锁.当一个连接在 ...