使用 RabbitMQ.Client v. 6.2.2 我面临这样的问题:如果集群中的代理发生故障,EventingBasicConsumer有时会停止接收消息。
为了调查这个问题,我正在记录恢复尝试,它们通常工作得很好。但这个周末,工作人员再次停止接收消息,我正在寻求建议如何找出哪一方有问题。 RabbitMQ 服务器命令客户端以及如何处理它。
EventingConsumer 的配置几乎是默认设置,AutomaticRecoveryEnabled=true 且每 60 秒检测一次 + 启用拓扑恢复
var factory = new ConnectionFactory
{
Uri = new Uri(config.ConnectionString),
AutomaticRecoveryEnabled = true,
RequestedHeartbeat = TimeSpan.FromSeconds(60),
};
当时的服务器日志如下所示
2022-01-22 06:43:28.436 [info] <0.12831.3> accepting AMQP connection <0.12831.3> (X.X.X.X:59644 -> X.X.X.X:5672)
2022-01-22 06:43:28.460 [info] <0.12831.3> connection <0.12831.3> (X.X.X.X:59644 -> X.X.X.X:5672): user 'user' authenticated and granted access to vhost 'vhost'
2022-01-22 06:44:52.904 [error] <0.1031.0> ** Node '[email protected]' not responding **
** Removing (timedout) connection **
2022-01-22 06:44:52.904 [info] <0.529.0> rabbit on node '[email protected]' down
2022-01-22 06:44:52.939 [info] <0.529.0> Node [email protected] is down, deleting its listeners
2022-01-22 06:44:52.942 [info] <0.529.0> node '[email protected]' down: net_tick_timeout
2022-01-22 06:46:07.706 [info] <0.529.0> node '[email protected]' up
2022-01-22 06:46:22.468 [info] <0.529.0> rabbit on node '[email protected]' up
客户端日志
2022-01-22 06:42:44.7370409+00:00 RabbitMqClientEventSource - Received request to BeginAutomaticRecovery, but already in Recovering state.
2022-01-22 06:42:49.7397378+00:00 RabbitMqClientEventSource - Performing automatic recovery
2022-01-22 06:42:49.9343050+00:00 RabbitMqClientEventSource - Connection recovery completed
2022-01-22 06:42:50.1977866+00:00 Received message {MessageId} ...
客户端成功恢复并收到一条消息,然后完全停止,直到连接重置。
我想知道服务器是否确实通过
deleting its listeners
破坏了应用程序的状态。查看管理用户界面,我发现连接和通道已连接,但没有为消费者列出消费者。
我在 RabbitMQ 客户端库中看到一些恢复错误,但我不确定他们是否会修复这种情况。客户端具有工作连接,但几乎不再是消费者,双方都乐意继续,这对应用程序来说有点糟糕。
阻止这种情况发生的好方法是什么?实现自定义重新连接/重试/恢复逻辑似乎 a) 太复杂 b) 不实用。
如果我1-2分钟没有收到消息,有没有办法在客户端检查我是否仍然是消费者?如果是这样,请重新启动应用程序或强制重新连接?
请升级至6.2.4版本。我修复了一个可能导致您在此处报告的错误。