RocketMQ的运行架构

目录

      • 1. 核心组件
        • (1) NameServer
        • (2) Broker
        • (3) Producer
        • (4) Consumer
      • 2. 消息流转流程
      • 3. 高可用机制
      • 4. 扩展性与负载均衡
      • 5.容错机制
      • 5. 特殊功能支持
      • 6. 典型部署架构
      • 总结

RocketMQ 是一款高性能、高可靠的分布式消息中间件,其运行架构设计为分布式、可扩展、高可用的模式。以下是 RocketMQ 的核心运行架构及组件说明:
在这里插入图片描述


1. 核心组件

RocketMQ 的架构主要由以下四个核心组件构成:

(1) NameServer
  • 角色:轻量级的服务发现与路由管理组件(无状态,节点间不通信)。
  • 功能
    • 管理 Broker 的注册与心跳检测,维护 Topic 与 Broker 的路由关系。
    • 为 Producer 和 Consumer 提供 Topic 的路由信息查询。
  • 特点
    • 多个 NameServer 实例组成集群,避免单点故障。
    • Broker 启动时向所有 NameServer 注册,并定时发送心跳。
(2) Broker
  • 角色:消息存储与传输的核心节点,负责消息的持久化、投递和查询。
  • 功能
    • 消息存储:采用顺序写盘(Commit Log)和索引(Consume Queue)结合的方式,保证高性能。
    • 主从架构
      • Master:处理读写请求,支持同步/异步复制数据到 Slave。
      • Slave:备份数据,仅处理读请求(如消费落后时的消息拉取)。
    • 支持事务消息、延迟消息、重试队列等功能。
  • 特点
    • 通过 Broker 集群实现水平扩展和高可用。
    • 每个 Topic 划分为多个队列(Queue),分散到不同 Broker。
      在这里插入图片描述
(3) Producer
  • 角色:消息生产者,向 Broker 发送消息。
  • 功能
    • 根据 NameServer 提供的路由信息选择目标 Broker 和 Queue。
    • 支持同步、异步、单向发送模式。
    • 支持消息发送重试机制。
  • 特点
    • 支持消息 Sharding(如按 Key 哈希选择 Queue)。
    • 可通过事务消息保证分布式事务的最终一致性。
(4) Consumer
  • 角色:消息消费者,从 Broker 拉取消息并处理。
  • 功能
    • 根据消费模式(集群消费或广播消费)订阅消息。
    • 支持 Push 模式(长轮询)和 Pull 模式。
    • 维护消费进度(Offset),支持顺序消费。
  • 特点
    • 消费者组(Consumer Group)内负载均衡,组内消费者分摊 Queue。
    • 消费失败时触发重试机制,最终进入死信队列(DLQ)。

2. 消息流转流程

  1. 启动与注册

    • Broker 启动时向所有 NameServer 注册。
    • Producer/Consumer 启动时从 NameServer 获取路由信息。
  2. 消息发送

    • Producer 根据路由信息选择 Broker 和 Queue,发送消息到 Broker。
    • Broker 将消息写入 Commit Log,并生成索引(Consume Queue)。
  3. 消息消费

    • Consumer 从 Broker 拉取消息,处理成功后提交 Offset。
    • 若消费失败,消息进入重试队列,多次失败后进入死信队列。

3. 高可用机制

  • Broker 主从同步
    • 同步复制(Master-Slave 数据强一致)或异步复制(高性能)。
    • Master 故障时,Slave 可切换为新的 Master(需人工或自动触发)。
  • NameServer 集群:多节点部署,无状态设计,任一节点故障不影响服务。
  • 消息持久化:消息写入磁盘,防止数据丢失。

4. 扩展性与负载均衡

  • Topic 分片:将 Topic 划分为多个 Queue,分散到不同 Broker。
  • 消费者负载均衡:同一 Consumer Group 内的消费者分摊 Queue。
  • Broker 集群扩展:通过增加 Broker 节点提升吞吐量。

