【问题标题】:MSMQ using questionsMSMQ 使用问题
【发布时间】:2013-03-14 13:25:08
【问题描述】:

您能否解释一下,使用可恢复消息时将使用多少 RAM 内存? 我知道,一条消息消耗大约 70–80 个字节,这没关系,我知道消息正文将保存到磁盘,但它是否也可以将正文复制到 RAM? 我尝试使用快速且可恢复的消息(消息存储限制为 1gb)对其进行测试——在这两种情况下,我都在进程资源管理器中看到,msmq 服务进程达到了他的工作集(内存)为 1gb。我知道,如果是快递信息,没关系,但对于可恢复的信息,它应该少得多!

第二个问题是关于 MSMQ 回调限制。

如果您收到带有回调的消息,请考虑每个进程可以 最多只能注册 63 个回调。如果您的回调在队列中等待 无限期没有活动,您可能会达到此限制。

它适用于所有队列还是仅适用于一个?例如,我有我的过程,我做了类似的事情:

QueueFirst = new MessageQueue(@".\test") { Formatter = new BinaryMessageFormatter() };
QueueFirst.ReceiveCompleted += QueueOnReceiveCompleted;
QueueSecond = new MessageQueue(@".\test") { Formatter = new BinaryMessageFormatter() };
QueueSecond.ReceiveCompleted += QueueOnReceiveCompleted;
for (int i = 0; i < 63; i++)
{
    QueueFirst.BeginReceive(TimeSpan.FromSeconds(10), "", Callback);
    QueueSecond.BeginReceive(TimeSpan.FromSeconds(10), "", Callback);
}

我可以这样做吗?我在问,因为如果我将循环上限设置为超过 63 的值,则不会发生任何不好的事情。我正在使用这个method overload,因为在帮助中有一些关于回调的东西,是否意味着使用事件处理程序没有任何限制?

【问题讨论】:

标签: .net msmq message-queue


【解决方案1】:

MSMQ 将消息存储在内存中以提高性能。
所有类型的消息也会写入磁盘 - 快速/可恢复/事务性。
消息的大小对于确定 RAM 使用情况并不重要。
This blog 应该拥有了解消息如何使用内存所需的一切。
This blog 也很有用。

【讨论】:

  • 谢谢,约翰,我反复阅读了你的博客文章(尤其是这篇文章),但我仍然有疑问——如果我有很多 msmq 消息(它们当然会处理,但无论如何推送比弹出),消息可以吃掉我所有的内存吗?限制 RAM 使用并设置较大的磁盘限制会很酷。还有关于线程的问题——它是只涉及队列的 63 个异步处理程序,还是所有本地队列的 63 个异步处理程序?因为讲的是回调,可能只发生在带有 AsyncCallback 的构造函数中,而不是 ReceiveCompleted 事件?
  • MSMQ(Windows 2000 之后)将只使用它认为可以安全使用的消息体内存。如果可用内存不足,则消息将留在磁盘上以供按需读取。基本上 MSMQ 是自我限制的(或者更准确地说,受操作系统限制)。
  • 这篇文章 (support.microsoft.com/default.aspx?scid=kb;EN-US;901279) 指出每个系统有 63 个异步处理程序,而不是每个队列。
  • 这很好,MSMQ 如此聪明,但是当我在本地机器上测试它时,MSMQ 占用了大约 5gb 的 RAM 内存(共 8 个)并留下了大约 300mb 的空闲空间。当我启动超过 63 个的处理程序时(参见帖子中的示例),没有错误。我做错了什么让我很困惑:-)
  • 内存是用来吃的。如果您仍然有可用的物理 RAM,那么您就没有问题。关于处理程序,第 64 次调用应该返回一个 INSUFFICENT_RESOURCES 错误。如果你不这样做,那么你捕获异常的方式可能会出现问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 2010-10-16
相关资源
最近更新 更多