【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群

一、主从架构的不足与Dledger的定位

  1. 主从架构缺陷
    • 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。
    • Slave仅存储数据,无法主动升级为Master响应请求,集群高可用性不足。
  2. Dledger的核心价值
    • 基于Raft协议实现自动选举数据强一致性,支持Leader节点故障时自动切换,保障服务连续性。
    • 解决传统主从架构的“单点故障”和“脑裂问题”,提升集群可靠性。

二、Dledger集群架构与原理

  1. 角色分工
    • Leader:唯一主节点,处理客户端请求,通过日志复制同步数据到Follower。
    • Follower:从节点,接收并持久化Leader数据,参与选举。
  2. Raft协议关键机制
    • 选举机制:候选人需获得超过半数节点投票才能成为Leader,确保集群唯一主节点。
    • 任期(Term):每个选举周期生成唯一任期号,避免旧Leader干扰新选举。
    • 心跳机制:Leader定期发送心跳维持统治,超时则触发重新选举。
    • 日志复制:Leader数据需多数Follower确认后才提交,保障强一致性。
  3. 脑裂问题解决
    • 通过Raft协议的选举规则和多数确认机制,确保同一时刻仅存在一个有效Leader,避免多主冲突。

三、Dledger集群搭建步骤(以3节点为例)

  1. 环境配置
    • 3台服务器(worker1、worker2、worker3),已部署NameServer集群,修改/etc/hosts绑定主机名。
    • 每个节点创建独立存储目录(如/app/rocketmq/storeDledger),避免数据混淆。
  2. 核心配置文件
    • 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)  
  1. 启动与验证
    • 各节点执行命令启动Broker:
nohup bin/mqbroker -c conf/dledger/broker.conf &  
    • 通过Dashboard或mqadmin命令查看集群状态,确认1个Leader和2个Follower。
    • 模拟故障:停止Leader节点,观察剩余节点是否自动选举新Leader(需保证≥2节点存活)。

四、Dledger与主从架构对比

维度

主从架构

Dledger集群

故障恢复

人工切换,服务中断

自动选举Leader,秒级恢复

数据一致性

异步复制(可能丢失少量数据)

强一致性(多数节点确认)

脑裂风险

存在

彻底避免(Raft协议保障)

运维成本

高(需手动管理主从状态)

低(自动化管理)

性能影响

中(选举和日志复制开销)

五、注意事项与最佳实践

  1. 节点数量建议
    • 部署奇数个节点(如3/5个),容错能力为(n-1)/2(3节点可容忍1个故障,5节点可容忍2个故障)。
  2. 性能调优
    • 调整sendMessageThreadPoolNums为服务器CPU核心数,提升消息处理吞吐量。
    • 启用异步刷盘(flushDiskType=ASYNC_FLUSH)降低延迟,但需权衡数据可靠性。
  3. 生产环境建议
    • 关闭自动创建Topic(autoCreateTopicEnable=false),避免资源滥用。
    • 结合Prometheus+Grafana监控Leader选举耗时、消息复制延迟等指标。

总结RocketMQ的运行架构

一、核心组件与功能

  1. NameServer
    • 定位:集群的“大脑”,提供轻量级路由管理,不存储状态,节点间相互独立。
    • 功能
      • 接收Broker注册信息,维护Topic与Broker的路由关系。
      • 为Producer和Consumer提供实时路由查询服务。
  2. Broker
    • 定位:核心数据节点,负责消息存储、转发与查询,类似“硬盘”角色。
    • 分类
      • Master:处理读写请求,支持数据同步到Slave。
      • Slave:备份Master数据,故障时可切换为只读节点(主从架构)或自动升级为Leader(Dledger集群)。
  3. Client(生产者/消费者)
    • 定位:集群的“输入输出设备”,通过NameServer获取路由,与Broker直接交互。
    • 关键逻辑
      • Producer:按负载均衡策略将消息发送到Topic的多个MessageQueue。
      • Consumer:通过Pull或Push模式从MessageQueue拉取消息,支持广播模式和集群模式。

二、消息路由与存储机制

  1. Topic与MessageQueue
    • Topic:逻辑消息分类,数据分散存储在多个MessageQueue中(默认8个队列)。
    • MessageQueue:物理存储单元,具有FIFO特性,消息按offset顺序存储。
  2. 路由流程
    • Producer发送消息时,通过NameServer获取Topic对应的Broker列表,按轮询等策略选择MessageQueue。
    • Consumer消费时,根据分配策略(如平均分配)绑定MessageQueue,维护本地消费进度(offset)。

三、集群模式对比

模式

主从架构

Dledger集群

路由更新

Broker主动向NameServer注册

同上

高可用性

依赖人工切换

自动故障转移

适用场景

中小规模业务、非核心场景

大规模集群、金融级高可靠场景

理解RocketMQ的消息模型

一、核心概念

  1. 消息(Message)
    • Topic(主题)、Tag(标签)、Body(内容)组成,支持属性扩展(如事务ID、延迟时间)。
  2. 消费者组(Consumer Group)
    • 同一组内消费者协同消费,支持负载均衡(集群模式)或独立消费(广播模式)。
    • 消费进度以组为单位存储,不同组可独立消费同一Topic。

