我们在我们的Web应用程序中使用NServiceBus,并且最近发现有时会有一些消息只是位于出站队列中,尽管处于连接状态但是永远不会离开。删除它们的最快解决方案是重新启动MSMQ服务。我遇到的一个问题是,当重新启动或停止MSMQ服务时,CPU会跳转到100%。
有没有人遇到这个并找到一种方法来防止这种高负荷。我不喜欢因停止服务而导致中断的想法?我知道的一种方法是使用仅发送模式,但这并不理想。
更新: global.asax应用程序中使用的配置代码:
IBus bus = Configure
.With()
.DefaultBuilder()
.FileShareDataBus("c:\\storage")
.XmlSerializer()
.MsmqTransport()
.IsTransactional(false)
.PurgeOnStartup(false)
.UnicastBus()
.ImpersonateSender(false)
.CreateBus()
.Start(() => Configure.Instance.ForInstallationOn<Windows>().Install());
答案 0 :(得分:0)
我认为您的问题可能与GitHub上的问题Incorrect MSMQ perms cause high CPU in web application有关,该问题已经关闭,但针对尚未发布的4.0版本。
问题是NServiceBus正在尝试从队列中读取,但是没有队列!因此它进入了一个紧密的Check-Error-Retry循环,它固定了处理器。
对于需要它的Web服务器来说,取消MSMQ是一件相当生气的事情。如果您需要在生产中执行此操作,我建议将服务器从负载平衡池中取出(我假设/希望您使用的是负载均衡器),然后重新启动MSMQ,然后重启IIS。如果服务器没有处理请求,那么短时间的高CPU活动应该不是什么大问题。
当4.0出来时,它应该处理CPU问题,但我仍然建议让服务器退出轮换,因为否则Bus.Send()
将在MSMQ不可用时抛出。