C# Rebus停止从RabbitMQ检索消息
我们的Rebus/RabbitMQ设置中存在一个问题,Rebus突然停止从RabbitMQ检索/处理消息。这在上个月已经发生了两次,我们真的不确定如何继续 我们的RabbitMQ设置在不同的服务器上有两个节点,Rebus端是一个windows服务 我们在运行Rebus的服务器上的Rebus或事件日志中未看到任何错误。我们也没有在RabbitMQ服务器上看到错误 Rebus(和windows服务)继续运行,因为我们确实看到了其他日志消息,如DueTimeOutSchedular和timeoutreplies。但是,工作线程似乎停止运行,但没有记录任何错误 它导致RabbitMQ输入队列不断增长:(,我们正在添加日志以监视此情况,以便在再次发生时收到通知 但我正在寻找如何继续“调查”的建议,以及如何预防这种情况的想法。也许你们中的一些人以前有过这种经历 更新 看起来我们确实有一个节点崩溃,至少上次是这样。主RabbitMQ节点崩溃(服务器崩溃),从节点升级为主节点。据我所知,从节点上的RabbitMQ日志,一切都按照计划进行。RabbitMQ日志中没有其他错误 在发生这种情况时,Rebus被配置为仅连接到作为从节点(然后升级为主节点)的节点,因此Rebus没有遇到rabbitmq故障,因此没有Rebus连接错误。但是,在发生故障时,Rebus似乎停止处理消息 事实上,我们在一些队列中似乎遇到了这种情况,其中一些队列,但并非所有队列最终都处于非同步状态 更新2 我可以很容易地重现这个问题,所以在我们的设置中可能是一个配置问题。但我们就是这样重现它的C# Rebus停止从RabbitMQ检索消息,c#,rabbitmq,rebus,C#,Rabbitmq,Rebus,我们的Rebus/RabbitMQ设置中存在一个问题,Rebus突然停止从RabbitMQ检索/处理消息。这在上个月已经发生了两次,我们真的不确定如何继续 我们的RabbitMQ设置在不同的服务器上有两个节点,Rebus端是一个windows服务 我们在运行Rebus的服务器上的Rebus或事件日志中未看到任何错误。我们也没有在RabbitMQ服务器上看到错误 Rebus(和windows服务)继续运行,因为我们确实看到了其他日志消息,如DueTimeOutSchedular和timeoutre
BasicDeliverEventArgs ea;
if (!threadBoundSubscription.Next((int)BackoffTime.TotalMilliseconds, out ea))
{
return null;
}
// wtf??
if (ea == null)
{
return null;
}
见:
我喜欢“wtf???”的评论:)听起来很奇怪 每当Rebus的RabbitMQ传输在连接上遇到错误时,它将抛出连接,等待几秒钟,并确保在可能的情况下重新建立连接 您可以在此处的源文件中看到相关位置: 因此,我想问题是RabbitMQ客户机库是否能够以某种方式进入故障状态,在Rebus尝试获取下一条消息时不会引发异常 当您遇到错误时,是否检查RabbitMQ管理UI中的“连接”选项卡并查看客户端是否仍然连接 更新: 感谢您的深入调查:) “wtf???”在那里是因为我曾经在
ea
显然为空时遇到了一个小问题,这在当时是意外的,因此导致了NullReferenceException
之后出现异常,并且异常在我的日志中到处都是
根据,Next
将返回true,并在到达“流结束”时将结果设置为null,这显然是底层模型关闭时发生的情况
在这种情况下,Rebus的正确行为是抛出一个适当的异常并让连接重新建立——我将立即实现它
耐心等待,我会在几分钟内为您准备好修复程序!非常感谢。我已经多次运行我的测试应用程序,无法重现错误,它正确地检测到流结束并重新连接。但是,我们确实看到“回滚事务时发生错误!”!“错误,但这也发生在“正常”连接错误期间。Rebus现在继续检索消息:)感谢您帮助我改进Rebus-这是一个非常有用的错误描述!:)