RabbitMQ和Kafka到底怎么选(二)?
前言
前一篇文章《RabbitMQ和Kafka到底怎么选?》,我们在吞吐量方面比较了Kafka和RabbitMQ,知道了Kafka的吞吐量要高于RabbitMQ。本文从可靠性方面继续探讨两个队列的差异。
RabbitMQ可靠性
我们通过前文知道,RabbitMQ的队列分为master queue和mirror queue,mirror queue 在master queue宕机之后,会被提升为master queue,如下图所示。

队列A的consumer在消费的时候,机器宕机,此时客户端和服务端分别做如下动作:
- 服务端:把mirror queue提升为master queue
- 客户端:连接到新的master queue 所在的节点进行消费或者生产
当master queue 所在节点宕机后,其正在被消费的消息的相关信息全部丢失,即服务端不知道消费者对那一瞬间消费的消息是否进行了ACK,所以在mirror queue被提升为master queue时,会把宕机前正在进行消费的的消息全部重新发送一遍,即客户端重连后,消息可能被重复消费,这个时候就必须依靠应用层逻辑来判断来避免重复消费。
在持久化方面,RabbitMQ的master queue每次收到新消息后,都会立刻写入磁盘,并把消息同步给mirror queue。假设在master queue 收到消息后,消息未同步到mirror queue 之前master queue 宕机,则此时mirror queue中就没有刚刚master queue收到的那条消息,当这个mirror queue被提升为master queue时,消费者连接到新的master queue上进行消费时就丢了一条消息。所以,RabbitMQ也会丢消息,只不过这个丢消息的概率非常低。
Kafka可靠性
我们知道Kafka中的每个队列叫做Topic,一个Topic有多个主分片和副分片,当主分片所在机器宕机后,服务端会把一个副分片提升为主分片,如下图所示。

服务端和客户端会有如下动作:
- 服务端:把副分片提升为主分片
- 客户端:连接到新的主分片
Kafka同样有主从同步,所以也必定存在与RabbitMQ同样丢消息的问题。但是Kafka的每个客户端保存了读取消息的偏移信息,故当一个主分片宕机后,Kafka客户端可以从副分片相应位移后继续消费,不会有重复消费的情况。
持久化方面,Kafka默认把消息直接写文件,但是由于操作系统的cache原因,消息可能不会立马写到磁盘上,这个时候就需要刷新文件到磁盘。由于刷新文件到磁盘是一个比较耗时的操作,故Kafka提供了两种不同的刷新配置:
#每接收多少条消息刷一下磁盘
log.flush.interval.messages=10000
#每隔多少ms刷一下磁盘
log.flush.interval.ms=1000
我们完全可以把log.flush.interval.messages设置为1,这样Kafka就能在持久化方面达到和RabbitMQ同样的安全级别。

