Apache RocketMQ 5.0 腾讯云落地实践

Apache RocketMQ  发展历程回顾

image.png

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模式更顺畅,方便支持多消费模型时做推拉转换

image.png

image.png

腾讯云在 RocketMQ 5.0 的产品形态中,支持5.0新协议和兼容其他消息协议的过程中,都采用了 POP 消费模式,方便支持了Proxy的完全无状态和负载均衡。

更详细的POP方案设计扩展阅读参考:

  • [RIP 19] Server side rebalance,  lightweight consumer client support

  • [RIP 51] Pop orderly improvement

基于gRPC的新API设计

RocketMQ 社区过去几年在支持 RocketMQ 4.x 客户端的过程中,越来越意识到 Remoting 协议的不足,开发非Java SDK的门槛和成本过高,导致各个公司推出了基于 HTTP 等其他协议多种兼容 Proxy 方案,这次新 API 相当于官方出了一个统一的可扩展 Proxy 方案,方便各公司在这个 Proxy 的基础上,合并兼容一些其他协议,统一和简化架构,最终形成一个以RocketMQ Broker 为存储内核,兼容各种消息协议的无状态 Proxy 的存算分离统一架构。

image.png

腾讯云在落地新架构的过程中,因为 Proxy 要处理协议序列化和转换等 CPU 密集型计算,要注意对 CPU 占用的优化,我们也向社区提了多个优化代码,以下是我们对4C8G规格的参考压测数据:

image.png

Proxy 压测过程中典型火焰图占用分析如下:

image.png

更详细的关于新方案设计和扩展阅读详见:

  • [RIP37] New and Unified APIs

  • [RIP39] Support gRPC protocol

  • [RIP55] Supportremoting protocol in rocketmq proxy module

秒级定时消息

定时消息是在线消息场景经常用的一种消息类型,发送方发送消息以后,并不想让订阅方立即消费到消息,而是等一段时间以后,消息对订阅方可见,典型的业务场景是订单下单五分钟后检查订单状态,或交易成功后第二天固定时间生成积分或优惠券。

RocketMQ 5.0 之前的版本,只能利用重试消息固定间隔的机制,实现Level固定级别的定时消息,5.0 新版本中重新实现了定时消息,可以支持超大规模超⻓时间任意秒级粒度的定时消息。

image.png

更详细的关于秒级定时消息方案设计和扩展阅读参考:

  • [RIP43] Support timing messages with arbitrary time delay

分层存储

RocketMQ 4.x 只支持本地磁盘或云盘等块设备作为持久化存储介质,块设备存储虽然能带来低延迟和可靠性,但是其存储成本却是对象存储的5~10倍,而消息队列数据是典型的冷热分布的数据,根据作者在实际系统的统计,约85%热数据在10分钟内通过内存缓存读取,其次10%温数据可能会在1小时内读走,约有5%的冷数据只有长时间堆积或回溯消费的场景才会被读到。

RocketMQ 5.0 引入了分层存储技术,可以将冷数据搬迁到更廉价的存储中,比如对象存储,可以在不降低用户体验的前提下,极大的降低综合存储成本。实现思路如下图所示,通过写入时将消息异步复制到分层存储,读取时优先读取本地存储,不命中的话再读取远程存储,实现分层存储的目的。

image.png

腾讯云在落地分层存储的过程中,一级存储选择了腾讯云云盘CBS,二级存储选择了腾讯云对象存储COS,以下表格是我们在腾讯云上的一个性能测试报告,开启分层存储对在线业务几乎不会有影响,这也与代码预期行为一致(dispatch异步写对象存储、热数据读本地缓存),二级存储单分区消费可以支持7500msg/s,扩分区可以等比例扩容消费速度,可以满足线上需求标准。

image.png

更详细的实现方案详见RIP文档:

  • [RIP57] Tieredstorage for RocketMQ

  • [RIP65] TieredStorage Optimization

基于KV的百万队列索引

