概述
死信队列保存重试耗尽后的消息。如果没有监控,它就会变成无声的数据坟场。最小可用的视图包括深度随时间的变化和最老消息的年龄:深度说明有失败发生,年龄说明失败是否仍在持续。两者都应出现在值班人员真正会打开的面板上。
步骤
- 声明死信交换机、队列和绑定,并让工作队列指向 DLX:
rabbitmqadmin declare exchange name=orders.dlx type=direct durable=true
rabbitmqadmin declare queue name=orders.dlq durable=true
rabbitmqadmin declare binding source=orders.dlx destination=orders.dlq routing_key=orders
rabbitmqadmin declare queue name=orders.work durable=true \
arguments='{"x-dead-letter-exchange":"orders.dlx","x-dead-letter-routing-key":"orders"}'
- 启用 Prometheus 插件并确认指标:
curl -s http://localhost:15692/metrics | grep rabbitmq_queue_messages_ready。 - 在 Grafana 中按
rabbitmq_queue_messages_ready{queue="orders.dlq"} > 0建面板,并设置持续 10 分钟的告警。 - 用
rabbitmqadmin get queue=orders.dlq count=10 ackmode=ack_requeue_false检查消息,再按原始消息 id 重放到工作队列。
验证
预期面板能在消息被拒绝后一分钟内显示深度上升,重放后回落至 0;告警在持续非空 10 分钟后触发,并在清空后恢复。重放后消费者不应产生重复副作用,说明去重逻辑有效。
注意事项
- 指标只反映队列状态,不包含失败原因,需要结合消费者日志或消息头分析。
- 重放是人工操作,必须使用原始消息 id 并保证消费者幂等。
- 单条毒消息不应立即触发告警,应设置持续时间避免夜间误报。
- 按失败类别在消息头中打标,便于统计哪类失败占主导,从而修复消费者或生产者契约。