【问题标题】:Rabbitmq server drops connection when client takes more than 60 seconds to acknowledge a message当客户端需要超过 60 秒来确认消息时,Rabbitmq 服务器会断开连接
【发布时间】: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,那不应该在处理心跳吗?
  • 从你的问题描述中我想到了这个想法,我自己没有验证这一点。
  • 昨天尝试更改为异步,仍然间歇性地收到此错误:(

标签: c# rabbitmq


【解决方案1】:

我曾经使用EasyNetQ 运行更长的工作(分钟)。它是包装RabbitMQ.Client 的更高级的客户端。

对我来说,这些错误的原因就像 Evk 在this comment 中写的那样。我会尝试 EasyNetQ,因为它 likely 获取的消息与处理过程分离。

【讨论】:

    【解决方案2】:

    您可以在 RabbitMq 中增加每个队列和每个消息的 TTL 超时

    IBasicProperties mqProps = model.CreateBasicProperties();
    mqProps.ContentType = "text/plain";
    mqProps.DeliveryMode = 2;
    mqProps.Expiration = "300000" 
    
    model.BasicPublish(exchangeName,
                       routingKey, mqProps,
                       messageBodyBytes);
    

    文档位于 https://www.rabbitmq.com/ttl.html

    但我认为最好将其重写为异步模式以实际处理消息。

    这可能会给您启发使用 RabbitMq 进行异步消息处理

    https://codereview.stackexchange.com/questions/42836/listen-to-multiple-rabbitmq-queue-by-task-and-process-the-message

    在这个问题中,也有很多关于异步消息消费的信息。

    multi-threading based RabbitMQ consumer

    【讨论】:

    • 感谢 Archlight 的回复,但究竟增加 TTL 对我有帮助吗?异步模式可能会有所帮助,我还没有验证这一点。会告诉你进展如何
    • 为了立即缓解疼痛,将 TTL 增加到 5 分钟以上应该可以避免超时。但我绝对推荐使用 Async
    • 心跳时长和ttl有关吗?我看到还有一种方法可以增加心跳超时。但这也只会推迟问题。
    • 似乎这无济于事,因为在向消费者发送消息 is delivered 之前,TTL 很重要。
    猜你喜欢
    • 2017-10-25
    • 1970-01-01
    • 2014-11-04
    • 2016-07-26
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 2016-07-16
    • 2015-09-09
    相关资源
    最近更新 更多