【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群
一、主从架构的不足与Dledger的定位
- 主从架构缺陷
- 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。
- Slave仅存储数据,无法主动升级为Master响应请求,集群高可用性不足。
- Dledger的核心价值
- 基于Raft协议实现自动选举和数据强一致性,支持Leader节点故障时自动切换,保障服务连续性。
- 解决传统主从架构的“单点故障”和“脑裂问题”,提升集群可靠性。
二、Dledger集群架构与原理
- 角色分工
- Leader:唯一主节点,处理客户端请求,通过日志复制同步数据到Follower。
- Follower:从节点,接收并持久化Leader数据,参与选举。
- Raft协议关键机制
- 选举机制:候选人需获得超过半数节点投票才能成为Leader,确保集群唯一主节点。
- 任期(Term):每个选举周期生成唯一任期号,避免旧Leader干扰新选举。
- 心跳机制:Leader定期发送心跳维持统治,超时则触发重新选举。
- 日志复制:Leader数据需多数Follower确认后才提交,保障强一致性。
- 脑裂问题解决
- 通过Raft协议的选举规则和多数确认机制,确保同一时刻仅存在一个有效Leader,避免多主冲突。
三、Dledger集群搭建步骤(以3节点为例)
- 环境配置
- 3台服务器(worker1、worker2、worker3),已部署NameServer集群,修改
/etc/hosts
绑定主机名。 - 每个节点创建独立存储目录(如
/app/rocketmq/storeDledger
),避免数据混淆。
- 3台服务器(worker1、worker2、worker3),已部署NameServer集群,修改
- 核心配置文件
- 在
conf/dledger/broker.conf
中配置:
- 在
brokerClusterName=RaftCluster # 集群名(统一标识)
brokerName=RaftNode00 # 节点组名(同一集群内一致)
listenPort=30911 # 服务端口(避免与主从架构冲突)
namesrvAddr=worker1:9876;worker2:9876;worker3:9876 # NameServer地址
enableDLegerCommitLog=true # 启用Dledger功能
dLegerGroup=RaftNode00 # Dledger组名(与brokerName一致)
dLegerPeers=n0-worker1:40911;n1-worker2:40911;n2-worker3:40911 # 节点列表(格式:id-主机:端口)
dLegerSelfId=n0 # 当前节点ID(需在dLegerPeers中唯一,worker1设n0,worker2设n1,worker3设n2)
- 启动与验证
- 各节点执行命令启动Broker:
nohup bin/mqbroker -c conf/dledger/broker.conf &
-
- 通过Dashboard或
mqadmin
命令查看集群状态,确认1个Leader和2个Follower。 - 模拟故障:停止Leader节点,观察剩余节点是否自动选举新Leader(需保证≥2节点存活)。
- 通过Dashboard或
四、Dledger与主从架构对比
维度 | 主从架构 | Dledger集群 |
故障恢复 | 人工切换,服务中断 | 自动选举Leader,秒级恢复 |
数据一致性 | 异步复制(可能丢失少量数据) | 强一致性(多数节点确认) |
脑裂风险 | 存在 | 彻底避免(Raft协议保障) |
运维成本 | 高(需手动管理主从状态) | 低(自动化管理) |
性能影响 | 低 | 中(选举和日志复制开销) |
五、注意事项与最佳实践
- 节点数量建议
- 部署奇数个节点(如3/5个),容错能力为
(n-1)/2
(3节点可容忍1个故障,5节点可容忍2个故障)。
- 部署奇数个节点(如3/5个),容错能力为
- 性能调优
- 调整
sendMessageThreadPoolNums
为服务器CPU核心数,提升消息处理吞吐量。 - 启用异步刷盘(
flushDiskType=ASYNC_FLUSH
)降低延迟,但需权衡数据可靠性。
- 调整
- 生产环境建议
- 关闭自动创建Topic(
autoCreateTopicEnable=false
),避免资源滥用。 - 结合Prometheus+Grafana监控Leader选举耗时、消息复制延迟等指标。
- 关闭自动创建Topic(
总结RocketMQ的运行架构
一、核心组件与功能
- NameServer
- 定位:集群的“大脑”,提供轻量级路由管理,不存储状态,节点间相互独立。
- 功能:
- 接收Broker注册信息,维护Topic与Broker的路由关系。
- 为Producer和Consumer提供实时路由查询服务。
- Broker
- 定位:核心数据节点,负责消息存储、转发与查询,类似“硬盘”角色。
- 分类:
- Master:处理读写请求,支持数据同步到Slave。
- Slave:备份Master数据,故障时可切换为只读节点(主从架构)或自动升级为Leader(Dledger集群)。
- Client(生产者/消费者)
- 定位:集群的“输入输出设备”,通过NameServer获取路由,与Broker直接交互。
- 关键逻辑:
- Producer:按负载均衡策略将消息发送到Topic的多个MessageQueue。
- Consumer:通过Pull或Push模式从MessageQueue拉取消息,支持广播模式和集群模式。
二、消息路由与存储机制
- Topic与MessageQueue
- Topic:逻辑消息分类,数据分散存储在多个MessageQueue中(默认8个队列)。
- MessageQueue:物理存储单元,具有FIFO特性,消息按offset顺序存储。
- 路由流程
- Producer发送消息时,通过NameServer获取Topic对应的Broker列表,按轮询等策略选择MessageQueue。
- Consumer消费时,根据分配策略(如平均分配)绑定MessageQueue,维护本地消费进度(offset)。
三、集群模式对比
模式 | 主从架构 | Dledger集群 |
路由更新 | Broker主动向NameServer注册 | 同上 |
高可用性 | 依赖人工切换 | 自动故障转移 |
适用场景 | 中小规模业务、非核心场景 | 大规模集群、金融级高可靠场景 |
理解RocketMQ的消息模型
一、核心概念
- 消息(Message)
- 由Topic(主题)、Tag(标签)、Body(内容)组成,支持属性扩展(如事务ID、延迟时间)。
- 消费者组(Consumer Group)
- 同一组内消费者协同消费,支持负载均衡(集群模式)或独立消费(广播模式)。
- 消费进度以组为单位存储,不同组可独立消费同一Topic。
二、消息投递模式
- 集群模式(默认)
- 多个消费者实例分摊消费压力,每条消息仅被组内一个实例处理。
- 应用场景:订单处理、实时数据分析。
- 广播模式
- 每条消息被组内所有消费者实例消费,进度独立管理。
- 应用场景:配置更新通知、日志广播。
三、消息存储与消费流程
- 存储流程
- Producer发送消息至Broker的MessageQueue,持久化到CommitLog文件。
- Broker定期将CommitLog数据刷盘,并构建索引文件(ConsumeQueue、IndexFile)加速查询。
- 消费流程
- Consumer从NameServer获取Topic路由,拉取MessageQueue中的消息。
- 消费成功后,更新本地offset(集群模式同步到Broker,广播模式存储于本地文件)。
四、与Kafka的对比
特性 | RocketMQ | Kafka |
消息顺序 | 单个MessageQueue内有序 | 单个Partition内有序 |
事务支持 | 原生支持(两阶段提交) | 需外部系统协调 |
多语言客户端 | 官方支持Java、C++、Go等 | 依赖社区实现 |
管理工具 | 提供Dashboard可视化界面 | 依赖命令行或开源工具(如Kafka UI) |
章节总结
一、核心知识回顾
- 快速实战
- 掌握RocketMQ单机、主从、Dledger集群的搭建流程,调整JVM参数适应资源限制。
- 使用命令行工具(
tools.sh
)和Java API实现消息收发,结合Dashboard监控集群状态。
- 架构设计
- NameServer无状态集群提供路由服务,Broker通过主从或Dledger实现高可用。
- 消息模型基于Topic和MessageQueue,支持灵活的消费模式与负载均衡策略。
- 核心特性
- 事务消息、延迟队列、死信队列等功能满足复杂业务需求(后续章节深入)。
- Dledger集群通过Raft协议解决传统主从架构的高可用短板,适合金融级场景。
二、延伸学习建议
- 对比分析
- 结合Kafka和RabbitMQ,理解不同MQ在吞吐量、可靠性、功能丰富度上的差异。
- 生产实践
- 尝试在Docker/Kubernetes中部署RocketMQ集群,实践资源编排与弹性扩缩容。
- 实现基于RocketMQ的分布式事务(如订单支付场景),结合本地事务表保证最终一致性。
- 源码阅读
- 从
org.apache.rocketmq.broker
包入手,理解Broker启动流程与消息存储逻辑。
- 从
相关文章:
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...