【问题标题】:WCF/MSMQ and transacted batching - get messages in batch all at once, not sequentiallyWCF/MSMQ 和事务处理批处理 - 一次批量获取消息,而不是按顺序获取
【发布时间】:2012-07-05 07:20:06
【问题描述】:

好的,所以我大约 90% 确定这是不可能的,但我想我还是会问的。也许我错过了什么。

我正在尝试使用WCF over MSMQ with transacted batching。长话短说,我有一个队列,一次可能包含 200-300k 条消息,我需要将它们放入数据库中。它们最终会通过 Service Broker,但只有在我在 MSMQ 客户端中进行了一些预处理之后。

我们的想法是一次获取尽可能多的消息(并由我的基础架构支持),对它们进行预处理,然后将它们以表变量的形式发送到 SQL Server,最终进入 Service Broker 队列。

通过事务批处理,每个事务确实给我 N(100、1000 等)消息,但它们都按顺序进入我的 WCF 客户端。所以服务操作被调用N次,每条消息调用一次。在操作返回最后一条消息后,框架将提交或回滚事务。

我的想法是,将它们全部放在一个集合中并立即开始处理整个集合并将其发送到数据库会更有效。

做一些技巧(比如将它们存储在静态的东西中,一旦我点击 N 开始处理)不是很好,我试图避免。

我没有要发布的代码,因为我还没有写。我以前做过事务性批处理,我倾向于认为这是不可能的。

最终,我将把我的 WCF 客户端和 Receive() 彻底丢在 MessageQueueTransaction 中,当然是包装在分布式事务中(下至 SQL Server)。

但是,您是否知道任何受支持的方式,通过这些方式我可以获得一个列表,而不是摆弄 WCF 创建的默认分布式事务,并且避免在静态集合中保存任何东西?

谢谢!

【问题讨论】:

    标签: .net wcf transactions msmq message-queue


    【解决方案1】:

    我也不认为这是可能的。如果您直接使用 MSMQ,您会发现只能一条一条地获取消息。

    话虽如此,WCF(超过 MSMQ)和 MSMQ 之间存在显着差异。第一个是基于推的,而后者是基于拉的。如果您可以切换到直接 MSMQ,则很容易从中提取N 消息并批量处理/保存。针对 MSMQ 进行编程比 WCF 容易得多。

    【讨论】:

    • 嗯,一个确认就够了。我将使用 MSMQ API,仅此而已。但我不完全同意你所说的,关于它不是基于流的。它不一定是。对于事务批处理模式,只有他们可以做一些事情来传递完整的集合,而不是一个一个地传递。或者至少让它成为一种选择。它在 4.5 中不存在,所以我希望看到像 5.0 这样的功能:)。
    • 你是对的 - WCF 也可以对流进行操作。稍微更正了我的答案。
    猜你喜欢
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 2016-03-21
    • 2023-03-18
    相关资源
    最近更新 更多