二、消息投递模式

  1. 集群模式(默认)
    • 多个消费者实例分摊消费压力,每条消息仅被组内一个实例处理。
    • 应用场景:订单处理、实时数据分析。
  2. 广播模式
    • 每条消息被组内所有消费者实例消费,进度独立管理。
    • 应用场景:配置更新通知、日志广播。

三、消息存储与消费流程

  1. 存储流程
    • Producer发送消息至Broker的MessageQueue,持久化到CommitLog文件。
    • Broker定期将CommitLog数据刷盘,并构建索引文件(ConsumeQueue、IndexFile)加速查询。
  2. 消费流程
    • Consumer从NameServer获取Topic路由,拉取MessageQueue中的消息。
    • 消费成功后,更新本地offset(集群模式同步到Broker,广播模式存储于本地文件)。

四、与Kafka的对比

特性

RocketMQ

Kafka

消息顺序

单个MessageQueue内有序

单个Partition内有序

事务支持

原生支持(两阶段提交)

需外部系统协调

多语言客户端

官方支持Java、C++、Go等

依赖社区实现

管理工具

提供Dashboard可视化界面

依赖命令行或开源工具(如Kafka UI)

章节总结

一、核心知识回顾

  1. 快速实战
    • 掌握RocketMQ单机、主从、Dledger集群的搭建流程,调整JVM参数适应资源限制。
    • 使用命令行工具(tools.sh)和Java API实现消息收发,结合Dashboard监控集群状态。
  2. 架构设计
    • NameServer无状态集群提供路由服务,Broker通过主从或Dledger实现高可用。
    • 消息模型基于Topic和MessageQueue,支持灵活的消费模式与负载均衡策略。
  3. 核心特性
    • 事务消息、延迟队列、死信队列等功能满足复杂业务需求(后续章节深入)。
    • Dledger集群通过Raft协议解决传统主从架构的高可用短板,适合金融级场景。

二、延伸学习建议

  1. 对比分析
    • 结合Kafka和RabbitMQ,理解不同MQ在吞吐量、可靠性、功能丰富度上的差异。
  2. 生产实践
    • 尝试在Docker/Kubernetes中部署RocketMQ集群,实践资源编排与弹性扩缩容。
    • 实现基于RocketMQ的分布式事务(如订单支付场景),结合本地事务表保证最终一致性。
  3. 源码阅读
    • org.apache.rocketmq.broker包入手,理解Broker启动流程与消息存储逻辑。

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

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

相关文章

【会员专享数据】2017-2024年我国分省的10米精度土地覆盖数据

土地覆盖数据是我们在各项研究中都非常常用的数据,之前我们分享过2017-2024年全球范围的10米精度土地覆盖数据(均可查看之前的文章获悉详情)!该数据提供瓦片形式,也就是全球的数据没有拼成一张图,很多小伙伴…

通过css实现正方体效果

效果 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* css实…

Java并发编程-理论基础

Java并发编程-理论基础 1、什么是进程&#xff1f; 进程&#xff08;Process&#xff09;是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源分配的基本单位&#xff0c;是操作系统结构的基础。在早期面向进程设计的计算机结构中&#xff0c;进程是程…

Tornado WebSocket实时聊天实例

在 Python 3 Tornado 中使用 WebSocket 非常直接。你需要创建一个继承自 tornado.websocket.WebSocketHandler 的类&#xff0c;并实现它的几个关键方法。 下面是一个简单的示例&#xff0c;演示了如何创建一个 WebSocket 服务器&#xff0c;该服务器会接收客户端发送的消息&a…

模块化架构下的前端调试体系建设:WebDebugX 与多工具协同的工程实践

随着前端工程化的发展&#xff0c;越来越多的项目采用模块化架构&#xff1a;单页面应用&#xff08;SPA&#xff09;、微前端、组件化框架等。这类架构带来了良好的可维护性和复用性&#xff0c;但也带来了新的调试挑战。 本文结合我们在多个模块化项目中的真实经验&#xff…

高考:如何合理选择学科、专业以及职业

如何合理选择学科、专业以及职业 一、自我认知&#xff1a;明确自身兴趣与优势&#xff08;一&#xff09;兴趣探索&#xff08;二&#xff09;能力评估&#xff08;三&#xff09;价值观与目标 二、外部调研&#xff1a;深入了解学科、专业与职业&#xff08;一&#xff09;学…

【新品解读】一板多能,AXRF49 定义新一代 RFSoC FPGA 开发平台

“硬件系统庞杂、调试周期长” “高频模拟前端不稳定&#xff0c;影响采样精度” “接收和发射链路难以同步&#xff0c;难以扩展更多通道” “数据流量大&#xff0c;处理与存储跟不上” 这些是大部分客户在构建多通道、高频宽的射频采样链路时&#xff0c;面临的主要问题。…

实现仿中国婚博会微信小程序

