【问题标题】:RabbitMQ C# handler stops receiving messages - closing connection with error "End Of Stream"RabbitMQ C# 处理程序停止接收消息 - 关闭连接并出现错误“流结束”
【发布时间】:2015-05-22 08:25:44
【问题描述】:

我有一个 C# 应用程序,它在 RabbitMQ 中对任务进行排队,以由多台工作机器处理以进行分布式计算。每台工作机器运行一个进程,该进程托管许多处理程序,每个处理程序处理来自单个队列的消息。每个处理程序都在其自己的应用程序域中启动。当这正常工作时,队列处理程序可以保持在线数月而不会中断或出现问题。

我的一个队列处理程序一直停止在工作机器上接收消息。它们不会一下子全部掉下来……一次一点点。

添加日志时,发现RabbitMQ连接已关闭,并指定关闭原因为“End of Stream”。似乎没有确定的时间量或明确的事件会导致这种情况,而且它只发生在这个处理程序中。所有其他人都继续工作,所以这不是网络问题。

我该怎么做才能找到根本原因?处理消息的 C# 代码的哪些方面可能导致兔子频道关闭?

提前感谢您提供有关记录、调试或修复此问题的任何想法。

【问题讨论】:

标签: c# multithreading rabbitmq


【解决方案1】:

如果每个处理程序都在自己的 AppDomain 中,则每个处理程序都必须有自己的 IConnection。您的工作人员是否发布任何消息,例如更新和重新排队消息或发布状态信息?我怀疑特定处理程序突然停止工作,因为当该特定工作人员执行某些操作以超出其连接上的帧大小时,连接突然关闭。当消息超过最大帧大小时,代理会突然关闭连接,导致客户端的流结束。代理日志将显示超出的帧大小以及超出了多少。

默认帧限制为 128 KB。您应该检查该工人是否做了可能超出此范围的某事。肯定还有其他一些事情会导致代理关闭连接,但这就是我最常遇到的原因。无论如何,兔子日志应该可以帮助您找到原因。

【讨论】:

  • worker 偶尔会发布或重新排队,但消息不超过 256 字节......所以帧大小应该不是问题。我会尝试打开更强大的日志记录,看看是否有任何显示。
  • 这是唯一发布或重新排队的工作人员吗?或者,如果不同的操作共享一个 IModel 实例,它是否更容易受到某些竞争条件的影响?如果有可能多个线程一次访问它,或者它可能导致协议错误,这也可能导致服务器终止连接,您需要使用锁序列化对模型(又名通道)的访问。
【解决方案2】:

IConnection.Dispose() 可能会抛出 EndOfStreamException,如此处所述:RabbitMQ C# driver stops receiving messages

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    相关资源
    最近更新 更多