3

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

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

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

4

2 回答 2

2

这是 MSDN 上的一篇文章,似乎解决了您的问题(正如 John 在下面指出的,这仅适用于 Windows Server 2000,因此大多数人可能应该忽略):MSMQ 应用程序中的资源管理。具体来说:

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

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

编辑:调整链接似乎已损坏。我相信它应该指向这里

关于更高版本的 MSMQ,John 在一篇博文中讨论了这个问题。

最大消息数

这个不是那么容易解决的。从我的资源不足的帖子中,我们知道每条消息需要 75 字节的内核内存来索引,因此,例如,200 万条消息需要大约 150 兆字节。因此,您需要做的似乎就是添加更多 RAM。但是,在查看了 32 位和 64 位内存架构的比较之后,您将很快不得不迁移到 64 位平台以充分利用您的投资,因为 32 位机器最多可以使用 450 MB 的分页池内存无论安装多少 RAM。

但是,同样,如果您试图计算出多少 RAM 将生成容纳十亿 MSMQ 消息所需的分页池内存,那么您的设计规范需要进行一些认真的审查。

于 2011-11-09T20:26:12.437 回答
0

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

更新

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

于 2011-11-09T20:18:27.293 回答