我们的系统中有许多MSMQ队列,包括私人队列和公共队列。有时,从队列中读取的Windows服务将崩溃,因此消息将在该队列中累积。一旦队列达到一定的大小(可能是60K消息),该服务器上的所有队列都将停止工作,从而引发资源不足的错误。
我的问题是,队列如何真正在幕后工作,他们将消息存储在RAM或硬盘上吗?当服务器耗尽RAM时,它是否会耗尽资源并崩溃?如果它在硬盘上使用了一些分配的空间,有没有办法增加允许的大小?如果它使用RAM,我可以简单地将RAM添加到服务器,然后这会增加允许的大小吗?
我需要确保当服务停止时,我们可以处理在该队列中存储100K或200K消息,同时我们正在修复服务,因为这些消息对我们的业务至关重要。
答案 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所述,无论是使用持久队列还是非持久队列,所有消息都保存在磁盘上。