【问题标题】:Biztalk - How to throttle a streaming disassemble pipelineBiztalk - 如何限制流式反汇编管道
【发布时间】:2025-11-26 23:50:02
【问题描述】:

我需要限制在流式反汇编接收管道中对大消息进行分批时产生的编排实例的数量。假设我有一个包含 100 000 个单独的“订单”消息的大型 xml。然后接收管道将对其进行分批并创建 100 000 个“ProcessOrder”编排。这太多了,我需要限制它。

要求

  1. 需要以流式方式进行分批,这样我一次只在内存中加载一条“订单”消息,然后再将其发送到消息框;
  2. 需要根据当前正在运行的“ProcessOrder”编排实例的数量来限制分批(例如,如果我已经有 100 个正在运行的实例,则分批将等到一个结束后再向消息框发送另一个“Order”消息) .

我在哪里

  1. 我有一个接收管道,可以对我的消息进行分批和功能修改。它以流式方式完成应有的工作,并将单个消息放入 VirtualStreams;

  2. 我有一个编排和辅助方法,可以限制“ProcessOrder”编排实例的数量。

问题

我知道我可以在编排中运行接收管道(这将解决我的问题,因为在对管道的每次“getnext”调用时,如果有太多正在运行的编排实例,我可以坚持下去)但是,挖掘 biztalk dll,我注意到使用 Microsoft.XLANGs.Pipeline.XLANGPipelineManager 仍然会加载内存中的所有消息,而不是像 Microsoft.BizTalk.PipelineOM.PipelineManager 那样枚举它们。我知道他们将每条消息都放在 VirtualStream 中,但是对于如此大的消息数量,这仍然不够,内存方面。

问题

我的下一步是直接在接收端口中运行接收管道(因此它将使用 Microsoft.BizTalk.PipelineOM.PipelineManager),而不需要限制“ProcessOrder”实例数量的编排,但要满足要求,我需要在我的管道中添加延迟逻辑。这是一个可行的选择吗?如果不是,为什么?我还有什么其他选择?

【问题讨论】:

    标签: streaming biztalk pipeline biztalk-orchestrations


    【解决方案1】:

    您应该将所有消息从管道中分批一次,并将这些单独的消息存储在 MSMQ 中,甚至在它们被编排处理之前。使用标准管道对消息进行分批,因为它们可以有效地处理大文件的分批。 MSMQ 可通过打开 Windows 功能免费获得。使用 MSMQ 非常简单,不需要任何开发。发送到 MSMQ 将非常快,100K 消息根本不是问题。

    然后有一个从 MSMQ 读取的接收位置。根据您的业务流程吞吐量,您可以通过使用 BizTalk 接收主机限制或通过按顺序从 MSMQ 接收消息或使用两者的组合来控制消息流。确保您有单独的主机实例用于接收 MSMQ 和发送 MSMQ 以及用于您的编排处理。

    这将通过所有配置完成,无需任何额外代码来简化您的设计。确保您的编排具有最少数量的持久点。

    【讨论】:

    • 你的回答是正确的,如果没有更多的建议,我会接受。不幸的是,就我而言,我不能使用 MSMQ(我工作的组织不允许)。
    • 或者,您可以将分批的消息存储在 SQL Server 中,但是根据您的存储需求量,您可能会遇到问题。或者,如果您的组织使用其他一些排队系统,例如 IBM MQ 等。但这些是您拥有的最佳选择。在 BizTalk 代码中操作它不会是未来的证明,并且可能会出现一些问题。