【RocketMQ】初识

news2024/11/20 15:35:28

基础概念

  • Message(消息):Message 是 RocketMQ 传输的基本单元,包含了具体的业务数据以及一些元数据(如消息 ID、主题、标签、发送时间等)。消息可以是文本、二进制数据或其他任何序列化后的对象形式。
  • Topic(主题):Topic 是一类消息的逻辑分类名,是 Apache RocketMQ 中消息传输和存储的顶层容器。类似于邮件系统中的邮箱地址或发布/订阅模式中的“频道”。生产者向特定的 Topic 发送消息,消费者则根据 Topic 订阅并接收消息。一个 Topic 可以被多个生产者写入,同时也能被多个消费者订阅。
  • Queue(队列):每个 Topic 被划分为多个 Queue(队列),或称 MessageQueue,这些队列用于存储消息。生产者发送到 Topic 的消息会被分配到其下的各个 Queue 中;消费者则是从这些 Queue 中拉取消息进行消费。

这里的Topic和Queue都是“逻辑上”的概念,这个“逻辑上”的意思是涉及到一些MQ的使用、原理、机制的时候默认的名词概念,而不是实际物理意义上的结构和设计

  • Subscription(订阅):Subscription 表示消费者对某个 Topic 消息的兴趣表达。订阅关系由消费者分组动态注册到服务端系统,并在消息传输中按照订阅关系定义的过滤规则进行消息匹配和消费进度的维护。
  • Producer(生产者):生产者是消息产生的源头,将消息发送到服务端指定 Topic。
  • Consumer(消费者):消费者负责从服务端中拉取消息并进行处理。
  • ProducerGroup(生产者组):ProducerGroup 是一组生产者的逻辑分组,共享同样的 Topic 发送配置,实现发送端的负载均衡和容错。如果组内某个生产者失败,其他生产者可以继续工作,保证消息发送的连续性。
  • ConsumerGroup(消费者组):消费者分组是 Apache RocketMQ 系统中承载多个消费行为一致的消费者的负载均衡分组。和消费者不同,消费者分组并不是运行实体,而是一个逻辑资源。分组中的消费者共同订阅同一个 Topic 并以某种策略(如广播、集群消费)消费消息。在 Apache RocketMQ 中,通过消费者分组内初始化多个消费者实现消费性能的水平扩展以及高可用容灾。

技术架构(物理架构)

Apache RocketMQ 服务端基础组件包括 NameServer、Broker、Proxy

  • Broker:RocketMQ 是一个典型的发布订阅系统,通过 Broker 节点中转和持久化数据,解耦上下游。Broker 是真实存储数据的节点,由多个水平部署但不一定完全对等的副本组构成,单个副本组的不同节点上的数据会达到最终一致。单个副本组同一时间只有一个可读写的 Master 和若干个只读的 Slave,主故障时会进行选举来容忍故障,此时单个副本组可读不可写。
  • NameServer: 是独立的一个无状态组件,接受 Broker 的元数据注册并动态维护着一些映射关系,同时为客户端提供服务发现的能力。
  • Proxy:先跳过

RocketMQ 部署模式分两种:

  • 直连部署模式 (NameServer、Broker)
  • 存储计算分离模式部署(Proxy)

直连部署模式

直连部署模式下,实际物理架构包括两个组件:

  • NameServer
  • Broker

RocketMQ直连部署模式

Producer 和 Consumer 会和 NameServer,Broker 都维持长连接。Producer 只会向 Master 副本发送消息,Consumer 可以从 Master 或者 Slave 消费消息。

存储计算分离模式部署

存储和计算分离是一种良好的模块化设计。无状态的 Proxy 集群是数据流量的入口,提供签名校验与权限控制、计量与可观测、客户端连接管理、消息编解码处理、流量控制、多协议接入等能力。原 Broker 节点演化为以存储为核心的有状态集群,支持读写多类型消息,它们的底层是多模态存储和多元化的高效索引。存储计算分离的形态利于不同业务场景下单独调整存储或计算节点的数量,来实现扩容和缩容。网关模式接入还能带来升级简单,组网便利等好处。Proxy 和 Broker 都属于服务端组件,内网通信的延迟不会显著增加客户端收发消息的延迟。
存储计算分离模式部署

Proxy 自身会向 NameServer 和 Broker 都建立长连接,Producer 和 Consumer 仅连接到 Proxy

通信机制

