【深入浅出RocketMQ原理及实战】「云原生升级系列」打造新一代云原生“消息、事件、流“统一消息引擎的融合处理平台

打造新一代云原生"消息、事件、流"统一消息引擎的融合处理平台

  • 云原生架构
  • RocketMQ的云原生架构实现
    • RocketMQ的云原生发展历程
      • 互联网时期的诞生
        • 无法支持云原生的能力
      • 云原生阶段的升级
        • 云原生升级方向
          • 促进了Mesh以及多语言化发展
          • 可分合化的存算分离架构
            • 存储分离架构的优势
            • 存储分离架构的缺点
          • 弹性存储引擎
            • LSM(Log-Structured Merge)原理
          • 消息和流的统一
            • 流式消息VS简单消息
          • Serverless化
  • 最后预测 — 未来的事件驱动发展

云原生架构

在技术视角下,云原生架构是由一系列针对云原生技术的设计原则和模式构成,其主要目标是在云应用中去除最大限度的非业务代码部分,从而将这些非功能性特性(比如弹性、韧性、安全性、可观察性、灰度等)交由云基础设施来管理。这不仅消除了非功能性业务中断的问题,而且为业务赋予了轻量化、灵活性以及高度自动化的特质。

云原生架构可以理解为是云计算中天生的设计模式,它的“生命力”源自云计算技术,没有云计算,谈论云原生架构就如同空谈理论。

RocketMQ的云原生架构实现

在过去的数年中,RocketMQ基于大规模云计算环境的实践经验(例如,阿里(双十一、双十二)、携程(过年高峰期)),辅助了成千上万的企业完成数字化转型,从而实现了从互联网消息中间件到云原生消息中间件的发展变革。RocketMQ与其他消息中间件的一大区别就在于,它采用的是经过实践检验的云原生架构。接下来,我们要探讨RocketMQ在云原生架构领域的关键技术进步。

RocketMQ的云原生发展历程

随着消息队列行业的发展,Apache RocketMQ经历了12年的发展历程,可以被划分为两个阶段:互联网时期的诞生和云计算时期的成长。

互联网时期的诞生

RocketMQ是2011年诞生于淘宝核心电商系统,一开始是定位于服务集团业务,面向单一超大规模互联网企业设计,当时的架构存在一些痛点,无法很好地满足云计算场景的需求。其中包括以下问题:

无法支持云原生的能力

在弹性能力方面,目前存在一些问题,当然其他主流的开源消息项目也没有进行云原生架构转型,比如RabbitMQ无法水平扩展单队列能力、Kafka扩容需要大量数据拷贝和均衡。这些现有解决方案都不适用于为大规模客户提供弹性服务的公共云环境。

经过不断的努力和发展,在2016年,Apache RocketMQ开始向云端发展,成为了全球首个推出公有云SaaS版本的开源消息队列服务。同年,RocketMQ被阿里巴巴赠予Apache基金会,于2017年成为首个中国互联网中间件获得TLP(Top-Level Projects,顶级项目)身份。

云原生阶段的升级

在开源发展和云计算的推动下,RocketMQ不仅在阿里巴巴内部实现大规模应用,还助推了各行各业的数字转型。至2022年,随着5.0版本的发布,Apache RocketMQ正式进入了云原生的新阶段。

RocketMQ5.0 面向云计算的场景进行重新设计,期望从架构层面解决根本性问题,对客户端、Broker到存储引擎全面升级,如下图所示:

云原生升级方向

下一步,我们将对RocketMQ5.0版本在技术层面的更新进行评估和深度探讨。我们将按照以下几个主题进行讨论和解析。

促进了Mesh以及多语言化发展

在RocketMQ 5.0中,大量的逻辑被下沉到服务端,使得SDK的代码行数减少了60%。这种下沉的设计使得开发和维护多语言SDK的成本大幅度降低。同时,这也使得RocketMQ的SDK变得更加轻量化,更容易被Service Mesh、Dapr等云原生代表技术集成。通过将逻辑下沉到服务端,RocketMQ能够提供更简洁且高效的SDK,为开发人员带来更好的开发和集成体验。

可分合化的存算分离架构

用户根据不同的场景诉求,既可以同一进程启动存储和计算的功能,也可以将两者分开部署。

分开部署后的计算节点可以实现"无状态",这意味着一个接入点可以代理所有的流量。通过在云平台上结合新的硬件内核旁路技术,可以减少分离部署所带来的性能和延迟问题。另一方面,选择"存储计算一体化"架构则具备"就近计算"的优势,即计算节点与存储节点在物理上更接近。这种架构能够提供更佳的性能,因为计算可以直接在存储节点上进行,无需跨越网络进行数据传输。综合而言,通过分离部署和存储计算一体化,可以在云平台上获得更高的性能和更低的延迟。

