这是《RocketMQ 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 Proxy 模式是 RocketMQ 5.x 的重要架构形态:客户端接入 Proxy,由 Proxy 转发或协调请求到 Broker。它让接入层、协议适配和计算逻辑与存储节点解耦,更适合云原生、多语言客户端和统一治理场景。
19.1 架构位置
Client
-> Proxy
-> NameServer
-> Broker
Proxy 可以提供:
| 能力 | 价值 |
|---|---|
| 接入层隔离 | 客户端不直连 Broker |
| 多协议适配 | gRPC、remoting 等 |
| 认证与限流 | 统一入口治理 |
| 流量调度 | 灰度、就近、负载均衡 |
| 运维抽象 | Broker 演进对客户端透明 |
Proxy 不是简单负载均衡器,它理解消息语义和路由状态。
19.2 Local 与 Cluster 模式
常见部署模式:
| 模式 | 说明 |
|---|---|
| Local | Proxy 与 Broker 同进程或同节点部署 |
| Cluster | Proxy 独立部署成接入层集群 |
Local 模式部署简单,适合传统架构逐步演进。
Cluster 模式更适合:
- 多机房统一接入;
- 大规模客户端连接;
- 多语言 gRPC 接入;
- 计算存储分离;
- 云环境弹性伸缩。
19.3 客户端连接
客户端从连接 Broker 地址改为连接 Proxy 地址:
namesrv.addr -> proxy endpoint
配置示例:
rocketmq.proxy.endpoint=rocketmq-proxy:8081
迁移时必须确认:
- 客户端版本支持;
- 协议类型匹配;
- TLS 和 ACL 策略;
- 超时和重试参数;
- Proxy 到 Broker 网络连通;
- 现有消息轨迹和治理系统兼容。
19.4 请求路径
发送:
producer
-> proxy receive
-> validate and route
-> broker append
-> proxy return result
消费:
consumer
-> proxy subscribe/pull
-> broker read
-> proxy return
-> consumer process
-> proxy commit offset
每个跳点都会增加少量延迟,但也带来集中观测和治理能力。
19.5 无状态化与伸缩
Cluster 模式的 Proxy 应尽量减少本地状态:
- 路由从 NameServer 或 Broker 获取;
- 位点保存在 Broker;
- 会话可重建;
- 指标集中采集;
- 优雅摘除流量。
扩容前确认:
CPU
memory
connections
network bandwidth
request queue
upstream latency
Proxy 扩容不能解决 Broker 磁盘瓶颈。
19.6 可用性设计
Proxy 故障不应成为单点:
- 多实例部署;
- 客户端配置多个 endpoint;
- 负载均衡健康检查;
- 优雅停机;
- 与 Broker 故障域分离;
- 控制连接耗尽;
- 请求重试有退避。
故障判断:
| 现象 | 层次 |
|---|---|
| Proxy 连不上 | 接入层或负载均衡 |
| Proxy 健康但请求失败 | Broker、存储、权限 |
| 只有部分 Topic 失败 | 路由、权限、队列 |
| 延迟整体升高 | Proxy 或网络 |
| 发送成功消费失败 | 消费链路或订阅 |
19.7 多语言支持
5.x 的 gRPC 接口降低多语言客户端成本:
- Java、Go、Python 等语言可接入;
- 使用标准 gRPC 生态做连接管理;
- 序列化契约由客户端 SDK 定义;
- 仍需复用平台级鉴权和重试策略;
- 不同语言 SDK 成熟度需评估。
建议核心链路先压测,再统一 SDK 版本和超时规范。
19.8 监控指标
proxy_active_connections
proxy_request_total
proxy_request_error_total
proxy_request_latency_ms
proxy_upstream_latency_ms
proxy_request_queue_size
proxy_route_refresh_total
proxy_auth_failure_total
proxy_graceful_close_duration_ms
将客户端指标、Proxy 指标和 Broker 指标放在同一时间线中观察,才能区分接入层问题和存储层问题。
19.9 迁移策略
- 新业务先走 Proxy;
- 非核心旧业务灰度;
- 双写或双消费只在验证环境使用;
- 对比消息轨迹和业务对账;
- 保留回滚配置;
- 明确客户端 SDK 版本;
- 分批切换;
- 切换窗口准备容量余量。
本章小结
Proxy 模式让 RocketMQ 的接入层和存储层解耦,带来多语言、云原生和统一治理优势。Local 模式适合渐进部署,Cluster 模式适合大规模平台化架构。引入 Proxy 后,要额外治理连接数、转发延迟、路由刷新、安全策略和多一层故障定位。
思考题
- Proxy 模式解决了哪些直连 Broker 的治理问题?
- Local 与 Cluster 模式的适用场景是什么?
- Proxy 扩容为什么不能解决存储瓶颈?
- Proxy 故障和 Broker 故障如何区分?
- 从旧客户端迁移到 Proxy 需要哪些兼容性验证?