首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将消息发送到负载平衡环境中的msmq群集队列时,NServicebus失败

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

Stack Overflow用户
提问于 2012-11-16 01:43:43
回答 2查看 1.1K关注 0票数 4

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

我们的环境如下:1 F5通过循环调度将web流量分发到6个应用程序服务器。这6台服务器中的每一台都使用驻留在集群上的远程机器上的Bus.Send to 1队列。

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

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

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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。

票数 10
EN

Stack Overflow用户

发布于 2017-10-13 12:48:52

如果您的计算机是从同一映像创建的,则您的MachineCache If可能不是唯一的。您可以通过在每台计算机上运行以下powershell脚本来修复此问题。

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

代码语言:javascript
复制
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'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13403192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档