Rabbitmq 空闲连接断开

Posted

技术标签:

【中文标题】Rabbitmq 空闲连接断开【英文标题】:Rabbit MQ idle connection dropped 【发布时间】:2017-08-22 14:43:07 【问题描述】:

我有一个作为消费者/订阅者运行的 .NET Windows 服务,它正在侦听消息队列。

windows 服务运行在安装了 rabbit mq server s/w 的同一台机器上。

如果队列空闲 60 分钟,将导致连接被丢弃(我在监控 UI 仪表板时知道这一点)并使 Windows 服务进入错误状态。

事实证明,解决这个问题令人沮丧。 我已经在rabbit mq客户端上应用了心跳设置,但这没有效果。

以下错误是我在连接断开时在日志文件中得到的错误

=ERROR REPORT==== 22-Aug-2017::12:20:29 ===
closing AMQP connection <0.1186.0> ([FE80::C00E:F801:A2A7:8530]:61481 -> 
[FE80::C00E:F801:A2A7:8530]:5672):
missed heartbeats from client, timeout: 30s

Rbbit mq 服务器日志文件设置: [兔子,[ heartbeat, 60]].

客户端代码:

var connectionFactory = new ConnectionFactory
        
            HostName = hostName,
            UserName = userName,
            Password = password,
            RequestedHeartbeat = heartBeat,
            AutomaticRecoveryEnabled = true,
            NetworkRecoveryInterval = TimeSpan.FromSeconds(numberOfSecondsInterval),
            RequestedConnectionTimeout = RequestedConnectionTimeoutInMiliseconds
        ;

        if (port > 0)
            connectionFactory.Port = port;

        var connection = connectionFactory.CreateConnection();

        var model = connection.CreateModel();

        model.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false); 

        return new Tuple<IConnection, IModel>(connection, model);

上面的心跳值设置为30秒,

网络恢复值设置为 10 秒 &

请求连接超时设置为 2 秒

我不知道在配置方面我还缺少什么??

上面运行的服务器是 Windows 2012 R2

基本上,我希望无论空闲时间如何,都能看到连接始终保持不变。

是否有一个 Windows 操作系统级别的 TCP 保持活动设置我需要确保也到位?

Rabbit MQ 版本为 3.6.8

把我的头发扯掉了,所以任何指针都非常感谢

【问题讨论】:

有防火墙吗?它们似乎也中断了空闲连接。 本机windows防火墙关闭,win服务和rabbit mq服务器也在同一台机器上 我在 win 服务的连接设置中将服务器名称更改为 localhost 而不是机器名称,但这没有影响 您可以尝试:使用wireshark 或类似工具拦截heartbits(您需要将rabbitmq 服务器放在网络或VM 上)。检查问题是否仍然存在。如果是这样,那么您可以确定 heartbits 是否真的到达了 RabbitMQ 服务器。也许您的应用实际上出于某种原因停止发送它们。另一件事:无论如何,您都需要实现重新连接逻辑,您不应该相信连接永远存在,因为您的客户端和服务器可以彼此分区。看起来您的代码是 .NET,您可以查看 EasyNetQ 或 MassTransit 感谢亚历克斯,重新连接逻辑看起来像这里的方式,因为所有其他配置都不能解决问题 【参考方案1】:

通过应用this SO post 中引用的重新连接逻辑,我成功地阻止了 RabbitMQ 服务器上的空闲连接断开(60 分钟后)。

注意:答案已更新为最新版本的 RabbitMQ 客户端已启用自动连接恢复,因此不需要手动重新连接逻辑。在我的情况下这不是真的,因为我已经应用了这些设置,但我仍然看到连接在 60 分钟空闲时间后下降。我的场景中的客户端和服务器在同一台机器上。

如果有人知道 60 分钟空闲时间设置的来源,我将不胜感激,我扫描了所有 rabbitmq 配置设置,但找不到任何相关内容。

【讨论】:

以上是关于Rabbitmq 空闲连接断开的主要内容,如果未能解决你的问题,请参考以下文章

使用activity方法后,Android应用程序与RabbitMQ断开连接

RabbitMQ - 关闭空闲/悬空通道

spring websocket+rabbitmq stomp:如何获取所有在线用户并断开部分用户的连接?

java rabbitmq 客户端在失去连接后怎么自动恢复

使用Python实现清除RabbitMQ里面1小时没有数据的连接

Node下RabbitMQ的使用