您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

Apache RocketMQ 5.0腾讯云落地实践

时间:2023-12-13 13:26:30  来源:  作者:OSC开源社区

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

Apache RocketMQ 5.0腾讯云落地实践

Apache RocketMQ 5.0腾讯云落地实践

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

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

  • [RIP 19] Server side rebalance, lightweight consumer client support:https://Github.com/apache/rocketmq/wiki/%5bRIP-19%5d-Server-side-rebalance,--lightweight-consumer-client-support
  • [RIP 51] Pop orderly improvement:https://github.com/apache/rocketmq/wiki/RIP-51-Pop-orderly-improvement

基于 gRPC 的新 API 设计

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

Apache RocketMQ 5.0腾讯云落地实践

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

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

Apache RocketMQ 5.0腾讯云落地实践

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

  • [RIP37] New and Unified APIs:https://shimo.im/docs/m5kv92OeRRU8olqX
  • [RIP39] Support gRPC protocol:https://shimo.im/docs/gXqmeEPYgdUw5bqo
  • [RIP55] Supportremoting protocol in rocketmq proxy module:https://github.com/apache/rocketmq/wiki/RIP-55-Support-remoting-protocol-in-rocketmq-proxy-module

秒级定时消息

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

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

Apache RocketMQ 5.0腾讯云落地实践

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

  • [RIP43] Support timing messages with arbitrary time delay:https://shimo.im/docs/gXqme9PKKpIeD7qo

分层存储

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

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

Apache RocketMQ 5.0腾讯云落地实践

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

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

  • [RIP57] Tieredstorage for RocketMQ:https://github.com/apache/rocketmq/wiki/RIP-57-Tiered-storage-for-RocketMQ
  • [RIP65] TieredStorage Optimization:https://github.com/apache/rocketmq/wiki/RIP-65-Tiered-Storage-Optimization

基于KV的百万队列索引

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

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

Apache RocketMQ 5.0腾讯云落地实践

Apache RocketMQ 5.0腾讯云落地实践

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

Apache RocketMQ 5.0腾讯云落地实践

Apache RocketMQ 5.0腾讯云落地实践

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

● [RIP66] Support KV(Rocksdb) Storage:https://github.com/apache/rocketmq/wiki/RIP-66-Support-KV(Rocksdb)-Storage

● 百万队列能力支持:https://www.bilibili.com/video/BV19u4y1r7Qd

原生批量消息支持

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

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

Apache RocketMQ 5.0腾讯云落地实践

Apache RocketMQ 5.0腾讯云落地实践

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

Apache RocketMQ 5.0腾讯云落地实践

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

Apache RocketMQ 5.0腾讯云落地实践

Apache RocketMQ 5.0腾讯云落地实践

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

  • [RIP26] Improve Batch Message Processing Throughput:https://github.com/apache/rocketmq/wiki/RIP-26-Improve-Batch-Message-Processing-Throughput
  • 活动回顾丨RocketMQ Meetup 开源开发者沙龙(含 PPT):https://mp.weixin.qq.com/s/qSbzqn0ZqsdRUjFpvNOuBg

jRaft Controller 实现

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

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

Apache RocketMQ 5.0腾讯云落地实践

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

Apache RocketMQ 5.0腾讯云落地实践

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

Apache RocketMQ 5.0腾讯云落地实践

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

  • [RIP44] Support DLedger Controller:https://github.com/apache/rocketmq/wiki/RIP-44-Support-DLedger-Controller
  • [RIP67] jRaft-Controller Implemention:https://docs.google.com/document/d/1mpzTv1vnWxQwPGsHj6Ng2fK9aL9f6MZFw7ZgvW5284o
  • jRaft Controller 故障测试报告:https://docs.google.com/document/d/1eWaKHcs3jGoWtqzmhQovhvKecY1EFW9BLIP0pfA-5fQ/edit#heading=h.d5b71yh9i1wy

其他新特性索引

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

腾讯云 RocketMQ 的商业化历程

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

新存算分离架构升级

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

Apache RocketMQ 5.0腾讯云落地实践

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

Apache RocketMQ 5.0腾讯云落地实践

全新的 5.0 Serverless 产品形态

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

Apache RocketMQ 5.0腾讯云落地实践

