gpt4 book ai didi

c# - 我可以为 RabbitMQ 消费者设置明确的任务超时吗?

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:28 47 4
gpt4 key购买 nike

我知道带有 ack 的 RabbitMQ 默认情况下会在检测到消费者/工作人员死亡时重新排队消息。

如果消费者/工作人员还活着,但它的进程停滞了太久并且没有确认,情况会怎样?

我想设置一个明确的时间,说明如果一条消息已发送给消费者,但该消费者在没有确认的情况下持有该消息的时间太长,以至于该消息会重新排队。

我知道这可能会导致消息被重复处理,但有时其后果不如延迟消息传递那么糟糕。如果某些东西被吞下,任务终止,并且消息永远不会被确认并且永远不会重新排队,它也可能发生在错误的异常处理中。

最佳答案

RabbitMQ 消费者的超时可以在消费者端明确设置。我认为这很清楚,但只是提一下——在这种情况下不能有任何自动 ACK。解决方案是消费者是多线程的,其中一个线程执行消息处理并仅在消息处理后才确认消息,另一个线程是超时线程:

  1. 一旦超时就终止与代理的连接,并且因此,消息将被重新排队
  2. 确认收到的消息并重新发布(明确地)
  3. NACK 收到的消息,但是based on the documentation (指示代理丢弃它们或重新排队),似乎应该设置一些配置来指示代理如何处理 NACKed 消息


现在所有这些都意味着至少过程的某些部分没有卡住。如果整个过程卡住了,也许经纪人对消费者的心跳停止了,这就是经纪人知道消费者死亡的方式(老实说我没有测试这种情况,所以我假设),但如果这不是在这种情况下(或者只是为了更加安全),您可以添加某种看门狗进程,该进程将对消费者执行 ping 操作,如果没有回复则将其杀死,这将再次导致消息未被确认并重新排队。

关于c# - 我可以为 RabbitMQ 消费者设置明确的任务超时吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36782162/

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