我刚从一家拥有本土云解决方案的公司开始。他们围绕 SQL Server 构建了他们的中央队列机制。在与技术总监交谈时,他告诉我他们过去曾尝试过 MSMQ,但遇到了大容量队列损坏的问题。我一直在互联网上进行搜索,但找不到有关此问题的任何信息。
有没有人听说过这样的事情?有没有这方面的好文章?
此外,他们没有为此目的使用 WCF。WCF 的事务性质会解决这些腐败问题吗?
我刚从一家拥有本土云解决方案的公司开始。他们围绕 SQL Server 构建了他们的中央队列机制。在与技术总监交谈时,他告诉我他们过去曾尝试过 MSMQ,但遇到了大容量队列损坏的问题。我一直在互联网上进行搜索,但找不到有关此问题的任何信息。
有没有人听说过这样的事情?有没有这方面的好文章?
此外,他们没有为此目的使用 WCF。WCF 的事务性质会解决这些腐败问题吗?
不,MSMQ 不会损坏。
Hugh 所指的是存储文件到虚拟内存的内存映射及其碎片化。
MSMQ 以 4MB 块工作,与消息大小无关。发送 5kb 消息 - 获得 4MB 块。发送另一个 5kb 消息 - 使用相同的块。最终块填满,MSMQ 开始一个新的。当一个块中的所有消息都被读取和消费(而不是仅仅被偷看)时,该文件被删除。MSMQ 会在删除前等待几个小时,以防有新消息到达并需要一个主页——当有一个空的文件时,创建一个新文件是没有意义的。
如果消息的大小相同,则块在到达和离开时很容易填充和清空。
如果消息是可变大小的,并且没有被 FIFO 读取,那么漏洞就会开始出现。例如,一条 5kb 的消息被读取,一条 4kb 的消息到达,留下 1kb 的不可用空间。随着时间的推移,分配的内存量将由于累积的死空间而偏离实际的消息量。
这都是正常的。MSMQ 没有碎片整理。
笔记
我也有过类似的经历,尽管我不会使用“损坏”这个词。“碎片化”更好。我的经验仅限于使用事务队列,所以我不确定您是否可以通过使用非事务队列来避免这个问题。
当承受重负载时,msmq 服务可能会表现出内存泄漏行为,它根本不会释放内存。因此,您最终可能会以越来越高的工作内存占用量运行 msmq,这将影响性能。
我不太了解根本原因,但它与MSMQ在磁盘上存储消息的方式有关,并且这些存储文件变得碎片化。
仅仅因为我经历过这并不一定意味着您也会如此,这可能与我们设置 msmq 的方式有关。
请注意,这与磁盘碎片不同。
关于 WCF,我假设您指的是 WCF 的 msmq 绑定。我已经使用了 msmq 可用的两种绑定,并且不相信这会改变这种行为,因为它与底层 msmq 子系统有关。