【问题标题】:Messages disappearing from message queue消息从消息队列中消失
【发布时间】:2019-02-25 17:58:03
【问题描述】:

在我们的软件中,我们将 Rebus 服务总线与 Microsoft 消息队列结合使用来执行各种操作。由于一段时间以来存在多种情况,消息被发送到队列但不知何故消息没有被处理程序拾取并且消息从队列中删除(或者它从未到达)。我们在错误队列或死信队列中找不到消息。它在太空中的某个地方消失了,我们不知道发生了什么。

我们在队列中启用了日志,对于失败的消息,我们看到当前中止计数设置为 3,其中成功处理的消息的当前中止计数为 1。使用我们的 rebus 配置的对应方(请参阅下面),但是我们不知道为什么它们被中止或为什么某些消息失败。事件日志中也没有任何内容。

这是我们当前的 rebus 配置:

Configure.With(_adapter).Transport(t => t.UseMsmq(_rpAppBusAddress))
                 .Options(o =>
                 {
                     o.EnableEncryption(_rebusEncryptionKey);
                     o.SimpleRetryStrategy(maxDeliveryAttempts:3);
                     o.EnableDataBus().StoreInSqlServer(rebusConnectionString, attachmentDbTableName);
                 }).Routing(SetRouting())
                 .Start();

有人知道为什么消息消失了吗?任何帮助表示赞赏!

【问题讨论】:

  • 我们也禁用了 MSMQ 中的存储限制,但这也无济于事。
  • 当你说你检查了死信队列时,你是指 Rebus 的错误队列吗?还是您的意思是 MSMQ 的“事务性死信消息”队列?
  • 我们检查了 rebus 错误队列和事务死信队列
  • 您能否以某种方式使用来自_rpAppBusAddress 指定的相同队列名称的消息的其他东西?
  • @JohnBreakwell 否定 journilang 默认由 rebus 启用

标签: msmq rebus


【解决方案1】:

我们找到了消息消失的原因。应用程序无权将消息放入错误队列(我们感到羞耻)。

【讨论】:

  • 好的....但是消息真的消失了吗?还是它们只是变得不可见,因为它们被接收然后在某个时候回滚?据我所知,Rebus 不会丢失消息。如果 forward-to-error-queue 动作失败,那么传入消息的MessageQueueTransaction 将不会被提交,从而将接收到的消息返回到输入队列
  • 据我所知消息消失了。我们在 msmq 中的任何队列上都没有发现其他消息痕迹。但是,我们确实使用旧版本的 rebus (3.1.5)。
  • 这应该没什么区别。 Rebus 一直以来都有严格的操作顺序,这表明它 1) 尝试处理传入的消息,如果没有失败,它 2) 尝试发送所有传出的消息,如果没有失败 3) 确认传入的消息。如果在此过程中出现故障,它将拒绝传入消息,从而有效地使其再次在队列中可见.....如果我应该帮助您进一步调查,请告诉我:)
  • 好吧,我们现在解决了这个问题,所以不需要进行广泛的调查。我确实发现有趣的是我们在 MSMQ 的任何地方都看不到消息。难道是因为将消息放入队列的应用程序与处理消息的应用程序相同?您将进入一个无休止的循环,试图处理消息并且未能将其放入错误队列。