RocketMQNotes

第 20 章:弹性扩缩容

zjc 于 2026-01-20 发布

这是《RocketMQ 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 RocketMQ 的扩缩容不只是加减机器。Broker、Topic 队列、消费者、Proxy 和存储都有不同伸缩边界。目标是让写入容量、消费并行度、磁盘保留和网络带宽与业务负载匹配,并在变更中保持路由、位点和高可用状态可控。

20.1 容量瓶颈分层

瓶颈信号
Producer 发送超时、线程阻塞、本地事件积压
Broker 写入延迟、磁盘繁忙、请求堆积
存储 磁盘水位、文件增长过快
Consumer lag 增长、消费耗时高、死信增加
Network 带宽、重传、跨机房延迟
Proxy 连接数、请求队列、转发延迟

先判断瓶颈层级,再决定扩容对象。盲目扩消费者无法解决磁盘满,扩 Broker 也无法解决下游数据库慢。

20.2 Broker 扩容

新增 Broker 后,新 Broker 默认主要承接新 Topic 或新队列,已有 Topic 数据不会自动迁移。

变更步骤:

prepare capacity
  -> install broker
  -> configure replication and acl
  -> register to nameserver
  -> create or move queues
  -> validate route
  -> gradual traffic

检查项:

  1. Broker 版本一致;
  2. 副本分布合理;
  3. 磁盘目录独立;
  4. 告警和指标接入;
  5. Topic 权限同步;
  6. 管理工具可达;
  7. 高可用仲裁健康。

20.3 队列扩容

队列数影响:

  1. 写入分散度;
  2. 消费最大并行度;
  3. 顺序消息路由;
  4. 位点管理复杂度;
  5. 索引文件数量。

示例:

before: 4 queues
after:  8 queues

新增队列从末尾开始写入,消费者重平衡后可以分配新队列。减少队列要确认旧队列消费完成,且顺序业务不会受影响。

20.4 消费者扩容

消费者有效并行度受队列数限制:

8 queues
4 consumer instances  -> useful
10 consumer instances -> at least 2 idle

扩容顺序:

  1. 先确认是消费处理瓶颈;
  2. 优化慢 SQL 和下游调用;
  3. 增加消费实例;
  4. 增加消费线程;
  5. 最后考虑增加队列;
  6. 观察重平衡和重复。

20.5 存储扩容

方式:

方式 特点
扩磁盘 简单,适合云盘
增加 Broker 分散新写入
Topic 队列迁移 需要治理旧数据
降低保留时间 减少容量,但影响回溯
归档冷数据 适合审计场景

磁盘满的处理顺序:

stop risky growth
  -> confirm oldest data requirement
  -> clean expired files
  -> expand disk
  -> rebalance traffic
  -> review capacity model

不能在未确认消费位点前删除旧数据。

20.6 缩容流程

Broker 缩容:

  1. 确认节点是否仍有主副本;
  2. 迁移或等待 Topic 队列不再写入;
  3. 确认消费者位点完成;
  4. 摘除路由;
  5. 停止流量;
  6. 保留数据备份;
  7. 最后下线节点。

顺序:

readiness check
  -> route change
  -> drain
  -> shutdown
  -> backup
  -> delete

缩容最容易出问题的不是停机,而是路由残留和数据仍被依赖。

20.7 自动伸缩

适合自动伸缩:

  1. Proxy 无状态层;
  2. 消费应用实例;
  3. 云主机规格调整;
  4. 前置网络带宽。

谨慎自动伸缩:

  1. Broker 有状态节点;
  2. 副本仲裁拓扑;
  3. Topic 队列数;
  4. 存储目录。

自动策略应以 lag、消息年龄、消费耗时、磁盘水位等多指标组合判断,避免单指标抖动引发频繁变更。

20.8 变更验证

扩缩容后检查:

route correctness
broker disk balance
queue assignment
consumer lag
send latency
consume latency
retry and dead letter
replica sync state
business reconciliation

保留回滚窗口:

  1. 原配置可恢复;
  2. 原节点可重新加入;
  3. 旧路由可回滚;
  4. 监控对比扩容前后;
  5. 业务指标确认正常。

20.9 常见错误

错误 后果
消费者超过队列数 实例空转
直接减少队列 历史消息漏消费或顺序破坏
Broker 版本不一致 兼容性问题
新 Broker 无权限配置 生产失败
存储与日志混盘 扩容后仍磁盘瓶颈
未演练重平衡 变更窗口消费抖动
磁盘满后立即删文件 数据不可恢复

本章小结

弹性扩缩容要区分接入层、计算层、队列并行度和有状态存储层。消费者和 Proxy 可以较容易水平扩展,Broker、队列和副本拓扑则需要严谨的数据与路由治理。所有变更都应有容量评估、灰度窗口、验证清单和回滚方案。

思考题

  1. 为什么新增 Broker 后旧 Topic 流量通常不会自动迁移?
  2. 消费者实例数和队列数是什么关系?
  3. 减少队列前要确认什么?
  4. 哪些层适合自动伸缩,哪些不适合?
  5. 磁盘满时为什么不能直接删除最旧文件?