【问题标题】:NServiceBus MSMQ messages intermittently get stuck on the Outgoing QueueNServiceBus MSMQ 消息间歇性地卡在传出队列中
【发布时间】:2012-01-19 21:50:33
【问题描述】:

我们有一个基于 NServiceBus 的 Pub / Sub 系统,我们遇到间歇性问题,即消息无限期地卡在发布者传出队列上,而不是被传输到订阅者输入队列。

注意事项:

  1. 当我们重新启动发布者服务和订阅者服务时,消息流会正常恢复一段时间。
  2. 如果消息之间存在持续的时间间隔,问题似乎会更频繁地发生。
  3. 发布者服务位于 LAN 上,订阅者位于防火墙的另一端。
  4. 有些消息通过了!正如服务重新启动后所提到的,一段时间内一切正常。
  5. 使用 QueueExplorer,我可以看到 Outgoing 队列中的消息处于 WAITING 状态。

令人讨厌的是,我们的开发环境并没有表现出这种行为,但在这个环境中,发布者和订阅者都驻留在同一个 LAN 上。

【问题讨论】:

  • 好奇,订阅机有多个网卡吗?在我的情况下,订阅者是一台具有 LAN 和无线功能的笔记本电脑,但带有 Win7 且只有 1 个 NIC 的台式机没有出现问题。

标签: msmq nservicebus


【解决方案1】:

只是为了把我的 2p 扔进去:

我们遇到了一个问题,即消息队列服务存在某种内存泄漏,并且会消耗大量未释放的内存。

这会导致消息长时间卡住 - 尽管它们最终会送达(有时在 3 天后)。

我们还没有解决这个问题,因为它只会在服务负载过重时才会发生,而这种情况并不经常发生。

【讨论】:

    【解决方案2】:

    我也遇到过这个问题,我知道这不是第 4 项,因为在它卡在传出队列中之前我不会向它发送任何内容。如果我在发送消息之前让发布者和订阅者都坐了大约 10 分钟,它永远不会离开传出队列。如果我在这段时间之前发送一条消息,它就会正常运行。此外,如果我重新启动订阅者,则消息将流动。每次我让他们闲置 10 分钟时,这都是可重现的。

    我想我在这里找到了答案,至少这解决了我遇到的问题:

    http://support.microsoft.com/kb/2554746

    另外,在我的情况下,它与重新启动无关,所以不要让你失望,我确实在 netstat 中表现出症状,并且消息最初会在客户端首次启动时通过。

    【讨论】:

      【解决方案3】:


      MSMQ 消息卡在传出队列中纯粹是一个 MSMQ 问题。
      重新启动发布者和订阅者服务应该没有区别,因为它们不直接参与消息传递。如果您可以通过仅重新启动 Pub/Sub 服务而不是消息队列服务来解决问题,那么它看起来像是资源/内存泄漏问题。

      我想象会发生这样的事情:

      1. 消息流向目的地,这会耗尽内核内存来存储它们
      2. 由于某种原因,内核内存耗尽(消息过多、内存泄漏等)
      3. 目标现在拒绝新消息,因为它们无法从线路加载到内存中
      4. 连接被重置并且在达到 WaitTime 值之前不会重新连接;此时队列正在“等待”
      5. 系统循环通过 (3) 和 (4) 直到 ...
      6. Pub/Sub 服务已重新启动,现在有足够的资源来传递消息
      7. 转到 (2)

      当使用它的众多服务和设备驱动程序之一临时释放了足够的内核内存时,偶尔会出现消息。

      这篇博文的第 4 项最有可能是罪魁祸首: http://blogs.msdn.com/b/johnbreakwell/archive/2006/09/18/insufficient-resources-run-away-run-away.aspx

      干杯
      约翰·布雷克韦尔

      【讨论】:

      • 感谢 John,我们将对此进行更详细的研究,看看是否有帮助。感谢您的帮助。我唯一怀疑的是消息量非常小。也许每天只有一两个,但在那些吞噬内核内存的服务器上也许还有其他东西。将进行调查并提出建议。
      • 也遇到过这个问题,我知道这不是第 4 项,因为在它卡在传出队列中之前我不会向它发送任何内容。如果我在发送消息之前让发布者和订阅者都坐了大约 10 分钟,它永远不会离开传出队列。如果我在这段时间之前发送一条消息,它就会正常运行。另外,如果我重新启动订阅者,消息就会流动。
      • 每次我让他们闲置 10 分钟时,这都是可重现的。
      • 这看起来很奇怪。理论上,应用程序不应干扰 MSMQ 消息传递。 10 分钟后,传出队列通常会被删除(MSMQ CleanupInterval 仅为 2-5 分钟),因此需要建立新的网络会话。会话仍处于活动状态时发送的消息可以正常传递。我会查看网络跟踪,看看 10 分钟后发送消息时会发生什么。
      【解决方案4】:

      我们在生产中遇到了类似的情况,结果我们将一个订阅端点迁移到了一个新的物理主机,但在关闭旧端点之前忘记了取消订阅。我们的发布者试图将消息传递到旧端点和新端点,但只能到达新端点。最终,发布者出站队列变得如此之大,以至于开始影响所有传出消息。

      【讨论】:

      • 任何队列中的消息都计入系统配额并消耗内核内存。监控“所有队列中的消息总数”性能计数器总是一个好主意。
      猜你喜欢
      • 2011-05-01
      • 2011-04-21
      • 2011-06-02
      • 1970-01-01
      • 2013-10-01
      • 2016-04-17
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多