RocketMQ 架构

[复制链接]
发表于 2025-10-12 07:07:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、RocketMQ 焦点架构概述


​1. 紧张组件

​Name Server: 集群的「中枢神经」,负责 Topic 元数据管理(如 Topic 分区分布、Broker 节点状态监控监控)。
​Broker: 消息存储与流转的焦点节点,负责消息的长期化、读写哀求处理处罚。
​Producer: 消息生产者,负责将消息投递到指定的 Topic。
​Consumer: 消息斲丧者,从 Broker 拉取消息并处理处罚。
​2. 集群摆设模式

​Name Server 集群: 通常摆设 2-3 个节点,通过 ​Raft 协议实现高可用,保障元数据同等性。
​Broker 集群: 至少摆设 2 个 Broker(主从或异步复制),支持横向扩展,每个 Broker 可管理多个 Partition。
​二、Partition 分区机制

​1. 计划目的

​程度扩展: 通过增长 Partition 数目提拔并行处理处罚本领。
​负载均衡: 斲丧者可以分散到差别 Partition 斲丧,克制单点瓶颈。
​次序性保障: 单个 Partition 内的消息按生产次序严格递增,满足事故性场景需求。
​2. 实现细节

​Topic 与 Partition:
每个 Topic 可分别为多个 ​Ordered Partition​(次序分区)和 ​Unordered Partition​(无序分区)。
默认环境下为 Ordered Partition,需显式设置 unordered=true 启用无序模式。
​分区分配计谋:
​Hash 分布:根据 Message Key 的哈希值匀称分配到各个 Partition。
​Round Robin:无 Key 时轮询分配,实用于广播场景。
​数据存储:
每个 Partition 对应一个 ​CommitLog​(提交日记),全部消息按次序追加写入。
​IndexFile:索引文件,纪录消息在 CommitLog 中的物理偏移量,加速随机读取。
​3. 示例场景
  1. Topic: ORDER_EVENT (4 Partitions)
  2. Partition 0: 消息 1,3,5,7...
  3. Partition 1: 消息 2,4,6,8...
  4. Partition 2: 消息 9,11,13...
  5. Partition 3: 消息 10,12,14...
复制代码
三、不丢消息的实现机制

1. 长期化保障

​CommitLog 计划:
全部消息先写入 CommitLog,次序追加包管原子性。
​刷盘计谋: 支持同步刷盘(SyncFlush)和异步刷盘(AsyncFlush)。
​同步刷盘: 写入 CommitLog 后立即刷盘到磁盘(默认),断送性能调换零数据丢失。
​异步刷盘: 周期性批量刷盘,提拔吞吐但存在极小丢数据风险(可设置 flushDiskType)。
​多副本机制:
​同步复制(SyncReplicate)​: 主 Broker 写入乐成后,至少期待一个从 Broker 复制确认才返回生产者(default)。
​异步复制(AsyncReplicate)​: 主 Broker 立即返回,从 Broker 异步同步(实用于对同等性要求低的场景)。
2. 生产者端可靠性

​重试与幂等性:
生产者发送消息失败后自动重试(maxRetryTimes 设置)。
支持幂等消息(通过 MessageId 或 SequenceId 克制重复斲丧)。
​事故消息:
通过 ​当地事故 + RocketMQ 事故消息 实现终极同等性(如订单扣减与消息发送原子性)。
​3. 斲丧者端可靠性

​ACK 机制:
斲丧者拉取消息后需手动提交 Offset(enableAutoCommit=false 关闭自动提交)。
​斲丧失败重试:连合 RetryPolicy 实现自动重试或死信队列处理处罚。
​Exactly-Once 语义:
通过 ​事故消息 + 斲丧者 Offset 管理 实现准确一次斲丧(如付出乐成后消息不重复)。
4. 监控监控与告警

​Broker 监控监控: 监控磁盘使用率、网络耽误、哀求堆积等指标,触发非常告警。
​SLA 计谋: 设置副本同步超时时间(replicaSyncTimeoutMs),超时节点自动隔离。
​四、读写性能优化

​1. 写入性能优化

​批量压缩:
启用 compressEnable=true 和 compressAlgorithm=lz4,淘汰网络传输和磁盘占用。
​实用场景:文本类消息(如 JSON)压缩率可达 50%+。
​零拷贝技能:
​Netty 零拷贝:直接使用 ByteBuf,克制数据在 Java 内存与 Native 内存间多次拷贝。
​文件通道:通过 MappedByteBuffer 直接映射磁盘文件,提拔 IO 服从。
​多线程写入:
Broker 使用 ​多线程模子​(默认 16 个线程)处理处罚生产者哀求,充实使用 CPU 资源。
​2. 读取性能优化

​批量拉取:
斲丧者单次拉取消息数目可设置(pullBatchSize),淘汰网络 round trip。
​多斲丧者并行斲丧:
同一 Partition 的多个斲丧者实例通过 ​Consumer Group 并行斲丧,提拔吞吐量。
​索引加速:
​IndexFile 二分查找消息 Offset,将随机读取复杂度从 O(n) 降至 O(log n)。
3. 网络与存储优化

​TCP 协议优化:
使用 ​长毗连 淘汰握手开销,启用 tcpNoDelay=true 禁用 Nagle 算法。
​SSD 存储:
Broker 数据盘摆设 SSD,对比 HDD,IO 耽误低落 5-10 倍。
​分区计谋优化:
根据负载动态扩容 Partition(需连合客户端版本支持)。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表