Apache RocketMQ 客户端使用 TCP 访问服务端,根据传输的数据格式分为 Remoting 协议和 gRPC 协议。

  • Remoting 协议诞生较早,是组件间通信默认的私有协议。其中 Remoting Java 客户端和主仓库同步演进和迭代,而多语言客户端归属于 Apache 社区多个独立仓库。
  • gRPC 协议自 RocketMQ 5.0 版本推出,以 Protobuf 定义了底层传输的数据格式(详见 RocketMQ API),旨在以云原生主流技术演进轻量、标准、易扩展的客户端服务端通信协议。使用 gRPC 协议的 SDK 是以独立仓库 RocketMQ Clients 方式演进,支持 Java/C++/.NET/Go/Rust 等众多语言。
  • RocketMQ 5.0 在服务端内部也提供了基于 Protobuf + gRPC 的管控 API 实现。

RocketMQ 的接入点是什么?为了简化客户端配置的复杂度:

  • 以直连模式部署的集群,客户端需要和服务端的 NameServer,Broker 进行点对点直连通信,客户端需要配置 NameServer 集群的负载均衡地址。
  • 以代理模式部署的集群,无论客户端使用 Remoting 还是 gRPC 协议,客户端仅需和 Proxy 进行通信,需要将配置接入点为 Proxy 的负载均衡地址。服务端会使用协议协商技术,自动区分 Remoting 和 gRPC 协议并处理客户端的请求。
  • 在受限网络环境中,客户端需要同时放通接入点的 8080 和 8081 端口。

存储机制

元数据管理

所谓元数据,就是产生的消息的原始数据。
为了提升整体的吞吐量与提供跨副本组的高可用能力,RocketMQ 服务端一般会为单个 Topic 创建多个逻辑分区,即在多个副本组(Broker:Master+Slave)上各自维护部分分区 (Partition),我们把它称为队列 (MessageQueue)。同一个副本组上同一个 Topic 的队列数相同并从 0 开始连续编号,不同副本组上的 MessageQueue 数量可以不同。

说人话:

  • 先不考虑Broker,一般的Topic的消息都会被打散到多个队列中,多队列本身就是为了提升多个消费者模式下的吞吐量;
  • 只有一个Broker的情况下 ,没啥可讲的,这些队列肯定是全放到这个Broker中去;
  • 现在为了提升吞吐量,增加了多个Broker副本,假如某个Topic对应5个逻辑队列,对于所有的Broker而言,它们肯定需要包含全部的5个队列,但是对于某一个Broker而言,它可能只需要维护5个中的4个/3个/2个/1个队列;

RocketMQ原始消息管理

高效的存储层实现

RocketMQ 存储的核心是极致优化的顺序写盘,数据以 append only 的形式不断的将新的消息追加到文件末尾。RocketMQ 使用了一种称为 MappedByteBuffer 的内存映射文件的办法,将一个文件映射到进程的地址空间,实现文件的磁盘地址和进程的一段虚拟地址关联,实际上是利用了NIO 中的 FileChannel 模型。在进行这种绑定后,用户进程就可以用指针(偏移量)的形式写入磁盘而不用进行 read / write 的系统调用,减少了数据在缓冲区之间来回拷贝的开销。当然这种内核实现的机制有一些限制,单个 mmap 的文件不能太大 (RocketMQ 选择了 1G),此时再把多个 mmap 的文件用一个链表串起来构成一个逻辑队列 (称为 MappedFileQueue),就可以在逻辑上实现一个无需考虑长度的存储空间来保存全部的消息。
在这里插入图片描述

单条消息的存储格式

RocketMQ 有一套相对复杂的消息存储编码用来将消息对象序列化,随后再将非定长的数据落到上述的真实的写入到文件中,存储格式中包括了索引队列的编号和位置。单条消息的存储格式如下:
在这里插入图片描述

构建消息的索引

在数据写入 CommitLog 后,有一个后端的 ReputMessageService 服务 (也被称为 dispatch 线程) 会异步的构建多种索引(例如 ConsumeQueue 和 Index),满足不同形式的读取和查询诉求。在 RocketMQ 的模型下,消息本身存在的逻辑队列称为 MessageQueue,而对应的物理索引文件称为 ConsumeQueue。其中 dispatch 线程会源源不断的将消息从 CommitLog 取出,再拿出消息在 CommitLog 中的物理偏移量,消息长度以及 Tag Hash 等信息作为单条消息的索引,分发到对应的消费队列,构成了对 CommitLog 的引用 (Reference)。ConsumeQueue 中单条消息占用的索引空间只有 20B。当客户端尝试从服务端拉取消息时,会先读取索引并进行过滤,随后根据索引从 CommitLog 中获得真实的消息并返回。
在这里插入图片描述

客户端