RocketMQ 4.x 版本中,每个Topic实际都是由多个队列来存储消息的,队列的数据存在统一的Commitlog中,消息队列索引是通过文件队列来存储消息索引的,当队列少于1万时,可以稳定高效的提供读写服务,当队列数超过10万以后,队列索引会退化成严重的随机写,导致性能严重下降

RocketMQ 5.0 引入 RocksDB 存储队列索引,利用 RocksDB 的 LSM 索引结构特性,将大量文件队列索引的随机写转化为 SST 文件的顺序写,即使有上百万个消息队列,从整个架构看,底层云盘依然只有少量的顺序写文件,依然可以稳定的提供消息读写服务。

image.png

image.png

以下是在我们测试环境测得的数据,队列数量少的时候,两个方案的从TPS和耗时指标差别不大,但是队列数超过20万以后,基于RocksDB的索引方案性能和稳定性的优势明显。

image.png

image.png

更详细的实现方案介绍参考:

  • [RIP66] Support KV(Rocksdb) Storage

  • 百万队列能力支持

原生批量消息支持

RocketMQ 4.x 的版本中的批量消息是一个“伪批量”消息实现,需要在发送方发送一个业务层面组织好的消息数组,RocketMQ Broker 收到消息数组后,会再拆成多个消息,逐个处理消息的写入,旧方案虽然兼容性好,实现简单,但是只优化了网络开销,压缩和存储性能优化不明显。

RocketMQ 5.0 引入了新的 AutoBatch 特性,对批量消息做了全链路的优化,从发送端的自动攒批编程界面,到新的存储格式和索引结构,都做了全面的优化。

image.png

image.png

以下是 RocketMQ 社区咸鱼(guyinyou · GitHub)同学提供的几种场景的压测数据,对比普通消息吞吐量翻倍提升,对比 Kafka 同等节点规格和业务场景下可以达到几乎相同的吞吐,在分区增加的场景下,提供更优的发送延时抖动:

image.png

使用同样测试节点和 Kafka 作性能对比,部署架构都采用3节点2副本的测试场景下,同样 16 分区下可以达到几乎同样的吞吐量但更低的发送延时,并且随着分区数增加,RocketMQ的稳定性和发送延时有明显的优势。

image.png

image.png

更详细的设计文档和测试结果详见:

  • [RIP26] Improve Batch Message Processing Throughput

  • 活动回顾丨RocketMQ Meetup 开源开发者沙龙(含 PPT)

jRaft Controller 实现

RocketMQ 4.x 主从复制提供了简单高效的消息高可靠方案,但是一直存在一个无法自动切换主从的功能缺失,DLedger模式虽然通过基于Raft的三副本解决了自动选主的问题,但是性能比较差,并且机器成本高。

RocketMQ 5.0 新增了一个 Controller 组件(此组件可以和Namesrv合并部署),解决主从复制部署模式下自动切换的问题,但是社区默认的 Controller 组件是基于 DLedger 实现的,Raft 实现并不完善,腾讯云消息团队同学为社区提供了一个新的基于 SOFAJRaft 更成熟的 Raft 实现方案,可以实现更稳定可靠的主从切换。

image.png

不同副本和同步机制的性能对比如下图所示:

image.png

在腾讯云测试环境的混沌测试结果全部通过:

image.png

更多JRaft Controller的详细设计文档参考:

  • [RIP44] Support DLedger Controller

  • [RIP67] jRaft-Controller Implemention

  • jRaft Controller 故障测试报告

其他新特性索引

RocketMQ 社区针对大的特性变更,都会有详细RIP文档和评审流程,限于篇幅,本文只挑了几个关键新特性做了简要介绍,更多新特新可以参考社区全部 RIP 列表链接。

腾讯云 RocketMQ 的商业化历程

腾讯云消息队列团队过去几年基于 Apache RocketMQ 社区走过了完整的商业化历程,在2023年9月正式推出了5.x 商业化版本,提供极致弹性和更低成本的RocketMQ 服务,满足不同场景对 RocketMQ 的差异化需求,并已经在金融、出行、教育、游戏等多个行业落地实践。

新存算分离架构升级

