rabbitmqctl list_queues name arguments messages
rabbitmqadmin get queue=order.dlq count=5

消费失败的消息在业务队列里反复重投,声明时带了 x-dead-letter-exchange,死信队列里一条都收不到。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:死信只在消息被 reject 且 requeue 为 false、过期或者队列超长时才触发,nack 之后重新回到原队列根本不算死信。

「RabbitMQ 死信队列」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:确认 nack 调用里 requeue 参数传的确实是 false;核对死信交换机的 routing key 有没有被队列参数覆盖;队列参数声明后改不了 只能删掉重建再灌数据。

确认没问题再收工,失败消息出现在死信队列里,业务队列的重复投递停下来。

作者 9823189