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

news2025/6/12 19:28:44

升级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.coloradmin.cn/o/2407551.html

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

相关文章

NFT模式:数字资产确权与链游经济系统构建

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

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…

CMake 从 GitHub 下载第三方库并使用

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

微信小程序云开发平台MySQL的连接方式

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

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

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

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…

c#开发AI模型对话

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

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…

Android15默认授权浮窗权限

我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

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

IT供电系统绝缘监测及故障定位解决方案

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

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

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

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…

SpringCloudGateway 自定义局部过滤器

场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…