在腾讯云内部,我们也将部署架构做了调整,按照 RocketMQ 5.0 推荐的存算分离架构,简化RocketMQ 的运维,也可以为用户提供更好的升降配弹性体验。

image.png

下图是 RocketMQ 5.0 新的存算分离架构:

image.png

全新的 5.0 Serverless 产品形态

基于以上新的存算分离新架构,我们推出了新的 TDMQ RocketMQ 5.0 Serverless 产品形态,通过全新的按量计费模式,并且专业版以上免费提供了弹性TPS的能力,可以更低成本来应对突发流量。

image.png

落地实践总结与展望

回顾 RocketMQ 过去十年的发展历程,可以看到 RocketMQ 社区的蓬勃发展和功能的快速迭代演进,并且在国内各大云厂商也有快速的落地支持,腾讯云也会持续的大力研发投入,给 RocketMQ 用户提供了更多更优的选择。

腾讯云在 RocketMQ 商业化过程中,也积极回馈 RocketMQ 社区,近一年腾讯云为 RocketMQ 社区贡献了 30+ 缺陷修复和性能优化代码合并,并且贡献了一个 RIP 67,也希望未来和 RocketMQ 社区更紧密配合,为 Apache RocketMQ 的繁荣发展做出贡献,为用户提供更优质的 RocketMQ 服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/256486.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ST股票预测模型(机器学习_人工智能)

知己知彼,百战不殆;不知彼而知己,一胜一负;不知彼,不知己,每战必贻。--《孙子兵法》谋攻篇 ST股票 ST股票是指因连续两年净利润为负而被暂停上市的股票,其风险较高,投资者需要谨慎…

OpenCV4工业缺陷检测的六种方法

【文末送书】今天推荐一本机器视觉领域优质书籍 机器视觉 机器视觉是使用各种工业相机,结合传感器跟电气信号实现替代传统人工,完成对象识别、计数、测量、缺陷检测、引导定位与抓取等任务。其中工业品的缺陷检测极大的依赖人工完成,特别是…

微信Windows版-无效的WeChatWin.dll文件,错误码126

更新的微信Windows最新版本,突然有一天打开微信提示“无效的WeChatWin.dll文件 错误码 ErrorCode:126,点击“确定”下载最新版本”。 卸载重新安装跟到windows目录下替换WeChatWin.dll皆无效 该解决方案适用于Windows系统:Windows7、Windows10、Windows…

【HarmonyOS开发】ArkUI中的自定义弹窗

弹窗是一种模态窗口,通常用来展示用户当前需要的或用户必须关注的信息或操作。在弹出框消失之前,用户无法操作其他界面内容。ArkUI 为我们提供了丰富的弹窗功能,弹窗按照功能可以分为以下两类: 确认类:例如警告弹窗 Al…

t-SNE高维数据可视化实例

