我目前正在使用来自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
非常感谢您对此问题的任何见解。
答案 0 :(得分:1)
我曾经用EasyNetQ运行更长的工作(分钟)。它是包裹RabbitMQ.Client
的更高级客户端。
对我来说,这些错误的原因就像Evk在this comment中写的那样。我会尝试使用EasyNetQ,因为它likely提取了与处理过程分离的消息。
答案 1 :(得分:0)
您可以在每个队列和每条消息中增加RabbitMq中的TTL超时
IBasicProperties mqProps = model.CreateBasicProperties();
mqProps.ContentType = "text/plain";
mqProps.DeliveryMode = 2;
mqProps.Expiration = "300000"
model.BasicPublish(exchangeName,
routingKey, mqProps,
messageBodyBytes);
Documentaion是 https://www.rabbitmq.com/ttl.html
但我认为通过将其重写为异步模式以实现消息的实际处理,您会感觉更好。
这可能会为您提供使用RabbitMq进行异步消息处理的灵感
在这个问题中,关于异步消息消费也有相当多的信息。