Apache RocketMQ 5.0 腾讯云落地实践
Apache RocketMQ 发展历程回顾
RocketMQ 最早诞生于淘宝的在线电商交易场景,经过了历年双十一大促流量洪峰的打磨,2016年捐献给 Apache 社区,成为 Apache 社区的顶级项目,并在国内外电商,金融,互联网等各行各业的广大客户落地验证,得到广泛认可。
Apache RocketMQ 社区在2022年10月正式对外发布了全新的5.0版本,腾讯云消息队列团队也和社区紧密合作,支持了5.0的商业化版本,现在将整个落地过程的经验教训做个总结,回馈社区。
什么是 RocketMQ 5.0?
一个新版本号?
一套新设计的API?
一系列新的特性实现?
一个存算分离的新架构?
一种新的商业化产品形态?
RocketMQ 面向云原生的新思考?
Apache RocketMQ 社区过去一年对5.0新架构从不同的角度进行了分享介绍,导致很多用户对5.0新架构认识不一致,其实从以上不同角度理解都对,本文尝试从多个维度做一个较全面的解释和回顾,帮助用户全面理解 RocketMQ 5.0 架构演进背后的思考逻辑。
RocketMQ 5.0 的演进目标
- 基础架构适应云原生化
RocketMQ 运行依赖的环境过去十年发生了巨大的变化,从最早的物理机部署开始,到现在云计算已经深入人心,资源越来越“弹性伸缩, 按量付费, 高SLA”,计算资源容器化,存储资源都演进为标准的分布式存储,比如块存储、文件存储和对象存储越来越成熟和标准化,尤其是以S3 为代表的对象存储,对比其他存储有很大的成本优势,所以新架构的演进就是要充分利用新计算和存储资源的优势。
- 轻量API和完善多语言SDK支持
RocketMQ 4.x 以前的协议,基于十多年前设计的私有Remoting协议,导致开发非 Java 语言的 SDK 成本非常高,所以 5.0 基于 gRPC 设计的全新 API 和 Proxy 模式,可以极大的方便多语言 SDK 开发,丰富多语言生态。
- 消息、事件、流场景与生态拓展集成
社区还开源了 EventBridge, Connector, Stream, MQTT 等周边项目,有助于完善和增强周边生态,拓展更多业务场景。
RocketMQ 5.0 的关键新特性
为了支持以上三个主要的演进目标,RocketMQ 5.0 版本引入了大量新的技术和特性,下面将一些关键特性逐个简要介绍,其中不少特性已经在腾讯云投入实际使用,并发挥了业务价值。
POP 消费模式
RocketMQ 5.0 之前版本只提供了Pull的消费模式(即使 PushConsumer 也是通过 Pull 和长轮训模拟的 Push 效果),Pull 消费模式和 Kafka 消费模式类似,也是需要在客户端做负载均衡,计算客户端实例和队列的映射关系,然后再消费消息和维护队列的位点信息,通过新的 POP 消费模式,带来了以下明显的好处:
-
不需要在客户端计算分配逻辑,简化客户端逻辑
-
降低了客户端SDK开发的复杂度,便于快速支持多语言客户端
-
消费位点完全维护在Broker端,避免单个消费节点慢导致消费延迟
-
适配其他协议的Proxy模式更顺畅,方便支持多消费模型时做推拉转换
腾讯云在 RocketMQ 5.0 的产品形态中,支持5.0新协议和兼容其他消息协议的过程中,都采用了 POP 消费模式,方便支持了Proxy的完全无状态和负载均衡。
更详细的POP方案设计扩展阅读参考:
基于gRPC的新API设计
RocketMQ 社区过去几年在支持 RocketMQ 4.x 客户端的过程中,越来越意识到 Remoting 协议的不足,开发非Java SDK的门槛和成本过高,导致各个公司推出了基于 HTTP 等其他协议多种兼容 Proxy 方案,这次新 API 相当于官方出了一个统一的可扩展 Proxy 方案,方便各公司在这个 Proxy 的基础上,合并兼容一些其他协议,统一和简化架构,最终形成一个以RocketMQ Broker 为存储内核,兼容各种消息协议的无状态 Proxy 的存算分离统一架构。
腾讯云在落地新架构的过程中,因为 Proxy 要处理协议序列化和转换等 CPU 密集型计算,要注意对 CPU 占用的优化,我们也向社区提了多个优化代码,以下是我们对4C8G规格的参考压测数据:
Proxy 压测过程中典型火焰图占用分析如下:
更详细的关于新方案设计和扩展阅读详见:
秒级定时消息
定时消息是在线消息场景经常用的一种消息类型,发送方发送消息以后,并不想让订阅方立即消费到消息,而是等一段时间以后,消息对订阅方可见,典型的业务场景是订单下单五分钟后检查订单状态,或交易成功后第二天固定时间生成积分或优惠券。
RocketMQ 5.0 之前的版本,只能利用重试消息固定间隔的机制,实现Level固定级别的定时消息,5.0 新版本中重新实现了定时消息,可以支持超大规模超⻓时间任意秒级粒度的定时消息。
更详细的关于秒级定时消息方案设计和扩展阅读参考:
分层存储
RocketMQ 4.x 只支持本地磁盘或云盘等块设备作为持久化存储介质,块设备存储虽然能带来低延迟和可靠性,但是其存储成本却是对象存储的5~10倍,而消息队列数据是典型的冷热分布的数据,根据作者在实际系统的统计,约85%热数据在10分钟内通过内存缓存读取,其次10%温数据可能会在1小时内读走,约有5%的冷数据只有长时间堆积或回溯消费的场景才会被读到。
RocketMQ 5.0 引入了分层存储技术,可以将冷数据搬迁到更廉价的存储中,比如对象存储,可以在不降低用户体验的前提下,极大的降低综合存储成本。实现思路如下图所示,通过写入时将消息异步复制到分层存储,读取时优先读取本地存储,不命中的话再读取远程存储,实现分层存储的目的。
腾讯云在落地分层存储的过程中,一级存储选择了腾讯云云盘CBS,二级存储选择了腾讯云对象存储COS,以下表格是我们在腾讯云上的一个性能测试报告,开启分层存储对在线业务几乎不会有影响,这也与代码预期行为一致(dispatch异步写对象存储、热数据读本地缓存),二级存储单分区消费可以支持7500msg/s,扩分区可以等比例扩容消费速度,可以满足线上需求标准。
更详细的实现方案详见RIP文档:
基于KV的百万队列索引
RocketMQ 4.x 版本中,每个Topic实际都是由多个队列来存储消息的,队列的数据存在统一的Commitlog中,消息队列索引是通过文件队列来存储消息索引的,当队列少于1万时,可以稳定高效的提供读写服务,当队列数超过10万以后,队列索引会退化成严重的随机写,导致性能严重下降
RocketMQ 5.0 引入 RocksDB 存储队列索引,利用 RocksDB 的 LSM 索引结构特性,将大量文件队列索引的随机写转化为 SST 文件的顺序写,即使有上百万个消息队列,从整个架构看,底层云盘依然只有少量的顺序写文件,依然可以稳定的提供消息读写服务。
以下是在我们测试环境测得的数据,队列数量少的时候,两个方案的从TPS和耗时指标差别不大,但是队列数超过20万以后,基于RocksDB的索引方案性能和稳定性的优势明显。
更详细的实现方案介绍参考:
原生批量消息支持
RocketMQ 4.x 的版本中的批量消息是一个“伪批量”消息实现,需要在发送方发送一个业务层面组织好的消息数组,RocketMQ Broker 收到消息数组后,会再拆成多个消息,逐个处理消息的写入,旧方案虽然兼容性好,实现简单,但是只优化了网络开销,压缩和存储性能优化不明显。
RocketMQ 5.0 引入了新的 AutoBatch 特性,对批量消息做了全链路的优化,从发送端的自动攒批编程界面,到新的存储格式和索引结构,都做了全面的优化。
以下是 RocketMQ 社区咸鱼(guyinyou · GitHub)同学提供的几种场景的压测数据,对比普通消息吞吐量翻倍提升,对比 Kafka 同等节点规格和业务场景下可以达到几乎相同的吞吐,在分区增加的场景下,提供更优的发送延时抖动:
使用同样测试节点和 Kafka 作性能对比,部署架构都采用3节点2副本的测试场景下,同样 16 分区下可以达到几乎同样的吞吐量但更低的发送延时,并且随着分区数增加,RocketMQ的稳定性和发送延时有明显的优势。
更详细的设计文档和测试结果详见:
jRaft Controller 实现
RocketMQ 4.x 主从复制提供了简单高效的消息高可靠方案,但是一直存在一个无法自动切换主从的功能缺失,DLedger模式虽然通过基于Raft的三副本解决了自动选主的问题,但是性能比较差,并且机器成本高。
RocketMQ 5.0 新增了一个 Controller 组件(此组件可以和Namesrv合并部署),解决主从复制部署模式下自动切换的问题,但是社区默认的 Controller 组件是基于 DLedger 实现的,Raft 实现并不完善,腾讯云消息团队同学为社区提供了一个新的基于 SOFAJRaft 更成熟的 Raft 实现方案,可以实现更稳定可靠的主从切换。
不同副本和同步机制的性能对比如下图所示:
在腾讯云测试环境的混沌测试结果全部通过:
更多JRaft Controller的详细设计文档参考:
其他新特性索引
RocketMQ 社区针对大的特性变更,都会有详细RIP文档和评审流程,限于篇幅,本文只挑了几个关键新特性做了简要介绍,更多新特新可以参考社区全部 RIP 列表链接。
腾讯云 RocketMQ 的商业化历程
腾讯云消息队列团队过去几年基于 Apache RocketMQ 社区走过了完整的商业化历程,在2023年9月正式推出了5.x 商业化版本,提供极致弹性和更低成本的RocketMQ 服务,满足不同场景对 RocketMQ 的差异化需求,并已经在金融、出行、教育、游戏等多个行业落地实践。
新存算分离架构升级
在腾讯云内部,我们也将部署架构做了调整,按照 RocketMQ 5.0 推荐的存算分离架构,简化RocketMQ 的运维,也可以为用户提供更好的升降配弹性体验。
下图是 RocketMQ 5.0 新的存算分离架构:
全新的 5.0 Serverless 产品形态
基于以上新的存算分离新架构,我们推出了新的 TDMQ RocketMQ 5.0 Serverless 产品形态,通过全新的按量计费模式,并且专业版以上免费提供了弹性TPS的能力,可以更低成本来应对突发流量。
落地实践总结与展望
回顾 RocketMQ 过去十年的发展历程,可以看到 RocketMQ 社区的蓬勃发展和功能的快速迭代演进,并且在国内各大云厂商也有快速的落地支持,腾讯云也会持续的大力研发投入,给 RocketMQ 用户提供了更多更优的选择。
腾讯云在 RocketMQ 商业化过程中,也积极回馈 RocketMQ 社区,近一年腾讯云为 RocketMQ 社区贡献了 30+ 缺陷修复和性能优化代码合并,并且贡献了一个 RIP 67,也希望未来和 RocketMQ 社区更紧密配合,为 Apache RocketMQ 的繁荣发展做出贡献,为用户提供更优质的 RocketMQ 服务。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
面试官问我:线程锁导致的kafka客户端超时,如何解决?
本文分享自华为云社区《线程锁导致的kafka客户端超时问题》,作者: 张俭 。 问题背景 有一个环境的kafka client发送数据有部分超时,拓扑图也非常简单 定位历程 我们先对客户端的环境及JVM情况进行了排查,从JVM所在的虚拟机到kafka server的网络正常,垃圾回收(GC)时间也在预期范围内,没有出现异常。 紧接着,我们把目光转向了kafka 服务器,进行了一些基础的检查,同时也查看了kafka处理请求的超时日志,其中我们关心的metadata和produce请求都没有超时。 问题就此陷入了僵局,虽然也搜到了一些kafka server会对连上来的client反解导致超时的问题(https://github.com/apache/kafka/pull/10059),但通过一些简单的分析,我们确定这并非是问题所在。 同时,我们在环境上也发现一些异常情况,当时觉得不是核心问题/解释不通,没有深入去看 问题JVM线程数较高,已经超过10000,这个线程数量虽然确实较高,但并不会对1个4U的容器产生什么实质性的影响。 负责指标上报的线程CPU较高,大约占用了1/4 ~ 1/2...
- 下一篇
有道基于 Amoro Mixed Format 构建准实时湖仓实践
作者简介 谢怡,网易有道高级大数据开发工程师,目前主要参与实时计算和湖仓一体方向的研发 王涛,网易资深平台开发工程师,主要从事大数据和湖仓平台建设 业务背景 有道的数据层架构可分为离线和实时两部分,离线计算主要采用Hive、Spark,采用批处理的方式定时调度。实时部分采用 Flink+Doris(版本 0.14.0)构建实时数仓,用于处理实时埋点日志、业务库变更数据。ODS 层数据源为 Kafka 埋点日志、数据库业务数据,DWD、DWS层数据通过Flink计算引擎加工,写入 Doris 中。同时将 Doris 数据定时同步至 Hive,用于离线调度计算。该架构存在如下问题: 开发和运维成本高:Flink SQL 与 Hive/Spark 语法差异大,Hive/Spark 向 Flink 迁移成本高,Flink 大状态任务运维和优化难度高。 在全增量流式读取场景的支持性较弱,难以满足有道场景下 Flink 全量读取 Hive 历史数据及 Kafka 增量数据的需求。 流批存储不统一,造成双倍的数据开发和存储成本,且容易造成数据口径不一致。 Doris 作为数据孤岛,采用 SSD 存储...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- Linux系统CentOS6、CentOS7手动修改IP地址
- 2048小游戏-低调大师作品
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案