C# Rebus停止从RabbitMQ检索消息

C# Rebus停止从RabbitMQ检索消息,c#,rabbitmq,rebus,C#,Rabbitmq,Rebus,我们的Rebus/RabbitMQ设置中存在一个问题,Rebus突然停止从RabbitMQ检索/处理消息。这在上个月已经发生了两次,我们真的不确定如何继续 我们的RabbitMQ设置在不同的服务器上有两个节点,Rebus端是一个windows服务 我们在运行Rebus的服务器上的Rebus或事件日志中未看到任何错误。我们也没有在RabbitMQ服务器上看到错误 Rebus(和windows服务)继续运行,因为我们确实看到了其他日志消息,如DueTimeOutSchedular和timeoutre

我们的Rebus/RabbitMQ设置中存在一个问题,Rebus突然停止从RabbitMQ检索/处理消息。这在上个月已经发生了两次,我们真的不确定如何继续

我们的RabbitMQ设置在不同的服务器上有两个节点,Rebus端是一个windows服务

我们在运行Rebus的服务器上的Rebus或事件日志中未看到任何错误。我们也没有在RabbitMQ服务器上看到错误

Rebus(和windows服务)继续运行,因为我们确实看到了其他日志消息,如DueTimeOutSchedular和timeoutreplies。但是,工作线程似乎停止运行,但没有记录任何错误

它导致RabbitMQ输入队列不断增长:(,我们正在添加日志以监视此情况,以便在再次发生时收到通知

但我正在寻找如何继续“调查”的建议,以及如何预防这种情况的想法。也许你们中的一些人以前有过这种经历

更新 看起来我们确实有一个节点崩溃,至少上次是这样。主RabbitMQ节点崩溃(服务器崩溃),从节点升级为主节点。据我所知,从节点上的RabbitMQ日志,一切都按照计划进行。RabbitMQ日志中没有其他错误

在发生这种情况时,Rebus被配置为仅连接到作为从节点(然后升级为主节点)的节点,因此Rebus没有遇到rabbitmq故障,因此没有Rebus连接错误。但是,在发生故障时,Rebus似乎停止处理消息

事实上,我们在一些队列中似乎遇到了这种情况,其中一些队列,但并非所有队列最终都处于非同步状态

更新2 我可以很容易地重现这个问题,所以在我们的设置中可能是一个配置问题。但我们就是这样重现它的

  • 在集群中启动两个节点,例如rabbit1(主节点)和rabbit2(从节点)
  • Rebus连接到从属设备rabbit2
  • 关闭兔子1,主人。兔子2被提升为主人
  • 队列是镜像的

    我们有两个小测试应用程序来重现这一点,一个是每秒发送一条消息的“发送者”,另一个是处理消息的“消费者”

    rabbit1关闭时,“消费者”停止处理消息,“发送者”继续发送消息,队列不断增长

  • 再次启动兔子1,它作为从机加入
  • 这没有效果,“消费者”仍然不处理消息

  • 重新启动“消费者”应用程序
  • 当“使用者”重新启动时,它将检索所有消息并处理它们

    我想我已经正确地遵循了安装指南,但这可能是我们的配置问题。我似乎找不到任何可以说明我们做错了什么的东西

    Rebus仍然连接到RabbitMQ,我们看到在管理站点上的connections选项卡中,“使用者”发送/接收的B/s在停止处理消息时下降到大约2 B/s

    更新3 好的,我下载了Rebus源代码并附加到我们的流程中,这样我就可以看到“RabbitMqMessageQueue”类停止时发生了什么。当“rabbit1*关闭时,“BasicDeliverEventArgs”为null,这是代码

    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-这是一个非常有用的错误描述!:)