RabbitMQ:如何使用计数器重新排队消息

问题描述 投票:0回答:2

有没有办法在不手动重新排队作业的情况下计算作业重新排队的次数(通过拒绝或 Nak)? 我需要重试一项工作 'n' 次,然后在 'n' 次后放弃它。

ps :目前我手动重新排队作业(删除旧作业,如果计数器不存在或值小于'n',则创建具有确切内容和额外计数器标题的新作业)

go rabbitmq amqp
2个回答
23
投票

从 2023 年开始更新基于仲裁队列的毒消息处理方式

Quorum 队列跟踪不成功传递的数量 尝试并在任何重新传递的消息中包含的“x-delivery-count”标头中公开它。

原答案(添加队列和流队列之前):

redelivered
消息属性,当消息重新发送一次或多次时设置为 true。

如果您想跟踪重新投递计数或剩余的重新投递数(又名跳数限制或 IP 堆栈中的 ttl),您必须将该值存储在消息正文或标头中(字面意思 - 使用消息,修改它,然后将修改后的内容发布回代理) .

还有类似的问题和答案可能对您有帮助:How do I set a number of retry attempts in RabbitMQ?


5
投票

如果消息实际上是死信,您可以查看

x-death
消息头的内容。

例如,当您

reject
/
nack
requeue = false
并且队列具有关联的死信交换时就是这种情况。

在那种情况下,此标头的内容是一个数组。每个元素描述一次失败的投递尝试,包含尝试投递的时间、路由信息等信息

这适用于 RabbitMQ - 我不知道它是否适用于一般的 AMQP。

编辑

自从我最初写这个答案以来,

x-death
标题结构已更改。

headers 改变格式通常是一件非常糟糕的事情,但是 在这种特殊情况下,原因是如果消息连续死信,消息大小将无限增长。

因此,我删除了用于获取消息死亡人数的代码片段。

仍然可以从新的标题格式中获取死亡人数。

© www.soinside.com 2019 - 2024. All rights reserved.