在WCF中批处理邮件?

时间:2009-02-12 21:38:34

标签: wcf

这是我的方案......我将收到来自外部来源的个人消息流。这些数据的性质以及我必须对它们进行的处理使得我可以在一个批处理中包含的消息越多,我可以平均处理的消息就越多。举个例子:

  1. 消息1进入,WCF服务开始处理消息
  2. 消息2和3在步骤1完成处理之前进入。过程2和3一起。
  3. 这里有一些假设,我们无法在第1步完成之前开始处理第2步,但我们可以在一次运行中处理多条消息。

    我最初的想法是简单地使用msmq绑定,以便在处理一个批处理时消息可以排队。但后来我意识到WCF将一次只传递一条消息。而且我甚至不确定它是否会等到一个消息完成处理之后才拉动下一个消息然后处理那个消息(可能在一个线程中?),这在这种情况下会很糟糕。

    所以,我只是想知道是否有人可以提供有关如何使用WCF完成此类系统的指导。谢谢!

1 个答案:

答案 0 :(得分:3)

最大化吞吐量

解决方案可能根本就不考虑WCF。您可能需要一个运行在ServiceHost的单独线程上的状态机。该状态机将托管,例如,换行,队列或类似类型的类。将向状态机提供将用于处理消息的委托。当您的WCF ServiceHost收到消息时,它会将消息推送到封装在状态机中的队列中,这就是它所关心的全部内容。

当状态机以您指定的间隔迭代时,它将以您想要的任何数量从队列中弹出消息。理想情况下,您应该将其设计为在服务的配置设置中进行限制。这将允许您体验哪种批处理大小最有效,类似于将行更新批处理到数据库表以获得性能的方式。

批处理消息

当然,您可以将消息传递信封(基本上,作为参数传递给OperationContract方法的类型)设计为基本上是1到N个消息的容器。这肯定会通过最小化消息的数量来优化字节的传递。但是,无论一条消息到达还是N条消息同时到达都不会改变正确处理这些消息所需的逻辑,除了添加某种循环来迭代N条消息。您愿意考虑MSMQ这一事实表明您的消息传递范例已经异步,因此它应该与我所描述的最大化吞吐量的方法一起使用。