客户端连接恢复和故障转移
RabbitMQ 客户端恢复属于应用的责任。broker 可以接受重新连接,但应用仍然需要适当的端点选择、重试、确认以及幂等性行为。
使用本指南可增强生产者和消费者在节点重启、滚动升级、瞬时网络故障以及站点级端点变更场景下的抗故障能力。
设计原则
在生产环境客户端中使用以下设计原则:
- 当客户端库支持多个 broker 地址时,配置多个地址。
- 将生产者和消费者连接分离,避免一个流被阻塞时影响另一个流。
- 使用 heartbeat 和合理的连接超时。
- 当客户端库提供自动恢复功能时,启用它。
- 对生产者使用发布确认。
- 对消费者使用手动确认和幂等处理。
- 即使启用了节点级自动恢复,也要将站点级故障转移视为应用配置变更。
Java 示例
RabbitMQ Java client 支持自动连接恢复和拓扑恢复:
在生产者 channel 上使用发布确认,并在应用代码中检查确认失败。
Python 示例
使用 pika 时,显式实现重连循环,并在连接失败后重新创建 channel 或 consumer:
如果你的 consumer 依赖已声明的拓扑,请根据客户端库的行为,在重新连接后重新创建或验证拓扑。
端点故障转移策略
使用以下端点策略之一:
单个集群内的节点间自动恢复不会自动将应用切换到不同的 DR 站点。站点故障转移仍然需要配置、DNS 或服务发现变更。
验证清单
在更改客户端恢复设置后,验证以下内容:
- 应用可以连接到多个 broker 地址。
- 生产者使用确认,并且在发布未被接受时会明确失败。
- 消费者使用手动确认,并且可以干净地重启。
- 重连循环不会创建重复的 consumer 注册。
- 对于客户端可使用的每个端点,TLS 设置都保持有效。