【发布时间】:2017-05-11 09:48:24
【问题描述】:
我目前正在使用来自 RabbitMQClient.dll C# 客户端的 EventingBasicConsumer,我们生成了一个不同的线程来处理传递给消费者的每条消息。
我们遇到了一个奇怪的行为,RabbitMQ 服务器在
出现错误missed heartbeats from client, timeout: 60s 的次数。片刻之后,客户端报告了错误消息Already closed: The AMQP operation was interrupted: AMQP close-reason, initiated by Library, code=541。我还看到这个错误client unexpectedly closed TCP connection 发生得更频繁。
在某些情况下,客户端可能需要超过 60 秒来处理一个作业请求,并且在这种情况下会发生此错误。
是否要求在 60 秒内处理作业?因为对于我们的流程,这可能在 30 秒到 5 分钟之间变化。
RabbitMQ 服务器:3.6.6 RabbitMQ.Client.dll(C#客户端):RabbitMQ.Client.4.1.1
非常感谢您对此问题的任何见解。
【问题讨论】:
-
您很可能会在
Received处理程序中处理所有消息,这会阻止通道上的所有其他活动(我想),包括热跳动。尝试异步处理消息:在Received事件处理程序中将它们放入某个队列(如 ConcurrentQueue)并在另一个线程中处理该队列。完成某些消息后 - 在频道上确认它。 -
我目前正在做这样的处理,但是为什么会阻塞通道。我有 100 个预取,我看到处理程序产生了 100 个线程。我还看到一个线程在主动监听 RabbitMQ,那不应该在处理心跳吗?
-
从你的问题描述中我想到了这个想法,我自己没有验证这一点。
-
昨天尝试更改为异步,仍然间歇性地收到此错误:(