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

fze*_*igd 15 amqp go rabbitmq

有没有办法计算一个工作被重新排队的时间(通过拒绝或Nak)而无需手动重新计算工作?我需要在'n'时间重试一份工作,然后在'n'时间之后放弃它.

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

pin*_*ain 16

还有redelivered那设置为true时消息重新发送一个或多个时间消息属性.

如果要跟踪重新传递计数或保留redelivers数(也就是IP堆栈中的跃点限制或ttl),则必须将该值存储在消息正文或标题中(字面意思 - 消费消息,修改消息然后将其发布修改回代理).

还有类似的问题和答案可能对您有所帮助:如何在RabbitMQ中设置多次重试?


Pet*_*ete 5

如果邮件实际上是死信,则可以检查x-death邮件标题的内容。

例如,当您reject/ nackwith requeue = false和队列具有关联的死信交换时,就是这种情况。

在这种情况下,此标头的内容是一个数组。每个元素都描述失败的传递尝试,其中包含诸如传递尝试的时间,路由信息等信息。

这适用于RabbitMQ-我不知道它是否通常适用于AMQP。

编辑

自从我最初编写此答案以来,x-death标头结构已更改。

标头更改格式通常是非常不好的事情,但是在这种特殊情况下,原因是如果连续对邮件进行死信,则邮件大小将无限期增长。

因此,我删除了曾经在此处获得消息死亡人数的那段代码。

仍然有可能从新的标头格式中获得死亡人数。

  • `x-death` 仅在消息为死信时添加。 (3认同)