2011-04-13 92 views
2

我需要关于我的WCF服务队列设计的建议。 所以,我有一个wcf服务和很多客户端。客户端生成消息并将它们放入队列以供我的服务进行处理。 服务处理它们的异步和客户端不需要将消息放入队列的回调或响应。WCF服务的队列实现

我的服务需要使队列中的消息出队以供多线程处理。但是,如果我的服务会停止或失败,或者服务器立即关闭 - 此服务必须重新处理消息,但这不会影响处理。

所以,我认为msmq队列的实现。 Msmq让我做出好的队列,但是如何实现这个需求:重新处理消息,那个消息没有被处理到最后?

可能有人会给我另一个下注的建议。 感谢您的帮助。

+0

如果服务停止,消息应该保留在队列中并在再次启动时进行处理,这是不是发生了?如果是这样,您如何托管读取MSMQ的WCF进程? – 2011-04-13 12:16:48

+0

但是服务是否可以从队列中取消消息并开始处理?同时,另一个处理线程从队列中取出另一个消息用于处理和启动进程。然后我们终止服务进程,重启后可以发现队列中的2个项目没有处理? – cyssima 2011-04-13 13:43:37

+0

每个线程应该参与一个事务,所以这两个消息应该在那里。另一种方法是创建指向同一队列的多个进程,而不是拥有多个线程。这是“竞争消费者”模式,可以使用MSMQ 4。 – 2011-04-13 17:30:06

回答

0

因此,最后我选择MSMQ中的事务,并将事务对象传递给线程,以便与MSMQ一起工作。这是相当快的。

0

这里的关键是托管服务的机器在哪个服务器操作系统上运行。如果您在技术上使用Server 2008(或Vista),则可以利用MSMQ 4自动中毒消息处理。这会自动将消息从队列中移除到特殊的毒性队列,以便服务可以继续处理消息。在MSMQ 3中,您必须在您的代码中执行此操作。 This article on MSDN应该给一个好的开始和this article shows the poison消息处理代码。

我看不出您需要担心多线程服务代码。如果您希望获得高吞吐量,那么请使用集群式MSMQ服务器和负载均衡的WCF服务,其方式比试图推出基于MSMQ的多线程代码更可靠。