5.容错机制

  • 自动重试机制(消息发送/消费):
  • 故障broker转移
  • 消费者自动重新平衡队列分配

5. 特殊功能支持

  • 事务消息:通过两阶段提交(半消息 + 事务状态回查)实现分布式事务。
  • 顺序消息:通过锁定特定 Queue 保证消息顺序。
  • 延迟消息:支持预设延迟级别,消息定时投递。
  • 消息过滤:基于 Tag 或 SQL 表达式过滤消息。

6. 典型部署架构

[Producer]  --> [NameServer Cluster]↑    ↓    ↖
[Broker Master] ←→ [Broker Slave]↙    ↓    ↘
[Consumer]  --> [NameServer Cluster]

总结

RocketMQ 的架构通过 NameServer 实现解耦,Broker 主从设计保障高可用,生产者与消费者的分布式部署支持水平扩展。其高性能、可靠性和丰富的功能(如事务、顺序消息)使其适用于电商、金融等对消息一致性要求高的场景。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AIGC系列】5:视频生成模型数据处理和预训练流程介绍(Sora、MovieGen、HunyuanVideo)

AIGC系列博文: 【AIGC系列】1:自编码器(AutoEncoder, AE) 【AIGC系列】2:DALLE 2模型介绍(内含扩散模型介绍) 【AIGC系列】3:Stable Diffusion模型原理介绍 【AIGC系列】4&#xff1…

算法日记32:15届蓝桥C++B填空(握手问题+小球反弹)