但是Kafka集群依赖ZK,如上图所示,所以对于Kafka稳定性的评估必须考虑ZK集群的稳定性,而一般我们认为任何分布式集群的稳定性都小于1,故两个集群的串联稳定性会下降一些,维护更复杂一些,这点没有RabbitMQ有优势。
总结
其实好多开源组件随着时间推移,往往都进行了各种改进。就比如Kafka虽然是为了日志而生,给人第一印象是容易丢消息,但是经过这么多年的改进,其可靠性可能并不逊色RabbitMQ了,只需要你根据不同的业务场景配置不同的配置参数,即可达到适合自己的安全级别。
- 从吞吐量上看,在不要求消息顺序情况下,Kafka完胜;在要求消息先后顺序的场景,性能应该稍逊RabbitMQ(此时Kafka的分片数只能为1)。
- 从稳定性来看,RabbitMQ胜出,但是Kafka也并不逊色多少。
好了,以上就是我的个人分析,多有不足,希望能和小伙伴进行探讨。
RabbitMQ和Kafka到底怎么选(二)?的更多相关文章
- RabbitMQ和Kafka到底怎么选?
前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措.对于RabbitMQ和Kafka,到底应该选哪个? Rabbi ...
- 头大!RabbitMQ 和 Kafka 到底怎么选?
前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措. 对于RabbitMQ和Kafka,到底应该选哪个? Rabb ...
- RabbitMQ 和 Kafka
============================RabbitMQ 术语============================RabbitMQ 有很多术语和Kafka不一样, 理解这些术语十分 ...
- rabbitmq和kafka怎么选?【转】
MQ框架非常之多,今天简单说一下有代表性的两个MQ(rabbitmq和kafka).经常会有人问rabbitmq和kafka到底哪个好呢?其实没有好与不好之分,只有哪个更合适,首先要根据自己项目的业务 ...
- MQ选型对比ActiveMQ,RabbitMQ,RocketMQ,Kafka 消息队列框架选哪个?
最近研究消息队列,发现好几个框架,搜罗一下进行对比,说一下选型说明: 1)中小型软件公司,建议选RabbitMQ.一方面,erlang语言天生具备高并发的特性,而且他的管理界面用起来十分方便.不考虑r ...
- 关于ActiveMQ、RocketMQ、RabbitMQ、Kafka一些总结和区别
这是一篇分享文 转自:http://www.cnblogs.com/williamjie/p/9481780.html 尊重原作,谢谢 消息队列 为什么写这篇文章? 博主有两位朋友分别是小A和小B: ...
- RabbitMQ和Kafka对比
# 前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措.对于RabbitMQ和Kafka,到底应该选哪个? # R ...
- 8.关于ActiveMQ、RocketMQ、RabbitMQ、Kafka一些总结和区别
这是一篇分享文 转自:http://www.cnblogs.com/williamjie/p/9481780.html 尊重原作,谢谢 消息队列 为什么写这篇文章? 博主有两位朋友分别是小A和小B: ...
- Kafka设计解析(二)Kafka High Availability (上)
转载自 技术世界,原文链接 Kafka设计解析(二)- Kafka High Availability (上) Kafka从0.8版本开始提供High Availability机制,从而提高了系统可用 ...
随机推荐
- composer安装yii2
这几天准备入门yii2,但是对于一个看php不到5天的小白来说,只能说路途艰辛,不过,总算是解决了,先放一张大图 感受一下成功的喜悦...(文章最后有惊喜哦) ok,下面就描述一下安装的步骤: 1.安 ...
- 发布 Rafy .NET Standard 版本 Nuget 包
去年年中,Rafy 框架的源码就已经支持了 Net Standard 2.0 版本.其开源代码也已经上传到 Github 中:https://github.com/zgynhqf/rafy/tree/ ...
- 学习MySQL我们应该知道哪些东西?
随笔:小编由于年前一直在找工作,而年后找到工作后又一直在忙工作,所以也很少有时间给大家写点什么,总的来说呢,回顾一下之前面试的几次经历,也曾小小的总结了一下自己的不足,发现自己虽然一直在原有的公司(外 ...
- 拾人牙慧篇之——linux文件挂载,基于nfs的文件共享系统安装配置
一.写在前面 最近需要把阿里云上的四台服务器的项目迁移到客户提供的新的项目中,阿里云的项目平时开发启动的时候知道有个nfs文件系统,表现就是后台管理系统通过freemarker生成的HTML文件,自动 ...
- mysql-索引、关系、范式
索引 几乎所有的索引都是建立在字段之上 索引:系统根据某种算法,将已有的数据(未来可能新增的数据也算),单独建立一个文件,这个文件能够快速的匹配数据,并且能够快速的找到对应的表中的记录 索引意义 能够 ...
- 基于ThreadPoolExecutor,自定义线程池简单实现
一.线程池作用 在上一篇随笔中有提到多线程具有同一时刻处理多个任务的特点,即并行工作,因此多线程的用途非常广泛,特别在性能优化上显得尤为重要.然而,多线程处理消耗的时间包括创建线程时间T1.工作时间T ...
- QT https post请求(QNetworkRequest要设置SSL证书,而SSL证书认证有三种)
因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com/product ...
- css实现背景颜色渐变效果
自己学的一些渐变:background:linear-gradient(90deg,#4EB9E7 -50%,#3691BE 50%,#2E83B0 100%); IE没有效果 详细访问: http: ...
- 虚拟机中克隆后使用eth0
1.修改主机名 vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=mini1 1.修改ip地址以及udev记录网络规则的脚本 在CentOS中,ude ...
- BOM和DOM的区别
一.BOM和DOM之间的关系图 window对象是BOM的顶层(核心)对象,所有对象都是通过它延伸出来的,也可以称为window的子对象由于window是顶层对象,因此调用它的子对象时可以不显示的指明 ...