0

我需要限制在流式反汇编接收管道中对大消息进行分批时产生的编排实例的数量。假设我有一个包含 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”实例数量的编排,但为了满足要求,我会需要在我的管道中添加延迟逻辑。这是一个可行的选择吗?如果不是,为什么?我还有什么其他选择?

4

1 回答 1

1

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

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

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

于 2015-04-06T15:49:39.213 回答