在负载平衡环境中将消息发送到msmq群集队列时,NServicebus失败

在负载平衡环境中将消息发送到msmq群集队列时,NServicebus失败,msmq,nservicebus,Msmq,Nservicebus,我们在使用NServiceBus的负载平衡、高容量环境中遇到MSMQ问题 我们的环境如下所示:1 F5通过循环向6台应用服务器分发web流量。这6台服务器中的每台都使用一个总线。发送到位于群集上的远程计算机上的1个队列 正常使用期间,每台服务器的事件吞吐量约为每秒5-10次。因此,在整个环境中每秒发生30-60个事件,具体取决于负载 我们看到的问题是,其中1个应用程序框能够向集群队列发送消息,但其他5个应用程序框不能。查看出现故障的5个框,集群的传出队列处于非活动状态 事务死信队列中还有大量事件

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

我们的环境如下所示:1 F5通过循环向6台应用服务器分发web流量。这6台服务器中的每台都使用一个总线。发送到位于群集上的远程计算机上的1个队列

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

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

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

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


以前有人遇到过这个问题吗?

我们遇到过,这是因为这里描述的问题:

简短版本:安装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。

如果您的机器是从同一映像创建的,则可能具有非唯一的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'

您正在运行什么版本的MSMQ?您是否也尝试过相同的设置,但没有事务性队列?msmq 5.0 windows 2008 r2。nsb未配置为事务性的。事实确实如此。正如你所说的,池中的机器是从同一个图像生成的,因此出现了问题。又一个MSMQ抓到你了!非常感谢。