1

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

最好的设计方法是什么?

4

2 回答 2

2

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

其次,您需要使用事务和日志来确保可靠性。这既是编程问题又是基础架构问题,因此您可以从查看本文开始,然后了解如何正确针对 MSMQ 进行编程的一般指南。例如,如果您从未使用过 MSMQ,这是一个很好的起点,尽管它相当基础。如果您打算使用 MSMQ 作为 WCF 的绑定/传输,那么您几乎已经涵盖了管道部分;这只是配置您的服务以处理您认为您将看到的数量和流量的问题。

于 2012-08-08T17:28:33.117 回答
0

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

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

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

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

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

并想要一个高效(良好的性能)

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

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

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

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

于 2012-08-27T10:53:07.747 回答