gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:48:49 27 4
gpt4 key购买 nike

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

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

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

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

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

有趣的是,当我们执行这个清除操作时,一个不同的盒子将成为“好盒子”。所以我们很确定问题不是一个坏的盒子,而是一次只有 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 的缓存。我们的问题是我们的几个 worker 有相同的 QMId。这意味着集群将来自所有机器的所有消息的所有 ACKS 发送到发送消息的第一台机器。在某些时候,对于某些操作(例如 MSMQ Windows 服务重新启动),缓存过期并且另一台机器神奇地“工作”。

因此,请检查您的 6 个服务器并确保它们都没有相同的 QMid。我们的具有相同的值,因为它们都是从安装 MSMQ 后拍摄的 Windows 镜像中产生的幻影。

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

关于msmq - NServicebus 在负载平衡环境中向 msmq 集群队列发送消息时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13403192/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com