在WCF中批处理消息?

在WCF中批处理消息?,wcf,Wcf,这是我的场景。。。我将接收来自外部来源的单个消息流。这些数据的性质以及我必须对它们进行的处理是这样的:我可以在一批中包含的消息越多,我平均可以处理的消息就越多。举个例子: 消息1进入时,WCF服务开始处理该消息 消息2和3在步骤1完成处理之前出现。过程2和3一起进行 这里显然有一些假设,即我们不能在步骤1完成之前开始处理步骤2,但我们可以在一次运行中处理多条消息 我最初的想法是简单地使用msmq绑定,以便在一个批处理过程中消息可以排队。但后来我意识到WCF只会一次一条地传递每条消息。我甚至不确定

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

  • 消息1进入时,WCF服务开始处理该消息
  • 消息2和3在步骤1完成处理之前出现。过程2和3一起进行
  • 这里显然有一些假设,即我们不能在步骤1完成之前开始处理步骤2,但我们可以在一次运行中处理多条消息

    我最初的想法是简单地使用msmq绑定,以便在一个批处理过程中消息可以排队。但后来我意识到WCF只会一次一条地传递每条消息。我甚至不确定它是否会等到处理完一条消息后再提取下一条消息并处理该消息(可能在线程中?),在这种情况下,这是不好的

    所以,我只是想知道是否有人可以提供一些指导,指导如何使用WCF实现这样一个系统。谢谢

    最大化吞吐量 解决办法可能是根本不考虑WCF。您可能需要一个在ServiceHost的单独线程上运行的状态机。该状态机将承载(例如)wrap、队列或类似类型的类。状态机将提供一个用于处理消息的委托。当您的WCF ServiceHost接收到消息时,它会将消息推送到封装在状态机中的队列中,这就是它所关心的

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

    批处理消息
    当然,您可以将消息信封(基本上是作为参数传递给OperationContract方法的类型)设计为1到N条消息的容器。这肯定会通过最小化消息数量来优化字节的传递。但是,无论一条消息到达还是N条消息同时到达,都不会改变正确处理这些消息所需的逻辑,除非添加某种循环来迭代N条消息。您愿意考虑MSMQ的事实表明,您的消息传递范式已经是异步的,因此它应该与我描述的最大化吞吐量的方法很好地结合。使用WCF进行消息交换,并在单独的线程中使用处理器处理数据。WCF服务接收每条消息时,将消息放入服务和处理器共享的队列中。处理器从队列中运行。确保同步对队列的访问。