我们为一组NServiceBus服务建立了MSMQ集群,并且一切运行良好,直到没有运行为止。一台服务器上的传出队列开始填满,很快整个系统挂起。
更多细节:
我们在服务器N1和N2之间有一个群集MSMQ。其他群集资源仅是作为本地服务(即NServiceBus分发服务器)直接在群集队列上运行的服务。
所有工作进程都位于单独的服务器Services3和Services4上。
对于不熟悉NServiceBus的人员,工作会进入由分发服务器管理的群集工作队列。 Service3和Services4上的辅助应用程序将“我准备工作”消息发送到由同一分发服务器管理的群集控制队列,并且分发服务器通过将工作单元发送到辅助进程的输入队列进行响应。
在某个时候,此过程可能会完全停止。这是系统挂起时群集MSMQ实例上的传出队列的图片:
如果我将群集故障转移到另一个节点,就好像整个系统陷入困境。这是故障转移后不久的同一群集MSMQ实例的图片:
谁能解释这种行为,以及如何避免这种现象以保持系统平稳运行?
最佳答案
也许您的服务器已克隆,因此共享相同的队列管理器ID(QMId)。
MSMQ使用QMId作为哈希来缓存远程计算机的地址。如果您的网络中有多台计算机具有相同的QMId,则可能会导致消息阻塞或丢失。
在此博客文章中查看说明和解决方案:http://blogs.msdn.com/b/johnbreakwell/archive/2007/02/06/msmq-prefers-to-be-unique.aspx
关于msmq - 绑定(bind)到群集MSMQ实例的MSMQ消息卡在传出队列中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3874512/