4

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

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

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

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

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

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

有没有人遇到过这个?

4

2 回答 2

10

我们有,这是因为这里描述的问题: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。

于 2012-11-15T22:04:00.017 回答
0

如果您的机器是从同一个映像创建的,那么您可能有非唯一的 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'
于 2017-10-13T04:48:52.217 回答