存储分离架构的优势

在云上多租户、多VPC(虚拟私有云)复杂网络、多协议接入的场景中,采用存储计算分离的模式可以避免直接将后端存储服务暴露给客户端。这样做有助于实现对流量的控制、隔离、调度、权限管理以及协议转换等功能。通过将存储和计算分离,可以更好地管理和保护后端存储服务,并提供一种更灵活、高效、安全的数据处理方式。这种模式适用于复杂的云上环境,可确保安全性和可扩展性,并提供更好的管理和控制能力。

存储分离架构的缺点

有利必有弊,存算分离也同时带来了链路变长、延迟增大、机器成本上升等问题,运维也没得到简化,除了要运维有状态存储节点外,还要多运维无状态计算节点。在大数据传输场景下,存算一体能够极大降低机器及流量成本,这个从Kafka的架构演进也可以得到印证。

在大多数简单的消息收发场景中,数据链路通常只涉及写入日志和读取日志,没有复杂的计算逻辑(相对于数据库来说,计算逻辑非常简单)。在这种情况下,选择存储计算一体化架构是最佳选择,因为它简单易用、性能高、延迟低,并且足以满足需求。这种架构能够提供高效的数据处理,适用于需要快速、高效的消息收发的场景。

弹性存储引擎

为了适应面向物联网海量设备和云上大规模小客户的场景,RocketMQ引入了LSM(Log-Structured Merge)的KV(Key-Value)索引,实现了单机处理海量队列的能力。队列数量可以无限扩展,以进一步释放云存储的潜力。

LSM(Log-Structured Merge)原理

RocketMQ引入了LSM(Log-Structured Merge)的KV(Key-Value)索引时,它改变了消息队列的存储方式和索引结构。

  • 传统的消息队列:通常使用的是基于B+树的索引结构,这种结构在插入和删除操作时存在频繁的磁盘IO,限制了消息队列的吞吐量和性能。
  • 升级的消息队列:LSM索引采用了一种更高效的存储方式。它将消息按顺序记录到磁盘上的多个日志文件(Log File)中,称为写日志(Write Log),同时,还维护一个内存中的索引(MemTable),用于加速消息的查找操作。

当内存中的索引(MemTable)达到一定大小时,它会被转化为一个只读的磁盘上的索引文件(SSTable,Sorted String Table)。并且,多个SSTable可以合并成更大的文件,以减少读操作时的磁盘IO次数。这个过程被称为合并(Merge)。

  • 文件合并:通过这种LSM索引的设计,RocketMQ实现了快速的写入和顺序读取,并且能够支持海量的队列数量和高吞吐量的消息处理。同时,由于合并操作的特性,也使得RocketMQ具备了优化存储空间和提高读取性能的能力。
  • 分级存储,RocketMQ将消息的存储时长从原来的3天提高到月份或年份级别,并且存储空间可以无限扩展。
  • 冷热存储,RocketMQ还将冷热数据进行了分离,将冷数据的存储成本降低了80%。这些改进措施使得RocketMQ能够更好地满足大规模部署、高容量存储以及成本效益的需求。

RocketMQ引入LSM的KV索引通过将消息顺序写入磁盘日志,利用内存中的索引及合并操作,实现了高效的写入、读取和存储管理,从而提高了整体性能和可扩展性

消息和流的统一

Streaming/顺序消息的场景,客户端需要指定Topic下的某个队列(也称分区)进行消息顺序收发,在流场景里面,还有一个很重要的变化,就是数据类型的变化。

在新架构里,对客户端屏蔽物理队列,引入逻辑队列概念,一个逻辑队列通过横向分片和纵向分段,分散在不同的物理存储节点。

  • 横向分片:解决了高可用问题,同一个逻辑队列的多个分片多点随机可写,基于Happen before的原理保序,秒级 Failover,无需主备切换;
  • 纵向分片:解决逻辑队列的扩容问题,通过多级队列映射,实现0数据迁移的秒级扩容,逻辑资源和物理资源的弹性伸缩解耦。
流式消息VS简单消息
  • 做个简单对比,业务集成场景,消息的数据承载的是业务事件,比如说订单操作、物流操作,它特点就是数据规模较小,但是它每一条数据的价值都特别高,它的访问模式是偏向于在线的,单条事务的短平快访问模式。

  • 在流的场景里面呢,它更多的是一些非交易型的数据。比如说用户日志,系统的监控、IoT 的一些传感器数据、网站的点击流等等。他的特点是数据规模有数量级的提升,但单条数据的价值比较低的,然后它的访问模式偏向于离线批量传输。所以在流的场景里面,RocketMQ 存储要面向高吞吐做更多的优化。