握手问题 一、题解 1、通过观察我们可以发现,题目属于数论中的蜂巢问题,但是我们这里不使用结论,而是通过分析推出 2、假设我们不考虑特殊情况(也就是那 7 7 7个人的情况),那么问题的答案应该为 int res0; for(int i49;i>1;i…

【三维分割】LangSplat: 3D Language Gaussian Splatting(CVPR 2024 highlight)

论文:https://arxiv.org/pdf/2312.16084 代码:https://github.com/minghanqin/LangSplat 文章目录 一、3D language field二、回顾 Language Fields的挑战三、使用SAM学习层次结构语义四、Language Fields 的 3DGS五、开放词汇查询(Open-voca…

Windows安装sql server2017

看了下官网的文档,似乎只有ubuntu18.04可以安装,其他debian系的都不行,还有通过docker的方式安装的。 双击进入下载的ISO,点击执行可执行文件,并选择“是” 不要勾选 警告而已,不必理会 至少勾选这两…

LabVIEW图像识别抗干扰分析

问题描述 在基于LabVIEW的探针定位系统中,存在两个核心技术难点: 相机畸变导致初始定位误差:非线性畸变使探针无法通过坐标变换直接精确定位,需采用粗定位图像修正的两段式控制策略。 图像识别可靠性不足:复杂背景&a…

Leetcode1 两数之和 python两种方法实现

Leetcode1 两数之和 python两种方法实现 文章目录 Leetcode1 两数之和 python两种方法实现方法一:枚举法(暴力解法)方法二:用空间换时间。 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为…

总结前端常用数据结构 之 队列篇【JavaScript 】

推动你的事业,不要让你的事业推动你。——爱因斯坦 目录 队列是什么?JS异步、事件循环、任务队列:队列的实现方法:‌数组实现‌ - 封装队列:对象实现(优化性能)- 封装队列: 队列应用…

C# 数据转换

1. 文本框读取byte,ushort格式数据 byte addr; if (byte.TryParse(textBoxAddr.Text, out addr) true) {}2. 字节数组 (byte[]) 转换为 ASCII 字符串 byte[] bytes { 72, 101, 108, 108, 111 }; // "Hello" 的 ASCII 码 string s0 Encoding.ASCII.Ge…

golang部分语法介绍(range关键字,函数定义+特性,结构体初始化+结构体指针/方法)

目录 golang语法 range关键字 介绍 使用 原理 函数 介绍 定义 特性 结构体 介绍 初始化 结构体指针 结构体方法 方法接收者 golang语法 range关键字 介绍 用于遍历数组(array)、切片(slice)、映射(ma…

Linux与UDP应用1:翻译软件

UDP应用1:翻译软件 本篇介绍 本篇基于UDP编程接口基本使用中封装的服务器和客户端进行改写,基本功能如下: 从配置文件dict.txt读取到所有的单词和意思客户端向服务端发送英文服务端向客户端发送英文对应的中文意思 配置文件内容 下面的内…

【机器学习】逻辑回归(Logistic Regression)

逻辑回归 逻辑回归逻辑回归的流程Sigmoid函数Sigmoid函数的公式及图像 逻辑回归的损失函数与最优化求解逻辑回归使用梯度下降法求解 逻辑回归 逻辑回归与线性回归都是线性模型,其中线性回归使用线性式来预测数值,逻辑回归使用线性式来进行分类任务。 逻…

IDEA - 查看类的继承结构(通过快捷键查看、通过生成类图查看)

一、通过快捷键查看 在项目中定位到目标类(例如,Executor.java) 按下快捷键 【Ctrl H】 此时会弹出 Type Hierarchy 窗口,展示所有相关的父类、子类、接口 二、通过生成类图查看 在项目中定位到目标类(例如&#x…

Leetcode-1776. Car Fleet II [C++][Java]

目录 一、题目描述 二、解题思路 【C】 【Java】 Leetcode-1776. Car Fleet IIhttps://leetcode.com/problems/car-fleet-ii/description/ 一、题目描述 There are n cars traveling at different speeds in the same direction along a one-lane road. You are given an …

《Python实战进阶》No 9:使用 Celery 实现异步任务队列

第9集:使用 Celery 实现异步任务队列 引言 在现代 Web 应用中,许多操作(如发送邮件、处理文件上传、执行复杂计算等)可能需要耗费较长时间。如果这些操作直接在主线程中执行,会导致用户请求阻塞,降低用户体…

ue5 创建多列StreeView的方法与理解

创建StreeView的多列样式怎么就像是创建单行单列差不多?貌似就是在单行单列中加入了多列widget? 目录结构: 必备条件 StreeView的多列创建需要的必备条件: 数据基类 CustomItemBase #pragma once /* ---------------------------------- | Name | Value …

Spring的下载与配置

1. 下载spring开发包 下载地址:https://repo.spring.io/webapp/#/artifacts/browse/simple/General/libs-release-local/org/springframework/spring 打开之后可以看到有很多版本供选择,因为视频教程用的是4.2.4版本,于是我也选择这个 右键…

Python + requests实现接口自动化框架

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 为什么要做接口自动化框架 1、业务与配置的分离 2、数据与程序的分离;数据的变更不影响程序 3、有日志功能,实现无人值守 4、自动发送测…

Linux——基本指令

我们今天学习Linux最基础的指令 ls 指令 语法: ls [选项] [⽬录或⽂件] 功能:对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件,将列出⽂件名以及其他信 息。 命令中的选项,一次可以传递多个 &#xff0c…

【Godot4.3】自定义简易菜单栏节点ETDMenuBar

概述 Godot中的菜单创建是一个复杂的灾难性工作,往往无从下手,我也是不止一次尝试简化菜单的创建。 从自己去年的发明“简易树形数据”用于简化Tree控件获得灵感,于是尝试编写了用于表示菜单数据的EasyMenuData类,以及对应的纯文…

esp32串口通信

1、查看esp32的引脚图,寻找对应的串口 根据原理图,芯片上有3个串口(UART0, UART1和UART2),但是UART1没有引出引脚。其中UART0(GPIO3用于U0RXD,GPIO1用于U0TXD)用作下载、调试串口,引脚不可改变&…