【发布时间】:2011-04-21 22:20:19
【问题描述】:
我们已经为一组 NServiceBus 服务集群了 MSMQ,并且一切都运行良好,直到它没有。一台服务器上的传出队列开始填满,很快整个系统就会挂起。
更多细节:
我们在服务器 N1 和 N2 之间有一个集群 MSMQ。其他集群资源只是作为本地直接在集群队列上运行的服务,即 NServiceBus 分发器。
所有工作进程都位于不同的服务器上,Services3 和 Services4。
对于那些不熟悉 NServiceBus 的人,工作会进入由分发服务器管理的集群工作队列。 Service3 和 Services4 上的工作应用程序将“我准备好工作”消息发送到由同一分发器管理的集群控制队列,分发器通过向工作进程的输入队列发送一个工作单元来响应。
在某些时候,此过程可能会完全挂起。这是系统挂起时集群 MSMQ 实例上的传出队列的图片:
如果我将集群故障转移到另一个节点,就好像整个系统都陷入了困境。这是故障转移后不久的同一群集 MSMQ 实例的图片:
谁能解释这种行为,我可以做些什么来避免它,以保持系统平稳运行?
【问题讨论】:
-
从节点最终会挂掉吗?工人们的表现如何?他们是否在积极处理消息?
-
这种情况并不经常发生,我可以权威地说它只发生在一个节点或两个节点上。工作人员正在表现 - 当他们的本地输入队列中有消息要处理时,他们正在积极处理消息。
-
很奇怪。它多久发生一次?每个节点有多少个网卡?我想知道 MSMQ 是否对使用哪张卡感到困惑,因此偶尔不会完成回复。应该有一个注册表设置来锁定它。
-
每周可能发生 2-3 次。所有涉及的服务器(集群节点和工作节点)都在 VSphere 上进行了虚拟化。每个集群节点都位于不同主机上的 VSphere 来宾上。在他们的虚拟配置中,每台服务器只有一个 NIC 卡。当然,使用集群服务时,会有多个 IP 地址跳来跳去。
-
你有没有想过这个问题?就好像有什么东西正在把节点从分发器那里拿走。
标签: msmq message-queue nservicebus cluster-computing msdtc