Biztalk - 如何限制流式反汇编管道

Biztalk - How to throttle a streaming disassemble pipeline

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

要求

  1. 分批处理需要以流式方式完成,这样我一次只能在内存中加载一条 "Order" 消息,然后再将其发送到消息框;
  2. 需要根据当前 运行ning "ProcessOrder" 业务流程实例的数量来限制分批(假设我已经有 100 个 运行ning 实例,分批会等到一个结束向消息框发送另一个 "Order" 消息。

我在哪里

  1. 我有接收管道对我的消息进行分批处理和功能修改。它以流式传输方式执行应有的操作,并将单独的消息放入 VirtualStreams;

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

问题

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

问题

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

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

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

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