【问题标题】:Queue implementation for WCF ServiceWCF 服务的队列实现
【发布时间】:2011-08-04 11:46:41
【问题描述】:

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

我的服务需要从队列中取出消息以使用多线程进行处理。但是,如果我的服务将停止或失败,或者服务器立即关闭 - 此服务必须重新处理消息,这没有继续处理。

所以,我考虑 msmq 队列实现。 msmq 让我做好队列,但是这个需求怎么实现:reprocess message,那个没处理到最后?

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

【问题讨论】:

  • 如果服务停止,消息应该保留在队列中,等它再次启动时再处理,这不是发生了吗?如果是这样,您如何托管读取 MSMQ 的 WCF 进程?
  • 但是服务是否可以从队列中获取消息并开始处理。同时另一个处理线程从队列中获取另一个消息进行处理并启动进程。然后我们杀死服务进程,重启后发现队列中有2个项目没有处理?
  • 每个线程都应该参与事务,因此两条消息都应该存在。另一种方法是创建指向同一队列的多个进程,而不是创建多个线程。这是“竞争消费者”模式,可以使用 MSMQ 4。

标签: wcf queue msmq


【解决方案1】:

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

我认为您不需要担心服务代码的多线程。如果您想要高吞吐量,请使用集群 MSMQ 服务器和负载平衡的 WCF 服务,这比尝试滚动您自己的基于 MSMQ 的多线程代码更可靠。

【讨论】:

    【解决方案2】:

    所以,最后我在 MSMQ 中选择事务并将事务对象传递给线程,以便线程安全地使用 MSMQ。速度挺快的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-17
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 2014-11-09
      • 2012-07-16
      • 1970-01-01
      相关资源
      最近更新 更多