Go语言 RabbitMQ:如何使用计数器对消息进行重新排队

pw9qyyiw  于 2023-03-06  发布在  Go
关注(0)|答案(2)|浏览(187)

是否有任何方法可以在不手动重新排队作业的情况下计算重新排队作业的次数(通过拒绝或Nak)?我需要重试作业“n”次,然后在“n”次后丢弃它。
ps:目前我手动重新排队作业(删除旧作业,创建一个具有确切内容的新作业,如果计数器不存在或值小于“n”,则创建一个额外的计数器标题)

h5qlskok

h5qlskok1#

从2023年起基于仲裁队列的有害消息处理方式进行更新:

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

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

当消息重新传递一次或多次时,redelivered消息属性设置为true。
如果您想跟踪重新传递计数或剩余重新传递数(又名IP堆栈中的跳数限制或TTL),您必须将该值存储在消息正文或消息头中(字面上-消费消息,修改它,然后将修改后的消息发布回代理)。
也有类似的问题与答案,这可能会帮助你:How do I set a number of retry attempts in RabbitMQ?

a5g8bdjr

a5g8bdjr2#

在消息实际上是死信的情况下,您可以检查x-death消息头的内容。
例如,当您使用requeue = false执行reject/nack,并且队列具有关联的死信交换时,就会出现这种情况。
在这种情况下,这个头的内容是一个数组,每个元素描述一个失败的传递尝试,包含诸如尝试传递的时间、路由信息等信息。
这适用于RabbitMQ-我不知道它是否适用于AMQP。

    • 编辑**

自从我最初编写这个答案以来,x-death头结构已经发生了变化。
标头更改格式通常是一件非常糟糕的事情,但在这种特殊情况下,原因是如果消息连续地被添加死信,则消息大小将无限增长。
因此,我删除了一段代码,它曾经在这里获得消息的死亡编号。
仍然可以从新的标题格式中获得死亡人数。

相关问题