Serverless化

面向Serverless 的趋势,RocketMQ5.0从产品形态到技术架构都做了巨大的演进。在原有的架构里面,客户感知物理队列,物理队列绑定固定存储节点,强状态。Broker、客户端、物理队列的扩缩容互相耦合,负载均衡粒度是队列级,对Serverless的技术演进很不友好。

为了实现极致弹性Serverless,RocketMQ 5.0 对逻辑资源和物理资源做进一步的解耦。

在Messaging/无序消息的场景,客户指定Topic进行消息无序收发,新架构对客户端屏蔽队列概念,只暴露逻辑资源 Topic。负载均衡粒度从队列级到消息级,实现了客户端的无状态化,客户端、服务端弹性伸缩解耦。

让我们看一下生产链路的负载均衡。生产者通过服务发现机制获取了Topic的数据分片和对应Broker的地址。其服务发现机制相对简单,通常采用默认的轮询(RoundRobin)方式将消息发送到各个Topic队列,以实现Broker集群的流量均衡。生产者是完全无状态的,因此无论是弹性伸缩还是其他变化,对其没有太多影响。

最后预测 — 未来的事件驱动发展

将有超过60%的新型数字商业解决方案会使用"事件驱动"模式。为了适应此趋势,Messaing正在演变为Eventing,诸如EventBridge(EventBroker)的产品形态便应运而生。在EventBridge中,“事件”概念成为一等公民,事件的发布者和订阅者无需依赖任何具体的消息队列SDK和实现。

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

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

相关文章

