【问题标题】:Is it ok to never delete from a MSMQ?永远不要从 MSMQ 中删除可以吗?
【发布时间】:2009-06-04 18:56:47
【问题描述】:

我继承了一个从 MSMQ 中提取消息的应用程序,它对它们进行一些处理,然后根据消息中的内容将一些数据添加到数据库中。消息被我无法控制的第三方应用程序推送到队列中。

虽然我对如何使用 API 有基本的了解,但我对 MSMQ 了解不多。

无论如何,我注意到这些消息永远不会被删除,我们的客户端肯定不会明确删除它们,我可以查看计算机管理并查看消息返回到上次重新启动服务器时的消息。

这是错的吗?当队列达到某个最大大小时,消息是否会开始自动删除,或者它们会永远堆积在那里,慢慢地占用更多内存?

【问题讨论】:

    标签: c# msmq


    【解决方案1】:

    处理完消息后,通常会将其从队列中删除(以事务方式或其他方式)。

    【讨论】:

    • 这适用于任何消息传递系统(例如 WebSphere*MQ),而不仅仅是 MSMQ。
    • 这就是为什么我说'队列'而不是'MSMQ队列;)
    【解决方案2】:

    我怀疑虽然这不是最佳做法,但队列会在重新启动时被清除,只要有足够的可用资源,您就永远不会真正遇到问题。

    也就是说,我会选择设置一些东西来定期清理队列,这样你就不会压倒服务器。我对 MSMQ 不太熟悉,但是有什么方法可以判断消息是否已被处理?即使它是运行的附加服务,也会检查队列中的消息并查看它们是否已出现在数据库中,如果出现则将其删除?这样,您就无需修改继承的代码库,因为它可以按原样正常工作。

    一旦您决定解决方案,请在此处发布更新 - 我很想知道您最终是如何处理此问题的。谢谢!

    【讨论】:

    • 我们已决定按照您的建议使用附加服务来清除旧邮件。此脚本将每天运行一次,并从队列中删除超过一周的任何内容。它可能会在未来被逐步淘汰,我们会让应用程序自己做家务,但目前这是最简单、最快捷的解决方案。
    【解决方案3】:

    “无论如何,我注意到消息永远不会被删除,我们的客户端肯定不会明确删除它们,我可以查看计算机管理并查看消息返回到上次重新启动服务器时的消息。” em>

    如果在上次重新启动之前没有消息,那么这些消息听起来像是 Express。 Express 消息仅存储在 RAM 中,不会持久保存到磁盘,因此重新启动 MSMQ 服务将破坏它们。这可能就是为什么消息量从未达到临界水平的原因。

    由于 MSMQ 使用内核内存和磁盘空间进行内存存储,最终两者之一会失效并导致您的服务器稳定性问题,因此您的清理过程计划是一个不错的计划。

    干杯, 约翰·布雷克韦尔 (MSFT)

    【讨论】:

      猜你喜欢
      • 2011-01-30
      • 2021-12-08
      • 1970-01-01
      • 2014-10-22
      • 2022-10-06
      • 2016-01-16
      • 2014-12-14
      • 2013-01-02
      • 1970-01-01
      相关资源
      最近更新 更多