RocketMQ 提供了灵活的负载均衡机制,主要体现在消费者如何均衡地从消息队列中获取消息。
主要分为三种消费模式:

  • Push(推送模式)
  • Pull(拉取模式)
  • Pop(无状态消费模式)

Push

RocketMQ 中的 Push 并不是指传统意义上的客户端完全被动接收,底层是基于长轮询机制实现。

  • 长轮询:客户端与 Broker 建立长连接,并发送拉取消息的请求。如果当前没有新消息,Broker 不会立即响应,而是等待一段时间或直到有新消息到达再返回。
  • 消费位点:每个消费者维护自己的消费进度(消费位点),Broker 根据这些位点信息,只推送消费者尚未消费的消息。
  • 重平衡:当消费者组内的消费者实例发生变化时(如增加或减少消费者实例),RocketMQ会触发一次重平衡(Rebalance)操作,重新分配消息队列到各个消费者实例,以实现负载均衡。这个过程确保了消息的均匀消费,避免了消息积压或某些消费者空闲的情况。

Pull

Pull 模式更加主动,消费者根据自己的消费能力和需求,主动从 Broker 拉取消息。

  • 主动拉取:消费者主动向Broker发送拉取请求,指定要拉取的消息数量和偏移量(或时间戳),Broker 响应包含消息或空结果。
  • 位点管理和重平衡:与Push模式类似,每个消费者维护自己的消费进度,并在消费者实例变化时进行重平衡。但是,在Pull模式下,重平衡的逻辑更依赖于消费者的主动参与,消费者需要根据新的队列分配情况调整自己的拉取策略。

Pop

Push / Pull 消费模式的负载均衡是在客户端完成的,性能较高,但也有一些缺陷。

  • 客户端代码逻辑复杂,客户端要实现完整的负载均衡,拉消息,位点管理,消费失败后将消息发回 Broker 重试等逻辑。这给多语言客户端的支持造成很大的阻碍。
  • 消费者无法无限扩展,当消费者数量扩大到大于队列数量时,有的消费者将无法分配到队列。
  • 当某些消费者僵死(hang 住)时,会造成其消费的队列的消息堆积。

在 RocketMQ 5.0 中,Pop 消费模式借助 gRPC 封装的接口,促进了轻量化多语言客户端的实现,无需在各客户端重复实现重平衡逻辑,显著提升了系统的灵活性和扩展性。该设计核心在于将重平衡、位点管理及消息重试等任务转移至服务端处理,有效避免单点故障引起的消息积压,优化了整体消息处理效率和系统的水平扩展能力。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MDIO Frame介绍