message: 没有找到可以构建的 NPM 包,请确认需要参与构建的 npm 都在 `miniprogra

第一步:修改 project.config.json 文件 "packNpmRelationList": [{"packageJsonPath": "./package.json","miniprogramNpmDistDir": "./miniprogram/"}], "packNpmManually": true 第二步:…

QDialog

属性方法 样式表 background-color: qlineargradient(spread:reflect, x1:0.999896, y1:0.494136, x2:1, y2:1, stop:0 rgba(0, 0, 0, 255), stop:1 rgba(255, 255, 255, 255));border: 1px groove rgb(232, 232, 232);border-radius: 20px; QDialog 的常用方法: e…

35--JDK新特性

1、新语法结构 新的语法结构,为我们勾勒出了 Java 语法进化的一个趋势,将开发者从复杂、繁琐的低层次抽象中逐渐解放出来,以更高层次、更优雅的抽象,既降低代码量,又避免意外编程错误的出现,进而提高代码质…

数据结构和算法-B+树(性质 查找)

文章目录 B树叶子节点B树的查找第一种查找方式第二种查找方式 小结 B树 B树节点的关键个数1B树该节点的子树个数 B树节点的关键字个数和节点的子树个数一样 叶子节点包含全部关键字,并且都相互链接了 叶子节点 根节点也能是叶子节点 B树的查找 第一种查找方式…

2022年全国职业院校技能大赛(高职组)“云计算”赛项赛卷①第一场次:私有云

2022年全国职业院校技能大赛(高职组) “云计算”赛项赛卷1 第一场次:私有云(30分) 目录 2022年全国职业院校技能大赛(高职组) “云计算”赛项赛卷1 第一场次:私有云&#xff0…

echarts手动触发气泡的显示和隐藏

点击echarts图表后将点击的那个进行突出显示 <template><div id"demo"> </div><el-button type"primary" click"set">设置</el-button><el-button type"primary" click"cancel">取消&…

C语言程序设计——输入输出函数

写给自己 工作之后&#xff0c;已经好久没有学习编程、码代码了&#xff0c;因为最开始是从python开始接触的编程&#xff0c;所以对于一些底层的逻辑了解不够清晰&#xff0c;所以打算从0开始学习一下C语言程序。 C语言 关于其相关历史优劣等&#xff0c;在这里不再一 一赘…

git上传代码到github远程仓库

1、添加SSH公钥 为了把本地的仓库传到github&#xff0c;还需要配置ssh key&#xff0c;说白了就是为了把本地的代码上传到github。 1、前置准备 本地需要安装git&#xff1a;Git - Downloads。安装成功后本地右键鼠标会多出一些git选项。 2、添加SSH Key 首先在本地创建s…

Note: An Interesting Festival

An Interesting Festival 一个有趣的节日。 festival The Agricultural Feast takes place after the independence Day. 农业盛会在独立日后举行 takes place independence feast agricultural It is not a worldwide celebration. 它不是一个全球的庆典。 worldwide ce…

【教学类-43-11】 20231231 3*3宫格数独提取单元格坐标数字的通用模板(做成2*2=4套、3*2=6套)

背景需求&#xff1a; 1、以前做单元格填充&#xff0c;都是制作N个分开的单元格 &#xff08;表格8&#xff09; 2、这次做五宫格数独的Word模板&#xff0c;我图方便&#xff0c;就只用了一个大表格&#xff0c;第六行第六列隐藏框线&#xff0c;看上去就是分开的&#xff…

redis安装与配置(Ubuntu)

目录 1. 切换到 root 用户 2. 搜索安装包 3. 安装 redis 4. 查看 redis 是否正常存在 5. 修改ip 6. 重新启动服务器 7. 连接服务器 1. 切换到 root 用户 通过 su 命令切换到 root 用户。 2. 搜索安装包 apt search redis 这里安装的是下面的版本&#xff1a; 3. 安装 …

《深入理解C++11:C++11新特性解析与应用》笔记七

第七章 为改变思考方式而改变 7.1 指针空值--nullptr 7.1.1 指针空值&#xff1a;从0到NULL&#xff0c;再到nullptr 传统C头文件里NULL是一个宏定义&#xff1a; 在函数重载同时出现int和char *参数版本的函数时&#xff0c;使用NULL作为参数调用函数会调用int参数版本&…

Anaconda3 2021.11安装

1. 镜像下载&#xff1a;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2. 安装在D盘&#xff1a; 3. 配置环境变量&#xff1a; 在这里&#xff0c;第一个教程A在系统变量里配置了五个&#xff0c;但我没有 所以又搜了教程B&#xf…

python命令大全及说明,python命令大全下载

大家好&#xff0c;本文将围绕python命令大全及说明展开说明&#xff0c;python命令大全下载是一个很多人都想弄明白的事情&#xff0c;想搞清楚python简单命令语句需要先了解以下几个事情。 Python有哪些常用但容易忘记的命令&#xff1f; 1 如何忽略报错信息2 Python常见绘图…

【Pytorch】Pytorch或者CUDA版本不符合问题解决与分析

NVIDIA CUDA Toolkit Release Notes Package installation issues INSTALL PYTORCH 先声毒人&#xff1a;最好资料就是上面三份资料&#xff0c;可以通过官网明确的获取一手信息&#xff0c;你所遇到的99%的问题都可以找到&#xff0c;明确的解决方案&#xff0c;建议最好看…

安全生产信息化平台是如何实现“五要素”的动态管理的

安全生产信息化平台以集成信息技术和管理理念为基础&#xff0c;实现了对“五要素”&#xff08;人、机、料、法、环&#xff09;的动态管理。以下是该平台如何实现这一目标的简要说明&#xff1a; 人员管理&#xff1a;通过建立员工档案和记录员工的安全培训、证书、违章记录等…

【Android Gradle 插件】Android Plugin DSL Reference 离线文档下载 ( GitHub 下载文档 | 查看文档 )

一、Android Plugin DSL Reference 文档下载 二、Android Plugin DSL Reference 文档查看 一、Android Plugin DSL Reference 文档下载 在之前的博客 【Android Gradle 插件】Android Plugin DSL Reference 文档介绍 ( 1.2 ~ 3.4 版本文档地址 | 4.1 ~ 7.1 版本文档地址 ) 中…

[Mac软件]ColorWell For Mac 7.4.0调色板生成器

美丽而直观的调色板和调色板生成器是任何Web或应用程序开发人员工具包的必要补充&#xff01; 创建无限数量的调色板&#xff0c;快速访问所有颜色信息和代码生成&#xff0c;用于应用程序开发&#xff0c;非常简单。可编辑调色板数据库允许您存档和恢复任何调色板&#xff0c…

PWM应用篇

一.什么是PWM 用图话&#xff0c;如下图所示&#xff1a; PWM&#xff08;脉冲宽度调制&#xff09;&#xff1a;这是一种模拟控制方式&#xff0c;可以根据载荷的变化来调制晶体管基极或MOS管栅极的偏置&#xff0c;实现晶体管或MOS管导通时间的改变&#xff0c;从而改变开关稳…

WPF+Halcon 培训项目实战 完结(14):完结总结,无代码

文章目录 前言相关链接项目专栏完结总结两个月的学习重学WPFWPF和Halcon联合开发 下一步的展望 前言 为了更好地去学习WPFHalcon&#xff0c;我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只做笔记分享&#xff0c;想要源码…
最新文章