2014-01-07 36 views
2

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

我们的RabbitMQ设置有不同的服务器上的两个节点,以及卤面端是一个Windows服务。

我们看到卤面或在卤面运行在服务器上的事件日志中没有错误。 我们在RabbitMQ服务器上也看不到错误。

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

它导致的是不断增加:(,我们添加日志监控,以使我们得到通知,如果它再次发生一个RabbitMQ的输入队列。

但是我正在寻找就如何继续“调查”,并就如何防止这种想法,也许你们当中有些人已经在此之前经历?

UPDATE 看来,我们实际上也有一个节点崩溃,至少最后一次发生。主的RabbitMQ节点崩溃(服务器崩溃),并从被晋升为主。至于我可以从RabbitMQ的日志中看到的节点都文吨按计划。 RabbitMQ日志中没有其他错误。

在这件事发生卤面被配置为只连接到这是从(然后晋升为大师)的节点如此卤面没有经历过失败的RabbitMQ,因此没有卤面连接错误的时间。但是,似乎Rebus在发生故障时停止处理消息。

实际上,我们在这似乎是一个几队列体验这一点,他们中的一些,但不是所有的似乎不同步的状态已经结束了。

UPDATE 2 我能够很容易地重现问题,所以它可能是我们的设置中的配置问题。但这是我们重现它的方法

  1. 在集群中启动两个节点,例如: rabbit1(主)和rabbit2(从)
  2. Rebus的连接到rabbit2,从属
  3. 关闭rabbit1,主。 rabbit2被提升为掌握

这些队列被镜像

我们有两个小的测试应用程式来重现此,一个“发送”发送消息的每个第二和处理该消息的“消费者” 。

rabbit1已关闭时,“使用者”停止处理消息,但“发件人”不断发送消息并且队列不断增长。

  1. 开始rabbit1再次,它加入作为从

这有没有影响,“消费者”仍无法处理的消息。

  1. 重新启动“消费者”应用

当“消费者”重新启动它会检索所有消息和处理它们。

我想我已经正确地遵循了安装指南,但它可能是我们的配置问题。我似乎无法找到任何能够表明我们做错了什么的事情。

卤面仍连接到RabbitMQ的,我们看到,在管理网站的连接选项卡,将“消费者”发送/收到B/S下降至约2 B/S当它停止处理消息

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

BasicDeliverEventArgs ea; 
if (!threadBoundSubscription.Next((int)BackoffTime.TotalMilliseconds, out ea)) 
{ 
    return null; 
} 

// wtf?? 
if (ea == null) 
{ 
    return null; 
} 

参见:https://github.com/rebus-org/Rebus/blob/master/src/Rebus.RabbitMQ/RabbitMqMessageQueue.cs#L178

我喜欢 “WTF ??” 评论:)

回答

3

这听起来很奇怪!

每当Rebus的RabbitMQ传输出现连接错误时,它将丢弃连接,等待几秒钟,并确保在连接重新建立时连接重新建立。

你可以看到相关的地方在源位置:https://github.com/rebus-org/Rebus/blob/master/src/Rebus.RabbitMQ/RabbitMqMessageQueue.cs#L205

所以我想这个问题是RabbitMQ的客户端库是否能以某种方式进入故障状态,默默地,没有抛出异常时卤面attemps获取下一个信息...?

当您遇到错误时,您是否检查过RabbitMQ管理界面中的“连接”选项卡并查看客户端是否仍连接?

更新:

感谢您严查:)

的 “跆拳道?”在那里,因为当ea显然已经是空的,这在当时是意外的,因此我曾经经历过一次呃逆,因此导致了后面的NullReferenceException以及在我的日志中呕吐异常。

the docsNext将返回true,并设置result到空当它达到“结束流”,这显然是当底层模型被关闭会发生什么。

在这种情况下,Rebus的正确行为是抛出一个适当的异常,并让连接重新建立 - 我马上执行它!

请稍等,我会在几分钟内为您准备好一个修复程序!

+0

非常感谢。我现在已经多次运行我的测试应用程序,无法重现错误,它能够正确检测到流结束并重新连接。但是,我们看到“回滚事务时发生错误!”错误,但在“正常”连接错误期间也会发生此错误。 Rebus现在继续检索邮件:) –

+0

感谢您帮助我改进Rebus - 这是对错误的非常有帮助的描述! :) – mookid8000