落地实践总结与展望

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

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



Tags:RocketMQ   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
大白话设计RocketMQ延迟消息
延迟消息一般用于:提前发送消息,延迟一段时间后才需要被处理的场景。比如:下单半小时后还未支付,则取消订单 释放库存 等。RocketMQ的延迟消息使用上非常便捷,但是不支持任意时间...【详细内容】
2023-12-27  Search: RocketMQ  点击:(102)  评论:(0)  加入收藏
九个问答牢记RocketMQ架构
RocketMQ是Java兄弟们常用的消息中间件,虽说常用,但对于RocketMQ架构经常忘记。究其原因就2点:忙于业务开发然后长时间不看则忘了、不理解架构设计的根本原因记不牢。本文用大...【详细内容】
2023-12-27  Search: RocketMQ  点击:(111)  评论:(0)  加入收藏
如何应对 RocketMQ 消息堆积
这篇文章,我们聊聊如何应对 RocketMQ 消息堆积。图片1 基础概念消费者在消费的过程中,消费的速度跟不上服务端的发送速度,未处理的消息会越来越多,消息出现堆积进而会造成消息消...【详细内容】
2023-12-21  Search: RocketMQ  点击:(71)  评论:(0)  加入收藏
解锁RocketMQ秘籍:如何保障消息顺序性?
嗨,小伙伴们!小米在这里啦!今天我们要聊的话题是社招面试中一个经典而又百思不得其解的问题——“RocketMQ如何保证顺序性?”不用担心,小米来给你揭秘RocketMQ的秘密武...【详细内容】
2023-12-15  Search: RocketMQ  点击:(95)  评论:(0)  加入收藏
Apache RocketMQ 5.0腾讯云落地实践
Apache RocketMQ 发展历程回顾RocketMQ 最早诞生于淘宝的在线电商交易场景,经过了历年双十一大促流量洪峰的打磨,2016年捐献给 Apache 社区,成为 Apache 社区的顶级项目,并在国...【详细内容】
2023-12-13  Search: RocketMQ  点击:(129)  评论:(0)  加入收藏
聊聊 RocketMQ 5.0 的 POP 消费模式!
大家都知道,RocketMQ 消费模式有 PULL 模式和 PUSH 模式,不过本质上都是 PULL 模式,而在实际使用时,一般使用 PUSH 模式。不过,RocketMQ 的 PUSH 模式有明显的不足,主要体现在以下...【详细内容】
2023-05-16  Search: RocketMQ  点击:(302)  评论:(0)  加入收藏
深扒RocketMQ源码之后,我找出了RocketMQ消息重复消费的7种原因
在众多关于MQ的面试八股文中有这么一道题,“如何保证MQ消息消费的幂等性”。为什么需要保证幂等性呢?是因为消息会重复消费。为什么消息会重复消费?明明已经消费了,为什么消息会...【详细内容】
2023-04-13  Search: RocketMQ  点击:(237)  评论:(0)  加入收藏
SpringBoot整合RocketMQ,老鸟们都是这么玩的!
今天我们来讨论如何在项目开发中优雅地使用RocketMQ。本文分为三部分,第一部分实现SpringBoot与RocketMQ的整合,第二部分解决在使用RocketMQ过程中可能遇到的一些问题并解决...【详细内容】
2023-04-12  Search: RocketMQ  点击:(429)  评论:(0)  加入收藏
SpringBoot 与RabbitMQ、RocketMQ高可靠、高性能、分布式应用实践
Spring Boot 是一个基于 Spring 框架的快速开发框架,而 RabbitMQ 和 RocketMQ 则是常用的消息队列中间件。下面是它们常用的一些用法和场景。 订单处理在电商等系统中,下单后...【详细内容】
2023-03-09  Search: RocketMQ  点击:(204)  评论:(0)  加入收藏
通过源码分析RocketMQ主从复制原理
作者:京东物流 宫丙来一、主从复制概述 RocketMQ Broker的主从复制主要包括两部分内容:CommitLog的消息复制和Broker元数据的复制。 CommitLog的消息复制是发生在消息写入时,当...【详细内容】
2023-03-02  Search: RocketMQ  点击:(62)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(5)  评论:(0)  加入收藏
站内最新
站内热门
站内头条