t-SNE:高维数据分布可视化 实例1:自动生成一个S形状的三维曲线 实例1结果: 实例1完整代码: import matplotlib.pyplot as plt from sklearn import manifold, datasets """对S型曲线数据的降维和可视化"&q…

proxysql读写分离组件部署

一、前言 在mysql一主两从架构的前提下,引入读写分离组件,可以极大的提高mysql性能,proxysql可以在高可用mysql架构发生主从故障时,进行自动的主从读写节点切换,即当mysql其他从节点当选新的主节点时,proxy…

状态管理@Prop

目录 1、父组件State到子组件Prop简单数据类型同步 2、父组件State数组项到子组件Prop简单数据类型同步 3、从父组件中的State类对象属性到Prop简单类型的同步 Prop主要用用于父组件到子组件的数据级联更新,父组件的数据变化会影响到子组件的数据变化&#xff0c…

Arma3/武装突袭3东风战役最后一关游戏无法保存的解决办法

Arma3这个游戏玩进去还是非常有可玩性的,可是在玩过了它本体自带的东风系列战役后,在最精髓的最后一关——game over这个关卡,却有个非常头疼的问题。 逃跑其实是非常简单的,但是想要无伤环游全岛确十分困难,因为这关卡…

Lazada商品详情API在电商中的价值及实时数据获取实践

一、引言 在电商行业,数据是驱动业务增长的关键。Lazada作为东南亚地区知名的电商平台,其商品详情API对于电商行业具有深远的影响。本文将探讨Lazada商品详情API在电商行业中的重要性,并介绍如何实现实时数据获取。 二、Lazada商品详情API的…

秋招总结_就业

2020秋招总结 【前言】 以下内容是写给研二学弟学妹们的秋招总结,研一的师弟师妹们如有需要,也可看看。先说一下我为什么要写这个总结: 1、时代在变化,社会在发展,一届有必要给下一届讲一些经验。 2、我平时和你们…

强大矢量图编辑器 Boxy SVG 激活最新

Boxy SVG for Mac功能介绍 1、干净,直观的UI深受Inkscape,Sketch和Adobe illustrator的启发 2、广泛支持画布上编辑对象几何,转换,绘画和其他属性 3、保存为SVG和SVGZ格式,导出为PNG,JPG,WebP和…

第二证券:耐心等待指数企稳 关注数据要素等板块

其时或是布局商场的时间窗口。2024年美联储或打开降息周期,欧洲降息预期也在增强,全球流动性有望迎来拐点。中心经济工作提及2024年的职业及工业方向,政策有望落地施行,将会为职业配备带来较多的催化要素,是具备配备价…

RTLS 解决现实场景的25种问题

实时定位系统 (RTLS) 可以改变我们理解周围世界的方式。 想想你有多少次停下来寻找某样东西。您可能正在寻找钥匙、电话、鞋子、零食、背包、办公室中的重要文件、停车场中的车辆,或者可能正在寻找街道标志或地标来引导自己。我们大多数人每天都会希望更好地了解我…

【参天引擎】华为参天引擎内核架构源码架构,多线程服务,数据节点管理,多节点间元数据管理

cantian引擎源码结构 ​专栏内容: 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点…

分享一个好看的vs主题

最近发现了一个很好看的vs主题(个人认为挺好看的),想要分享给大家。 主题的名字叫NightOwl,和vscode的主题颜色挺像的。操作方法也十分简单,首先我们先在最上面哪一行找到扩展。 然后点击管理扩展,再搜索栏…

北京冬雪中:邂逅那台加洛韦绿的路特斯Eletre

文|张 坤 北京的冬天时而让人情感交织:虽然雪后银装素裹,能够完美勾勒出城市寒素清澈的美景,映衬出红墙石砖的雄伟壮丽。但在深冬的寒风萧瑟中,也迫使人们紧裹衣衫,赏景之路亦多了几分艰辛。 在北京“…

9.鸿蒙app用户界面的跳转abilityslice的跳转

9.用户界面的跳转abilityslice的跳转,值传递,数值累加 首页页面显示1,第2页显示2,再次点击返回首页3。。。 MainAbilitySlice.java 关键代码: 点击事件 text.setClickedListener(new Component.ClickedListener() …

芯片高科技制造业如何实现高效且安全的文件数据传输

随着工业4.0的快速发展,制造行业作为一个长产业链且高度集中复杂的领域,数据与信息传输管理变得尤为重要,成为提高生产效率的关键因素。从研发、设计、采购、生产、库存、销售到售后等各个环节,整个业务流程都需要高效传递信息&am…

五年一贯专转本这么管用的记忆法你用了吗?

在枯燥无聊的学习当中,能有好的学习记忆方式就能事半功倍,但是怎样的学习记忆方式才适合我们呢?那我今天就给大家介绍一下吧,如果觉得好用,可以试试,让我们在之后的转本考试当中能有个好成绩!zb…

Vue2 即将结束支持!!!

Vue2 Vue 2.0 发布于 2016 年,已经有超过 7 年的历史,它是 Vue 框架成为主流的重要里程碑。许多当前的 Vue 用户都是在 Vue 2 时期就开始使用 Vue 的,并且有许多出色的项目是基于 Vue 2 构建的。 Vue2将弃用 随着 2024 年的临近&#xff0…