在使用NServiceBus的负载平衡的大容量环境中,我们遇到了MSMQ问题。
我们的环境如下:1 F5通过循环调度将web流量分发到6个应用程序服务器。这6台服务器中的每一台都使用驻留在集群上的远程机器上的Bus.Send to 1队列。
正常使用时,每台服务器的事件吞吐量约为每秒5-10个。因此,整个环境中每秒发生30-60个事件,具体取决于负载。
我们看到的问题是,其中1个应用程序框能够将消息发送到集群队列,但其他5个不能。查看发生故障的5个机器,到集群的传出队列处于非活动状态。
在事务死信队列中也有大量事件。当我们清除该队列时,传出队列连接到集群,但是,消息在传出队列中增长为未确认。这将继续增长,直到它们再次进入事务死信队列,并且传出队列将状态更改为inactive。
有趣的是,当我们执行这个清除操作时,一个不同的盒子会变成“好盒子”。因此,我们非常确定问题不是一个坏的盒子,而是一次只有一个盒子可以可靠地维护到集群队列的连接。
以前有没有人遇到过这个问题?
发布于 2012-11-16 06:04:00
我们有,这是因为这里描述的问题: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缓存\QMid
它在发送到远程接收方时用作标识符,而远程接收方使用它将ACK发送回正确的发送方。接收方(在您的示例中为集群)维护一个将QMIds映射到in的缓存。我们的问题是我们的几个工人有相同的QMId。此时,集群将来自所有机器的所有消息的所有ACKS发送到发送消息的第一台机器。在某一时刻,对于某些操作,如MSMQ windows服务重启,缓存过期,另一台机器神奇地“工作”。
因此,请检查您的6台服务器,并确保它们都没有相同的QMid。我们的具有相同的价值,因为它们都是在安装MSMQ后拍摄的Windows映像的重影。
修复很简单,只需在每台机器上重新安装MSMQ功能,以生成一个新的唯一QMId。
发布于 2017-10-13 12:48:52
如果您的计算机是从同一映像创建的,则您的MachineCache If可能不是唯一的。您可以通过在每台计算机上运行以下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'https://stackoverflow.com/questions/13403192
复制相似问题