【问题标题】:MSMQ storage filled upMSMQ 存储已满
【发布时间】:2013-10-05 19:47:42
【问题描述】:

我在 Windows 7 下使用 NServiceBus 3.3.8 和 MSMQ。目前,可恢复和快速消息的发送和接收工作正常。但是,我注意到消息被阅读器消费后,MSMQ 存储区并没有被清理干净。这导致我在达到允许的最大队列大小时手动清理 MSMQ 存储。

我尝试减少注册表中的 MessageCleanupInterval 并重新启动 MSMQ 服务,但我仍然没有看到消息被删除。检查存储文件夹中的 pxxxxxx.mq 文件时,其中包含我发送的可恢复和快速消息。

有人知道此消息累积的原因吗?有没有办法通过 MSMQ/NServiceBus 中的一些配置来防止它?

【问题讨论】:

标签: msmq nservicebus


【解决方案1】:

6 小时后删除空存储文件。这是出于性能原因 - MSMQ 重用现有文件然后创建新文件会更快。

如果您打开 P*.MQ 文件,您确实会看到来自先前消息的数据。这与分析硬盘的任何随机扇区完全相同。如果消息已被处理,则存储区域被标记为空闲(在相应的 L*.MQ 文件中),因此它可以被未来的消息覆盖。阅读每条消息后清除存储空间没有任何好处。

如果存储文件只包含一条消息,它们就会挂起。没有碎片整理来压缩存储文件的使用。如果文件在清理间隔或重新启动后没有被清除,则它不是空的。检查 MSMQ 性能计数器以查看整个系统(而不是您感兴趣的队列)是否有任何消息。

"但是,我注意到之后MSMQ存储区没有清理 消息被读者消费。这导致我 达到允许的最大值时手动清理 MSMQ 存储 队列大小。”

这是不正确的。如果您删除存储文件并且不再达到配额,则您必须删除真实邮件以释放空间。空存储文件对您的邮件配额的影响为零。

【讨论】:

  • 谢谢约翰。问题是旧邮件在处理后(6 小时后)没有被清除。这导致 System.Messaging.MessageQueueException: Insufficient resources to perform operation 错误,因为几天后存储区域已满。
  • 您如何处理消息?他们是从队列中收到的还是只是偷看的?如果您收到一条消息,它将从队列中删除并且不再计入任何配额。你说的6个小时是清理空存储文件的时间。如果它们没有被清理干净,那么它们就不是空的。
  • 我收到消息(通过 NServiceBus 处理程序)并看到这些消息在处理后从队列中删除。即使所有队列在处理完消息后都变空了,MQ 文件也永远存在于存储区域中。没有一个 MQ 文件是空的。
  • 正如我在回答中提到的,MQ 文件永远不会是空的数据,因为处理的消息使用的空间只是被标记为可以重用。但是,这些文件可能没有消息。查看 MQ 文件以解决此类问题没有任何价值。除了 NSB 使用的队列之外,还有许多队列可以驻留消息。在性能监视器中检查“MSMQ 服务对象 - 所有队列中的消息总数”以确保您的系统真的是空的。
  • 这些过期消息在哪个队列中? DLQ?
猜你喜欢
  • 2010-09-20
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多