如何增加可以存储在MSMQ中的消息数量

时间:2011-11-09 19:49:29

标签: msmq msmq-wcf

我们的系统中有许多MSMQ队列,包括私人队列和公共队列。有时,从队列中读取的Windows服务将崩溃,因此消息将在该队列中累积。一旦队列达到一定的大小(可能是60K消息),该服务器上的所有队列都将停止工作,从而引发资源不足的错误。

我的问题是,队列如何真正在幕后工作,他们将消息存储在RAM或硬盘上吗?当服务器耗尽RAM时,它是否会耗尽资源并崩溃?如果它在硬盘上使用了一些分配的空间,有没有办法增加允许的大小?如果它使用RAM,我可以简单地将RAM添加到服务器,然后这会增加允许的大小吗?

我需要确保当服务停止时,我们可以处理在该队列中存储100K或200K消息,同时我们正在修复服务,因为这些消息对我们的业务至关重要。

2 个答案:

答案 0 :(得分:2)

这篇关于MSDN的文章似乎解决了你的问题(正如John在下面指出的那样,这只适用于Windows Server 2000,因此大多数人可能会忽略它):Resource management in MSMQ applications。具体做法是:

  

对于MSMQ 1.0和MSMQ 2.0,能够存储在一台计算机上的消息的总大小不限于计算机中的RAM量或硬盘大小,而是限制为提供的虚拟地址空间量操作系统向MSMQ服务(此限制已在MSMQ 3.0中解除)。 x86机器中的每个进程都分配了一个虚拟的4 GB可寻址内存。 2GB保留用于内核模式,2GB保留用于用户模式。 MSMQ队列管理器在用户模式下运行,因此具有可寻址的2GB虚拟地址空间。每条消息的数据都存储在RAM中,RAM由系统的页面文件或内存映射文件备份。 MSMQ使用内存映射文件来存储快速和可恢复的消息。由于我们仅限于2GB的可寻址内存,因此我们限制在磁盘上使用2GB的消息。当你考虑到MSMQ代码所使用的内存及其内部数据结构,以及在磁盘上存储消息文件的文件分配时,我们最终会得到1.4GB到1.6GB之间可以存储在磁盘上的消息。 / p>      

注意通过在MSMQ服务上启用3GB调整,可以将1.6GB的限制提升到大约2.6GB。有关如何启用3GB调整的详细信息,请参阅Q171793

编辑:调整链接似乎被打破了。我认为它应该指向here

就更高版本的MSMQ而言,John在a blog post中讨论了该问题。

  

最多邮件数

     

这个不是那么简单。从我的Insufficient Resources帖子中我们知道每个消息需要75个字节的内核内存用于索引,因此,例如,200万个消息需要大约150兆字节。因此,似乎您需要做的就是添加更多RAM。然而,在查看32位和64位内存架构的比较之后,您将很快转移到64位平台以利用您的投资,因为32位计算机最大可达450 MB的页面缓冲池内存无论安装的RAM数量多少。

     

但是,再次,如果您正在尝试计算出能够容纳10亿MSMQ消息所需的页面缓冲池内存量,那么您的设计规范将进行一些认真的审核。

答案 1 :(得分:0)

不确定深入的答案,但无论如何在表面级别,非事务性队列将消息存储在内存中,而事务性队列将消息存储在磁盘上。

<强>更新

正如John所述,无论是使用持久队列还是非持久队列,所有消息都保存在磁盘上。