0

我们在我们的 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());
4

1 回答 1

0

我认为您的问题可能与问题不正确的 MSMQ 权限导致GitHub 上的 Web 应用程序中的 CPU 高,该应用程序已关闭,但针对尚未发布的 4.0 版本。

问题是 NServiceBus 正在尝试从队列中读取,但没有队列!因此,它进入了与处理器挂钩的 Check-Error-Retry 的紧密循环。

对于需要它的 Web 服务器来说,关闭 MSMQ 是一件相当愤怒的事情。如果您需要在生产中执行此操作,我建议将服务器从负载平衡池中取出(我假设/希望您正在使用负载平衡器),然后重新启动 MSMQ,然后重新启动 IIS。如果服务器不处理请求,那么短时间的高 CPU 活动应该没什么大不了的。

当 4.0 出来时,它应该解决 CPU 问题,但我仍然建议让服务器停止旋转,否则Bus.Send()会在 MSMQ 不可用时抛出。

于 2013-01-24T18:13:05.570 回答