【发布时间】: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
-
感谢亚历克斯,重新连接逻辑看起来像这里的方式,因为所有其他配置都不能解决问题
标签: c# rabbitmq windows2012 heartbeat tcp-keepalive