gpt4 book ai didi

.net - 如何在 RabbitMQ 中设置重试次数?

转载 作者:行者123 更新时间:2023-12-02 13:14:25 27 4
gpt4 key购买 nike

我正在使用 RabbitMQ,并且有一个保存电子邮件消息的队列。我的消费者服务使消息出队并尝试发送它们。如果出于任何原因,我的消费者无法发送消息,我想重新排队消息以再次发送。

我意识到我可以执行 basicNack 并将重新排队标志设置为 true,但是,我不想无限期地重新排队消息(例如,如果我们的电子邮件系统出现故障,我不想连续重新排队未发送的消息)消息)。我想定义可以重新排队再次发送消息的有限次数。

但是,当我将其出列并发送 nack 时,我无法在电子邮件对象上设置字段。队列中的消息中不存在更新的字段。

还有其他方法可以解决这个问题吗?

最佳答案

从 2023 年开始更新,基于仲裁队列的方式 poison message handling :

Quorum queues keep track of the number of unsuccessful delivery attempts and expose it in the "x-delivery-count" header that is included with any redelivered message.

他们还增加了限制重新交付的政策支持:

It is possible to set a delivery limit for a queue using a policy argument, delivery-limit.

因此,鉴于新增内容(以及经典队列的弃用),下面的原始答案可能不再与最新的 RabbitMQ 版本相关。

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

RabbitMQ(以及 AMQP 协议(protocol))中没有像重试尝试这样的功能。

实现重试尝试限制行为的可能解决方案:

  1. 如果之前未重新传递消息,则重新传递消息(检查 basic.deliver 方法上的 redelivered 参数 - 您的库应该为此提供一些接口(interface))并将其删除然后 catch dead letter exchange ,然后以某种方式进行处理。

  2. 每次消息无法处理时,都会再次发布它,但会设置或递增/递减 header 字段,例如 x-redelivered-count (不过,您可以选择任何您喜欢的名称)。在这种情况下,要控制重新交付,您必须检查您设置的字段是否达到某个限制(顶部或底部 - 0 是我的选择,来自 tcp/ip 的 ip header 中的 a-la ttl) .

  3. 将消息唯一键(例如 uuid,但在发布消息时必须手动设置)存储在 Redis、memcache 或其他存储中,甚至在 mysql 中与重新传递计数一起存储,然后在每次重新传递时递增/递减此值值,直到达到极限。

  4. (对于真正的极客)编写插件来实现您想要的行为。

#3的优点是重新传递的消息保留在队列头。如果您的队列很长或者消息顺序对您很重要(请注意,重新传递将打破严格的消息顺序,请参阅官方文档了解详细信息或 this question on SO ),这一点很重要。

附注:

similar answer在本主题中,但是在 php 中。仔细看一下,也许对你有一点帮助(从“有多种技术来处理周期重新交付问题”开始阅读。

关于.net - 如何在 RabbitMQ 中设置重试次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23158310/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com