Install
openclaw skills install rabbitmq-client-guideRabbitMQ 客户端代码指南。当用户需要编写、调试或审查 RabbitMQ 应用代码时使用。涵盖:用任意语言(Java/Go/Python/PHP/.NET)写生产者或消费者;排查连接暴增、消息丢失、Broken pipe、消费慢、漏消费等客户端问题;审查 spring-boot-starter-amqp、a...
openclaw skills install rabbitmq-client-guide基于腾讯云 TDMQ RabbitMQ 托管版官方最佳实践,指导生成和审查 RabbitMQ 客户端代码。覆盖连接管理、生产者、消费者、消息可靠性四大核心场景,支持 Java、Go、Python、.NET、PHP 以及 Spring Boot、Spring Cloud Stream 等框架。
生成代码前,快速明确需求:
您需要什么?
├─ 写生产者代码(发送消息)
│ └─ 项目语言?Java / Go / Python / .NET / PHP / Spring Boot...
│ └─ 需要特殊场景?(可靠投递、批量、延迟...)
├─ 写消费者代码(接收消息)
│ └─ 项目语言?
│ └─ 并发还是串行?单线程 / 多线程 / 异步...
├─ 审查现有代码
│ └─ 直接用检查清单对照
└─ 排查问题
└─ 症状?消息丢失 / 连接失败 / 消费落后...
按以下步骤执行:
| 语言 | 推荐客户端库 | 自动重连 | 重连关键点 |
|---|---|---|---|
| Java | amqp-client | 内置 | factory.setAutomaticRecoveryEnabled(true) |
| .NET | RabbitMQ.Client | 内置 | factory.AutomaticRecoveryEnabled = true |
| Go | amqp091-go | 需手动 | 监听 conn.NotifyClose(),在独立 goroutine 中重建连接和通道 |
| Python | pika | 需手动 | 捕获 ConnectionClosedByBroker,重建 BlockingConnection |
| PHP | php-amqplib | 需手动 | 捕获 AMQPConnectionClosedException,重建 AMQPStreamConnection |
| 框架 | 连接方式 | 注意事项 |
|---|---|---|
| Spring Boot AMQP | @RabbitListener + RabbitTemplate | 自动管理连接池和重连;用 @Bean 声明 Exchange/Queue/Binding |
| Spring Cloud Stream | @StreamListener + MessageChannel | 更高层抽象;通过 application.yml 配置 binder |
以下规则是生成高质量客户端代码的核心准则。每条规则都有具体原因,理解原因比死记规则更重要——这样遇到边界场景时能做出正确判断。
durable=true + queue durable=true + message deliveryMode=2。三者缺一不可:exchange/queue 不持久化则 broker 重启后资源丢失;message 不持久化则 broker 重启后消息丢失。即使不关心持久性,非持久化消息驻留内存更多,反而有性能隐患。channel.confirmSelect()),等待 broker ack 后再视为发送成功。这是防止 producer→broker 链路丢消息的唯一保障。mandatory=true 并注册 return listener。原因:默认情况下消息无法路由(比如 exchange 存在但没有匹配的 binding)时 broker 会静默丢弃——mandatory 使 broker 通过 basic.return 退回消息。注意:delayed exchange 不支持 mandatory。autoAck=true。原因:自动确认在消息到达消费者时立即 ack,如果处理失败消息不会重试,等于丢消息。basic.consume(push),禁止 basic.get(pull)。原因:pull 模式每条消息一次请求,效率极低;持续空拉还会导致 broker CPU 飙升。basic.return 感知路由失败;消费者通过幂等处理应对恢复期的重复投递。| 场景 | 推荐 prefetch |
|---|---|
| 消费速度快、处理时间短 | 250 |
| 处理时间稳定、网络可控 | RTT / 平均处理时间 |
| 消费者多、处理时间短 | 较低值 |
| 消费者多或处理时间长 | 1 |
禁止设置无限制 prefetch(0),会导致单个消费者接收全部消息。
生成或审查代码后逐项检查。每项标注了违反时的风险等级,帮助排定修复优先级:
[HIGH: 连接风暴][MEDIUM: 流控串扰][HIGH: 帧交错/消息丢失][MEDIUM: 连接泄露][HIGH: broker 重启后 exchange 丢失][HIGH: broker 重启后 queue 丢失][HIGH: broker 重启后消息丢失][HIGH: 无法感知投递失败][MEDIUM: 路由失败静默丢消息][CRITICAL: 处理失败不重试,等于丢消息][MEDIUM: 重复消费导致业务异常][MEDIUM: 性能差 + broker CPU 飙升][MEDIUM: 负载不均][HIGH: broker 重启后服务中断]常见问题的排查入口:
| 症状 | 可能原因 | 检查点 |
|---|---|---|
| 消息丢失 | 未开 confirm / 未持久化 / autoAck | 检查规则 5-7, 9 |
| 连接频繁断开 | 心跳被关闭 / 未实现重连 | 检查规则 4, 13 |
| 消费者不消费 | prefetch=0 / 用了 basic.get | 检查规则 11, 12 |
| 消息重复消费 | 未做幂等 / 网络分区恢复 | 检查规则 10, 14 |
| 发送性能差 | 每次创建新连接 / 未批量 | 检查规则 1, 8 |
| 流控导致发送慢 | 生产消费共用连接 | 检查规则 2 |
| broker 重启后服务中断 | 未开自动恢复 | 检查规则 13 |
深入排查时参考 references/reliability.md 的全链路图。
详细规则和背景知识按需加载: