【问题标题】:NServicebus failing while sending messages to a msmq cluster queue in a load balanced environmentNServicebus 在负载平衡环境中向 msmq 集群队列发送消息时失败
【发布时间】:2012-11-04 09:18:07
【问题描述】:

我们在使用 NServiceBus 的负载平衡、高容量环境中遇到 MSMQ 问题。

我们的环境如下所示: 1 F5 通过轮询将 Web 流量分配到 6 个应用服务器。这 6 台服务器中的每台都使用驻留在集群上的远程计算机上的 Bus.Send to 1 队列。

正常使用期间的事件吞吐量约为每台服务器每秒 5-10 个。所以整个环境中每秒有 30-60 个事件,具体取决于负载。

我们看到的问题是 1 个应用程序框能够将消息发送到集群队列,但其他 5 个不能。查看发生故障的 5 个盒子,集群的传出队列处于非活动状态。

事务死信队列中也有大量事件。当我们清除该队列时,传出队列连接到集群,但是,消息在传出队列中增长为未确认。这会继续增长,直到它们再次进入事务死信队列,并且传出队列将状态更改为非活动状态。

有趣的是,当我们执行此清除操作时,另一个盒子将成为“好盒子”。所以我们很确定问题不是一个坏盒子,而是一次只有一个盒子可以可靠地保持与集群队列的连接。

以前有人遇到过这种情况吗?

【问题讨论】:

  • 您运行的是什么版本的 MSMQ?您是否也尝试过相同的设置但没有事务排队?
  • msmq 5.0 windows 2008 r2。 nsb 未配置为事务性的。

标签: msmq nservicebus


【解决方案1】:

我们有,这是因为这里描述的问题:http://blogs.msdn.com/b/johnbreakwell/archive/2007/02/06/msmq-prefers-to-be-unique.aspx

短版:在安装 MSMQ 时,每个 MSMQ 安装都有一个唯一的 ID。它被称为 QMId,位于

下的注册表中

HKLM\Software\Microsoft\MSMQ\Parameters\Machine Cache\QMid

它在向远程接收者发送时用作标识符,而远程接收者又使用它将 ACK 发送回正确的发送者。接收器(在您的情况下为集群)维护将 QMId 映射到 IP 的缓存。我们的问题是我们的几个工人有相同的 QMId。这意味着集群将来自所有机器的所有消息的所有 ACK 发送到发送消息的第一台机器。在某些时候,对于某些操作(如 MSMQ Windows 服务重新启动),缓存过期并且另一台机器神奇地“工作”。

因此,请检查您的 6 台服务器并确保它们都没有相同的 QMid。我们的值相同,因为它们都是从安装 MSMQ 后获取的 Windows 映像中复制出来的。

修复很简单,只需在每台机器上重新安装 MSMQ 功能即可生成新的唯一 QMId。

【讨论】:

  • 确实如此。就像你说的那样,池中的机器是从同一个图像中重影的,因此是问题所在。另一个 MSMQ 陷阱!谢谢。
【解决方案2】:

如果您的机器是从同一个映像创建的,那么您可能有非唯一的 MachineCache ID。您可以通过在每台计算机上运行以下 powershell 脚本来解决此问题。

这可以在创建映像之前完成,也可以在启动后在每台机器上完成。

Remove-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\MSMQ\Parameters\MachineCache' -name 'QMId'
Set-ItemProperty -Path  'Registry::HKLM\Software\Microsoft\MSMQ\Parameters' -Name SysPrep -Value 1

Restart-Service -Name 'MSMQ'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2017-04-27
    • 2015-04-02
    • 2015-09-27
    • 1970-01-01
    • 2011-10-30
    • 2014-09-29
    相关资源
    最近更新 更多