在MII管理界面上传输的框架应具有表22-10所示的框架结构。位传输顺序从左到右。 IDLE (IDLE condition) MDIO上的空闲条件是高阻抗状态。所有三个状态驱动器都应被禁用,而PHY的上拉电阻器将把MDIO线拉到一个逻辑线上。 PRE (preamble) 32位前导码,都是 1 ST (start of frame…

基于Springmvc的网上书城的设计与实现

文未可获取一份本项目的java源码和数据库参考 选题意义: 网上书城是以当前商务的网络化、快速化实际需求为背景,实现图书购买的方便、快捷、送货上门等服务为前提综合信息服务系统的设计;实现通过Internet互联网对图书购买的相关信息进行发…

jvm专题 之 内存模型

文章目录 前言一个java对象的运行过程jvm内存分布程序的基本运行程序对象什么是对象对象的创建一、类加载检查二、对象内存分配三、初始化零值四、设置对象头五、执行初始化方法 对象的访问定位 对象与类的关系由类创建对象的顺序 对象的创建 前言 一个程序需要运行&#xff0…

编程语言图书创作要注意的事情有哪些?

编程语言图书的创作是一项复杂且具有挑战性的任务,需要作者深入理解技术、清晰表达,并考虑读者的学习体验。一本优秀的编程书籍不仅能够教授技术知识,更能引导读者逐步深入,激发他们的思考和实际应用能力。以下将详细探讨编程语言…

Python库matplotlib之三

Python库matplotlib之三 小部件(widget)小部件的基类connect_eventdisconnect_events() Buttondisconnecton_clicked应用实列 CheckButtons构造器APIs应用实列 小部件(widget) 小部件(widget)可与任何GUI后端一起工作。所有这些小部件都要求预定义一个Axes实例,并将…

ASP.NET Core 创建使用异步队列

示例图 在 ASP.NET Core 应用程序中,执行耗时任务而不阻塞线程的一种有效方法是使用异步队列。在本文中,我们将探讨如何使用 .NET Core 和 C# 创建队列结构以及如何使用此队列异步执行操作。 步骤 1:创建 EmailMessage 类 首先&#xff0c…

工作繁杂,如何防止工作遗漏遗忘?

不知道大家工作中是否有这样的情况: 1.工作过程中工作任务经常被打断,打乱正常的工作节奏; 2.因为不方便统一记录工作及工作要求,经常忘记给领导反馈工作进展; 3.因为工作繁多,经常会出现工作遗漏遗忘的…

ass字幕文件怎么导入视频mp4?ass字幕怎么编辑?视频加字幕超简单!

ass字幕文件怎么导入视频mp4?ass字幕怎么编辑?在视频制作和观看过程中,添加字幕是一项常见的需求,特别是对于外语视频或需要辅助阅读的场景。ASS(Advanced SubStation Alpha)字幕文件是一种常用的字幕格式&…

Redission · 可重入锁(Reentrant Lock)

前言 Redisson是一个强大的分布式Java对象和服务库,专为简化在分布式环境中的Java开发而设计。通过Redisson,开发人员可以轻松地在分布式系统中共享数据、实现分布式锁、创建分布式对象,并处理各种分布式场景的挑战。 Redisson的设计灵感来…

华为OD机试 - 静态扫描(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

八LAMP搭建

# LAMP ## 一、知识回顾 ### FTP samba nfs 特点 - 借用Linux用户作为映射用户,进行权限管理 - 软件本身还有管理控制权限 #### 客户端连接到服务器后进行读写执行等操作 ,必须同时具有: - 软件许可的权限 vsftpd: anon upload enableYES - 文件…

PC端微信小程序如何调试?

向往常一样运行开微信小程序开发者工具 如果只弹出pc端小程序,没有出现调试的界面:点击胶囊按钮的三个…选择重新进入小程序 即可依次展开相应的功能调试,改完代码没反应再刷新看看,再没反应就再次重新点击编译并自动调试。

fish-speech语音大模型本地部署

文章目录 fish-speech模型下载编译部署 小结 fish-speech模型 先说下fish-speech模型吧,可以先看下官网。如下: 这就是一个模型,可以根据一个样例声音,构建出自己需要的声音。其实,这个还是有很多用途的;…

Tpflow:提升开发效率的PHP工作流引擎

Tpflow:提升开发效率的PHP工作流引擎 今天要跟大家介绍的是一款能够显著提升开发效率的工具——Tpflow!它是一个专门为PHP开发者设计的工作流引擎,致力于帮助你减少80%以上的代码量,轻松管理复杂的业务流程。让我们一起来看看它的…

win10安装Java闪退

问题:win10 在安装Java8时,电脑没有反应,出现闪退的现象。 1、打开设置找到“时间和语言” 2、找到“中文(简体,中国)” 3、点击“选项” 4、删除“百度输入法” 5、问题解决,再次安装Java

史上最细快速排序讲解(hoare,挖坑,双指针, 非递归)

文章目录 前言一、递归方法快排1. 递归主要思想2. 递归代码实现 二、hoare方法实现找基准值1. hoare思想2. hoare代码实现 三、挖坑方法实现找基准值1. 挖坑思想2. 挖坑代码实现 四、双指针方法实现找基准值1. lomuto前后指针法思想2. lomuto前后指针法代码实现 五、非递归方法…

第十四周:机器学习笔记

第十四周周报 摘要Abstract一、机器学习——Transformer(下)1. Transformer decoder1.1 autoregressive decoder(自回归解码器)1.2 Transformer decoder结构图1.3 non-autoregressive decoder(非自回归解码器&#xff…

24年最新 idea 插件开发教程,面试鸭插件技术实现!

大家好,我是松柏。今天给大家分享下这个JetBrains插件开发教程。 学习过程中可以参考开源项目:https://github.com/yuyuanweb/mianshiya-plugin 首先贴一下官方文档:https://plugins.jetbrains.com/docs/intellij/welcome.html 虽然这个文档…

【最新发布】Win10 22H2 19045.4957 正式版免费下载!

今日系统之家小编给大家分享2024年9月第二次更新的Windows10 22H2正式版系统,该版本系统基于最新Windows10 22H2 19045.4957 64位专业版进行离线制作,安全无毒,修复了使用某些环绕声技术时某些媒体的播放可能会停止等多项问题,系统…

基于C#开发的(CS界面)图书管理系统

图书管理系统项目开发说明书 项目简介 项目背景(选择这个项目的原因、前景,面向的用户,优势); 根据温州理工学院需要希望能够充分利用现代科技来提高图书管理的效率,在原有的办公系统基础上进行扩展&…