设计高容量MSMQ

时间:2012-08-08 17:14:14

标签: msmq netmsmqbinding msmq-wcf

我们有很多通信服务器发送数据包。我们希望将来自这些服务器程序的这些数据包存储在MSMQ中,直到更新程序将处理它们。数据丢失一直是一个问题,我们希望不会丢失来自这些服务器程序的任何数据包,并希望获得高效且高性能的解决方案。

什么是最好的设计方法?

2 个答案:

答案 0 :(得分:2)

嗯,开始时你需要做两件基本的事情。首先,您需要修改默认安装,以将存储位置移动到镜像的驱动器和/或与操作系统在该服务器上引导的驱动器不同。此外,您还需要确保在排队时有足够的空间来保留消息,具体取决于您正在考虑的音量。 This文章涵盖了这一点。

其次,您需要使用事务和日记来确保可靠性。这既是编程问题,也是基础架构问题,因此您可以先查看this文章,然后再详细了解如何正确编写MSMQ编程。例如This是一个很好的起点,如果你从未使用过MSMQ,尽管它是相当基础的。如果您打算使用MSMQ作为WCF的绑定/传输,那么您可以使用管道部件;这只是配置您的服务来处理您认为将会看到的音量和流量的问题。

答案 1 :(得分:0)

  

我们有很多通信服务器发送数据包。

当存储'数据包'时,我建议将[Serializable] .NET对象写入WCF,主要是因为WCF可以透明地向MSMQ读/写它们。这将更容易使用,但如果您的数据包是TCP / IP或二进制数据包,则需要打开“Ordering”,以确保它们按照放置的确切顺序进入队列。

MSMQ也有会话,因此如果您想将项目组合在一起,这是可能的。 WCF不提供此保证。您需要为此编写自定义代码,但这只是为特定会话中的每条消息分配唯一ID的情况。

  

数据丢失一直是一个问题,我们希望不会丢失来自这些服务器程序的任何数据包

MSMQ可以将数据持久保存到磁盘,因此如果服务器出现故障,则会保留其队列。 MSMQ可以将队列保存在内存中,这样更有效,但崩溃/重启不会保留队列信息。

  

并希望有效(良好的表现)

MSMQ相当高效。磁盘持久性的开销很小,但仅限于磁盘写入。如果性能包括多线程,则MSMQ不提供此功能,因为队列是顺序的,因此必须按顺序处理。但这是典型的队列技术。

MSMQ的最大邮件大小也是4MB,因此请记住要通过网络发送的内容。

唯一的另一件事是MSMQ不具有大规模可扩展性。其主要目标是保证交付。如果您发布百万数据包,它们将到达目的地,但MSMQ确实具有将消息推送到其他计算机的有限能力。它运行类似ThreadPool的系统,因此如果这也是一个要求,它将无法扩展。

我还在#msmq-wcf wiki中添加了信息,其中包含编写数据的基本示例。