我可以为RabbitMQ使用者设置显式任务超时吗?

时间:2016-04-21 23:27:51

标签: c# rabbitmq

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

消费者/工人还活着的情况怎么样,但是这个过程已经停滞了太长时间并且没有结束?

我想设置一个明确的时间,表示如果已将消息发送给消费者,但该消费者已将该消息保持为ack的时间太长以至于该消息将被重新排队。

我认识到这可能会导致邮件被重复处理,但有时其结果并不像延迟邮件传递那么糟糕。 如果吞下某些内容,任务终止,并且消息永远不会被重新排队,那么也可能发生错误的异常处理。

1 个答案:

答案 0 :(得分:1)

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

  1. 超时到期后终止与代理的连接,并且 因此,消息将被重新排队
  2. 确认收到的消息并重新发布(明确地)
  3. NACK收到的消息,但是based on the documentationinstructing the broker to either discard them or requeue them),似乎应该设置一些配置来指示代理应该如何处理NACKed消息

  4. 现在所有这些意味着至少部分过程不会被卡住。如果整个过程陷入困境,也许经纪人对消费者的心跳停止了,这就是经纪人知道消费者死亡的方式(老实说,我没有测试这种情况,所以我假设),但如果这不是case(或者只是为了更安全)你可以添加一些看门狗进程,它会ping消费者并在没有回复的情况下杀死他们,这又会导致消息没有被确认并被重新排队。 / p>