← 中文资源

简体中文版本

搭建死信队列监控面板

把死信队列深度与最老消息年龄导出到 Prometheus,配置 Grafana 面板,并提供可审计的重放命令。

阅读英文原文

概述

死信队列保存重试耗尽后的消息。如果没有监控,它就会变成无声的数据坟场。最小可用的视图包括深度随时间的变化和最老消息的年龄:深度说明有失败发生,年龄说明失败是否仍在持续。两者都应出现在值班人员真正会打开的面板上。

步骤

  1. 声明死信交换机、队列和绑定,并让工作队列指向 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"}'
  1. 启用 Prometheus 插件并确认指标:curl -s http://localhost:15692/metrics | grep rabbitmq_queue_messages_ready。
  2. 在 Grafana 中按 rabbitmq_queue_messages_ready{queue="orders.dlq"} > 0 建面板,并设置持续 10 分钟的告警。
  3. 用 rabbitmqadmin get queue=orders.dlq count=10 ackmode=ack_requeue_false 检查消息,再按原始消息 id 重放到工作队列。

验证

预期面板能在消息被拒绝后一分钟内显示深度上升,重放后回落至 0;告警在持续非空 10 分钟后触发,并在清空后恢复。重放后消费者不应产生重复副作用,说明去重逻辑有效。

注意事项

  • 指标只反映队列状态,不包含失败原因,需要结合消费者日志或消息头分析。
  • 重放是人工操作,必须使用原始消息 id 并保证消费者幂等。
  • 单条毒消息不应立即触发告警,应设置持续时间避免夜间误报。
  • 按失败类别在消息头中打标,便于统计哪类失败占主导,从而修复消费者或生产者契约。