基础编程学习快乐每一天
首页
留言
Siddim.com
当前位置:
首页
>
编程知识库
>
后端开发知识
>
面试官:RocketMQ与Kafka对比,谈谈两者的差异
面试官:RocketMQ与Kafka对比,谈谈两者的差异
阅读
2
2021-10-09
淘宝内部的交易系统使用了淘宝自主研发的
Notify
消息中间件,使用
Mysql
作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,
2011
年初,
Linkin
开源了
Kafka
这个优秀的消息中间件,淘宝中间件团队在对
Kafka
做过充分
Review
之后,
Kafka
无限消息堆积,高效的持久化速度吸引了我们,但是同时发现这个消息系统主要定位于日志传输,对于使用在淘宝交易、订单、充值等场景下还有诸多特性不满足,为此我们重新用
Java
语言编写了
RocketMQ
,定位于非日志的可靠消息传输(日志场景也
OK
),目前
RocketMQ
在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,
binglog
分发等场景。
为了方便大家选型,整理一份
RocketMQ
与
Kafka
的对比文档,文中如有错误之处,欢迎来函指正。
vintage
.
wang
@
gmail
.
com
数据可靠性
RocketMQ
支持异步实时刷盘,同步刷盘,同步
Replication
,异步
Replication
Kafka
使用异步刷盘方式,异步
Replication
总结:
RocketMQ
的同步刷盘在单机可靠性上比
Kafka
更高,不会因为操作系统
Crash
,导致数据丢失。同时同步
Replication
也比
Kafka
异步
Replication
更可靠,数据完全无单点。
另外
Kafka
的
Replication
以
topic
为单位,支持主机宕机,备机自动切换,但是这里有个问题,由于是异步
Replication
,那么切换后会有数据丢失,同时
Leader
如果重启后,会与已经存在的
Leader
产生数据冲突。开源版本的
RocketMQ
不支持
Master
宕机,
Slave
自动切换为
Master
,阿里云版本的
RocketMQ
支持自动切换特性。
性能对比
Kafka
单机写入
TPS
约在百万条/秒,消息大小
10
个字节
RocketMQ
单机写入
TPS
单实例约
7
万条/秒,单机部署
3
个
Broker
,可以跑到最高
12
万条/秒,消息大小
10
个字节
总结:
Kafka
的
TPS
跑到单机百万,主要是由于
Producer
端将多个小消息合并,批量发向
Broker
。
推荐:
Java
进阶视频资源
RocketMQ
为什么没有这么做?
Producer
通常使用
Java
语言,缓存过多消息,
GC
是个很严重的问题
Producer
调用发送消息接口,消息未发送到
Broker
,向业务返回成功,此时
Producer
宕机,会导致消息丢失,业务出错
Producer
通常为分布式系统,且每台机器都是多线程发送,我们认为线上的系统单个
Producer
每秒产生的数据量有限,不可能上万。
缓存的功能完全可以由上层业务完成。
单机支持的队列数
Kafka
单机超过
64
个队列/分区,
Load
会发生明显的飙高现象,队列越多,
load
越高,发送消息响应时间变长
RocketMQ
单机支持最高
5
万个队列,
Load
不会发生明显变化
队列多有什么好处?
单机可以创建更多
Topic
,因为每个
Topic
都是由一批队列组成
Consumer
的集群规模和队列数成正比,队列越多,
Consumer
集群可以越大
消息投递实时性
Kafka
使用短轮询方式,实时性取决于轮询间隔时间
RocketMQ
使用长轮询,同
Push
方式实时性一致,消息的投递延时通常在几个毫秒。
消费失败重试
Kafka
消费失败不支持重试
RocketMQ
消费失败支持定时重试,每次重试间隔时间顺延
总结:例如充值类应用,当前时刻调用运营商网关,充值失败,可能是对方压力过多,稍后在调用就会成功,如支付宝到银行扣款也是类似需求。
这里的重试需要可靠的重试,即失败重试的消息不因为
Consumer
宕机导致丢失。
严格的消息顺序
Kafka
支持消息顺序,但是一台
Broker
宕机后,就会产生消息乱序
RocketMQ
支持严格的消息顺序,在顺序消息场景下,一台
Broker
宕机后,发送消息会失败,但是不会乱序
Mysql
Binlog
分发需要严格的消息顺序
定时消息
Kafka
不支持定时消息
RocketMQ
支持两类定时消息
开源版本
RocketMQ
仅支持定时
Level
阿里云
ONS
支持定时
Level
,以及指定的毫秒级别的延时时间
分布式事务消息
Kafka
不支持分布式事务消息
阿里云
ONS
支持分布式定时消息,未来开源版本的
RocketMQ
也有计划支持分布式事务消息
消息查询
Kafka
不支持消息查询
RocketMQ
支持根据
Message
Id
查询消息,也支持根据消息内容查询消息(发送消息时指定一个
Message
Key
,任意字符串,例如指定为订单
Id
)
总结:消息查询对于定位消息丢失问题非常有帮助,例如某个订单处理失败,是消息没收到还是收到处理出错了。
消息回溯
Kafka
理论上可以按照
Offset
来回溯消息
RocketMQ
支持按照时间来回溯消息,精度毫秒,例如从一天之前的某时某分某秒开始重新消费消息
总结:典型业务场景如
consumer
做订单分析,但是由于程序逻辑或者依赖的系统发生故障等原因,导致今天消费的消息全部无效,需要重新从昨天零点开始消费,那么以时间为起点的消息重放功能对于业务非常有帮助。
消费并行度
Kafka
的消费并行度依赖
Topic
配置的分区数,如分区数为
10
,那么最多
10
台机器来并行消费(每台机器只能开启一个线程),或者一台机器消费(
10
个线程并行消费)。即消费并行度和分区数一致。
RocketMQ
消费并行度分两种情况
顺序消费方式并行度同
Kafka
完全一致
乱序方式并行度取决于
Consumer
的线程数,如
Topic
配置
10
个队列,
10
台机器消费,每台机器
100
个线程,那么并行度为
1000
。
消息轨迹
Kafka
不支持消息轨迹
阿里云
ONS
支持消息轨迹
开发语言友好性
Kafka
采用
Scala
编写
RocketMQ
采用
Java
语言编写
Broker端消息过滤
Kafka
不支持
Broker
端的消息过滤
RocketMQ
支持两种
Broker
端消息过滤方式
根据
Message
Tag
来过滤,相当于子
topic
概念
向服务器上传一段
Java
代码,可以对消息做任意形式的过滤,甚至可以做
Message
Body
的过滤拆分。
消息堆积能力
理论上
Kafka
要比
RocketMQ
的堆积能力更强,不过
RocketMQ
单机也可以支持亿级的消息堆积能力,我们认为这个堆积能力已经完全可以满足业务需求。
开源社区活跃度
Kafka
社区更新较慢
RocketMQ
的
github
社区有
250
个个人、公司用户登记了联系方式,
QQ
群超过
1000
人。
商业支持
Kafka
原开发团队成立新公司,目前暂没有相关产品看到
RocketMQ
在阿里云上已经开放公测近半年,目前以云服务形式免费供大家商用,并向用户承诺
99
.
99
%的可靠性,同时彻底解决了用户自己搭建
MQ
产品的运维复杂性问题
成熟度
Kafka
在日志领域比较成熟
RocketMQ
在阿里集团内部有大量的应用在使用,每天都产生海量的消息,并且顺利支持了多次天猫双十一海量消息考验,是数据削峰填谷的利器。
推荐:
Java
进阶视频资源
感谢阅读,希望对你有所帮助 :)
来源:
github
.
com
/
alibaba
/
RocketMQ
/
wiki
/
rmq
_
vs
_
kafka
以上数据来源于网络,如有侵权,请联系删除。
上一篇:
面试官:如何设计群聊消息的已读未读功能
下一篇:
面试官:如何中断一个线程,谈谈具体实现
评论
(0)
提交
类别
基础编程学习
HTML
PHP
Python
编程知识库
后端开发知识
热门文章
Java并发中的同步容器与并发容器,你了解多少?
Innodb中的事务隔离级别和锁的关系,难倒一半面试者!
SpringBoot + minio实现分片上传、秒传、续传
面试官:你知道消息队列如何保证数据不丢失吗?
JAVA知识 Java8新特性
面试官:谈谈为什么要限流,有哪些限流方案?
说说动态代理与静态代理区别
面试官:思考Tomcat 类加载器为什么要违背双亲委派模型?
boot-admin 基于SpringBoot的后台权限管理系统,可作为脚手架,用于快速搭建项目
SpringBoot+Vue+App+硬件实现智能家居系统项目