主要功能&#xff1a; 1、完成底部标签导航设计、首页海报轮播效果设计和宫格导航设计&#xff0c;如图1所示 2、在首页里&#xff0c;单击全部分类宫格导航的时候&#xff0c;会进入到全部分类导航界面&#xff0c;把婚博会相关内容的导航集成到一个界面里&#xff0c;如图2…

MySQL强化关键_020_SQL 优化

目 录 一、order by 优化 1.未添加索引 2.添加索引 3.复合索引默认升序排列 4.复合索引降序排列 5.复合索引升序降序排列并用 6.总结 二、group by 优化 1.未添加索引 2.添加索引 3.添加复合索引 三、limit 优化 四、主键优化 1.主键设计原则 五、insert 优化…

湖北理元理律师事务所视角:企业债务优化的三维平衡之道

核心提示&#xff1a;债务优化的本质不是消灭债务&#xff0c;而是在法律框架内重建财务可持续性。 一、企业债务危机的典型误区 某制造企业主曾向我坦言&#xff1a;“用新贷还旧贷3年&#xff0c;债务从200万滚到500万。”这类案例暴露出企业债务处置的共性痛点&#xff1a…

【Ragflow】27.RagflowPlus(v0.4.1):小版本迭代,问题修复与功能优化

概述 RagflowPlus v0.4.0 在发布后&#xff0c;收到了积极的反馈&#xff0c;同时也包含一些问题。 本次进行一轮小版本更新&#xff0c;发布 v0.4.1 版本&#xff0c;对已知问题进行修复&#xff0c;并对部分功能进行进一步优化。 开源地址&#xff1a;https://github.com/…

【hadoop】Flink安装部署

一、单机模式 步骤&#xff1a; 1、使用XFTP将Flink安装包flink-1.13.5-bin-scala_2.11.tgz发送到master机器的主目录。 2、解压安装包&#xff1a; tar -zxvf ~/flink-1.13.5-bin-scala_2.11.tgz 3、修改文件夹的名字&#xff0c;将其改为flume&#xff0c;或者创建软连接…

Linux 下 ChromeDriver 安装

个人博客地址&#xff1a;Linux 下 ChromeDriver 安装 | 一张假钞的真实世界 Selenium 是一个用于 Web 应用程序测试的工具。可以通过它驱动浏览器执行特定的操作&#xff0c;如点击、下滑、资源加载与渲染等。该工具在爬虫开发中也非常有帮助。Selenium 需要通过浏览器驱动操…

Canal环境搭建并实现和ES数据同步

作者&#xff1a;田超凡 日期&#xff1a;2025年6月7日 Canal安装&#xff0c;启动端口11111、8082&#xff1a; 安装canal-deployer服务端&#xff1a; https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…

STM32使用土壤湿度传感器

1.1 介绍&#xff1a; 土壤湿度传感器是一种传感装置&#xff0c;主要用于检测土壤湿度的大小&#xff0c;并广泛应用于汽车自动刮水系统、智能灯光系统和智能天窗系统等。传感器采用优质FR-04双料&#xff0c;大面积5.0 * 4.0厘米&#xff0c;镀镍处理面。 它具有抗氧化&…

锁的艺术:深入浅出讲解乐观锁与悲观锁

在多线程和分布式系统中&#xff0c;数据一致性是一个核心问题。锁机制作为解决并发冲突的重要手段&#xff0c;被广泛应用于各种场景。乐观锁和悲观锁是两种常见的锁策略&#xff0c;它们在设计理念、实现方式和适用场景上各有特点。本文将深入探讨乐观锁和悲观锁的原理、实现…

Jinja2深度解析与应用指南

1. 概念与用途 1.1 核心概念 Jinja2是Python生态中功能强大的模板引擎&#xff0c;采用逻辑与表现分离的设计思想&#xff1a; 模板&#xff1a;包含静态内容和动态占位符的文本文件&#xff08;.j2后缀&#xff09;渲染&#xff1a;将模板与数据结合生成最终文本的过程上下…

Ubuntu20.04中 Redis 的安装和配置

Ubuntu20.04 中 Redis 的安装和配置 Ubuntu 安装 MySQL 及其配置 1. Redis 的安装 更新系统包列表并安装 Redis &#xff1a; # 更新包管理工具 sudo apt update# -y&#xff1a;自动确认所有提示&#xff08;非交互式安装&#xff09; sudo apt install -y redis-server测…

Sklearn 机器学习 缺失值处理 填充数据列的缺失值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 💡使用 Scikit-learn 处理数据缺失值的完整指南 在机器学习项目中,数据缺失是不可避…

Unity中如何播放视频

1.创建一个原始图像并调整布局平铺整个画布 2.创建自定义纹理并调整自定义纹理大小 3.添加视频播放组件 4.将准备好的视频素材拖入到视频剪辑中 5.将自定义纹理拖入到目标纹理中 6.将自定义纹理拖入到原始图像的纹理中 最后运行游戏&#xff0c;即可播放视频 总结&#xff1a;