Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以为RabbitMQ使用者设置显式任务超时吗?_C#_Rabbitmq - Fatal编程技术网

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

C# 我可以为RabbitMQ使用者设置显式任务超时吗?,c#,rabbitmq,C#,Rabbitmq,我知道,默认情况下,如果检测到使用者/工作者已死亡,带有ack的RabbitMQ将对消息重新排队 如果消费者/工作人员仍然活着,但其流程已停滞太久且没有响应,那么情况如何 我想设置一个明确的时间,表示如果消息已发送给消费者,但消费者在没有ack的情况下保留消息的时间过长,则消息将重新排队 我认识到这可能会导致消息被重复处理,但有时其后果并不像延迟消息传递那样糟糕。 如果吞咽了某些内容,任务终止,消息永远不会确认,也永远不会重新排队,也可能发生错误的异常处理。RabbitMQ使用者的超时可以在使用

我知道,默认情况下,如果检测到使用者/工作者已死亡,带有ack的RabbitMQ将对消息重新排队

如果消费者/工作人员仍然活着,但其流程已停滞太久且没有响应,那么情况如何

我想设置一个明确的时间,表示如果消息已发送给消费者,但消费者在没有ack的情况下保留消息的时间过长,则消息将重新排队

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

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

  • 超时过期后终止与代理的连接,以及 因此,该消息将被重新查询
  • 确认接收到的消息并重新发布(明确)
  • NACK接收到的消息,但是(
    指示代理放弃它们或重新获取它们
    ),似乎应该设置一些配置,指示代理如何处理NACK消息

  • 现在,所有这些都意味着至少有一部分过程没有停滞。如果整个过程都被卡住了,那么可能代理对消费者的心跳停止了,这就是代理知道消费者死亡的原因(老实说,我没有测试这种情况,所以我假设是这样),但是如果不是这样(或者只是为了更安全),您可以添加某种监视程序来ping消费者如果没有回复,就会杀死它们,这同样会导致消息没有被确认和重新查询