【问题标题】:Batching messages in WCF?在 WCF 中批处理消息?
【发布时间】:2009-02-13 08:52:34
【问题描述】:

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

  1. 消息 1 进来,WCF 服务开始处理消息
  2. 消息 2 和 3 在步骤 1 完成处理之前进入。一起处理 2 和 3。

这里显然有一些假设,我们不能在步骤 1 完成之前开始处理步骤 2,但我们可以在一次运行中处理多条消息。

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

所以,我只是想知道是否有人可以就如何使用 WCF 完成这样的系统提供一些指导。谢谢!

【问题讨论】:

    标签: wcf


    【解决方案1】:

    最大化吞吐量

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

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

    批处理消息

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

    【讨论】:

    • 没错。使用 WCF 进行消息交换,并在单独的线程中使用处理器来处理数据。当您的 WCF 服务接收每条消息时,将消息放入您的服务和处理器共享的队列中。您的处理器从队列中运行。请务必同步对队列的访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 2016-03-21
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多