中间件核心技术与实战
丁威
中通快递资深架构师,RocketMQ 社区首席布道师
19674 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 33 讲
中间件核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

14 |性能之道:RocketMQ与Kafka高性能设计对比

你好,我是丁威。
RocketMQ 和 Kafka 是当下最主流的两款消息中间件,我们这节课就从文件布局、数据写入方式、消息发送客户端这三个维度对比一下实现 kafka 和 RocketMQ 的差异,通过这种方式学习高性能编程设计的相关知识。

文件布局

我们首先来看一下 Kafka 与 RocketMQ 的文件布局。
Kafka 的文件存储设计在宏观上的布局如下图所示:
我们解析一下它的主要特征。
文件的组织方式是“ topic + 分区”,每一个 topic 可以创建多个分区,每一个分区包含单独的文件夹。
分区支持副本机制,即一个分区可以在多台机器上复制数据。topic 中每一个分区会有 Leader 与 Follow。Kafka 的内部机制可以保证 topic 某一个分区的 Leader 与 Follow 不在同一台机器上,并且每一台 Broker 会尽量均衡地承担各个分区的 Leade。当然,在运行过程中如果 Leader 不均衡,也可以执行命令进行手动平衡。
Leader 节点承担一个分区的读写,Follow 节点只负责数据备份。
Kafka 的负载均衡主要取决于分区 Leader 节点的分布情况。分区的 Leader 节点负责读写,而从节点负责数据同步,如果 Leader 分区所在的 Broker 节点宕机,会触发主从节点的切换,在剩下的 Follow 节点中选举一个新的 Leader 节点。这时数据的流入流程如下图所示:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

RocketMQ和Kafka是当前最主流的两款消息中间件,它们在文件布局、数据写入方式和消息发送客户端等方面存在差异。Kafka以Topic/partition为主,实现文件顺序写,而RocketMQ追求极致的顺序写,不受topic和分区数量影响。在数据写入方式上,Kafka服务端采用FileChannel的transferTo方法,而RocketMQ支持内存映射与FileChannel两种写入方式。在消息发送方面,Kafka引入了批处理思想,节约了Broker端的CPU压力,但可能增加消息丢失的可能性。相比之下,RocketMQ在服务端进行消息组织和持久化操作。总的来说,Kafka追求批处理,提高吞吐量,但可能延长响应时间和增加消息丢失的可能性;而RocketMQ追求极致的顺序写,运维成本相对较低。文章通过对比两者在不同方面的设计和性能特点,帮助读者了解了它们的差异和适用场景。综合对比来看,在同等硬件配置下,Kafka的综合性能要比RocketMQ更为强劲。RocketMQ还有很大的进步空间,可以考虑优化顺序写机制以提高磁盘性能,以及优化消息发送方面以提高吞吐率。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《中间件核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • Y a n g
    文件布局:更改commitlog副本为分区维度,充分利用磁盘性能。 数据写入方式:FileChannel调用transferTo而不是wirte,发挥块设备优势 客户端消息发送:加入缓存队列,存储格式的数据组装放在客户端,引入批处理思想

    作者回复: 总结的非常到位👍

    2022-07-28归属地:上海
    2
  • xueerfei007
    又来催更了

    作者回复: 求知欲太强了,我们一起加油

    2022-12-15归属地:浙江
  • 在路上
    事务消息方面,老师可以补充下吗

    作者回复: 抱歉,kafka的事务消息我还没深入研究,感觉实现的非常复杂,里面还有类似读未提交等类似mysql那种事务隔离级别。但RocketMQ的事务消息,我比较熟悉,建议看一下我写的文章:https://mp.weixin.qq.com/s/9sIjic10mTzdTLaAnd4ckA

    2022-11-29归属地:北京
  • syz
    老师求助个问题, 在window server 2012下使用RocketMQ,日志清理时会宕机吗,谢谢 问题:历史项目在win下运行,运行一段时间kafka后日志清理时宕机 方案:win中装centos、使用网上kafka补丁版本、换RocketMQ

    作者回复: 你好,这个问题我无法直接回答你,我目前的所有经验都是部署在centors中。但既然发生了,那说明某一个环节一定存在问题,这个时候,我们首先要拉取相关的日志。 rocketmq的日志,默认在用户的主目录下。{user_home}/logs/rocketmqlogs。 如果有日志,麻烦发我一下,我们可以继续探讨一下。

    2022-08-04归属地:上海
  • 麻婆豆腐
    首先文件组织方式可以考虑更多的利用磁盘的IO。 数据写入采用零拷贝。 数据发送可以客户端组织数据来提高吞吐。

    作者回复: 嗯,对的,我也有一个想法,我的想法是希望对commitlog进行分组,不同的分组,地位平等,一个主题申请后,就会对应一个分组,而且不可更改,这样对整个rockemq的存储体系不会有大的改变,只需要对外面进行包一层,我们就可以通过调整分组,来提高commitlog的并发写入,重复发挥出磁盘IO的优势。

    2022-07-23归属地:上海
    3
  • 芋头
    rocketmq如何通过commitlog构建队列文件的?本文漏了对比消费端的情况
    2023-05-29归属地:广东
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部