我有一个C#应用程序,它将RabbitMQ中的任务排队,由多个工作机器处理以进行分布式计算。每个工作者计算机都运行一个承载许多处理程序的进程,每个处理程序处理来自单个队列的消息。每个Handler都在自己的app-domain中启动。当这种方法正常工作时,队列处理程序可以在线保持数月而不会出现中断或问题。
我的一个队列处理程序始终停止在工作计算机上接收消息。他们不会立刻掉线......这有点一点点。
添加日志记录时,我发现RabbitMQ连接已关闭,并将关闭原因指定为" End of Stream"。没有确定的时间或明确的事件似乎导致这种情况,并且它只发生在这一个处理程序中。所有其他人继续工作,所以这不是一个网络问题。
我该怎么做才能找到根本原因?处理消息的C#代码的哪个方面可能会导致兔子通道关闭?
提前感谢您提供有关记录,调试或修复此问题的任何想法。
答案 0 :(得分:0)
如果每个处理程序都在自己的AppDomain中,则每个处理程序都必须有自己的IConnection。您的员工是否发布任何消息,例如更新和重新排队消息或发布状态信息?我怀疑特定处理程序突然停止工作,因为当此特定工作程序执行某些操作以超过其连接上的帧大小时,连接突然关闭。当消息超过最大帧大小时,代理将突然关闭连接,从而导致流结束客户端。代理日志将显示超出的帧大小和多少。
默认帧限制为128 KB。您应该检查该工作人员是否某事可能超过该范围。肯定还有一些其他因素会导致代理关闭连接,但这就是最常见的。无论如何,兔子日志应该可以帮助您找到原因。
答案 1 :(得分:0)
IConnection.Dispose()
可能会抛出EndOfStreamException
,如此处所述:RabbitMQ C# driver stops receiving messages