我需要限制在流式反汇编接收管道中调度大型消息时生成的业务流程实例的数量。假设我有一个大的xml,包含10万个单独的" Order"信息。接收管道然后将它解封并创建100 000" ProcessOrder"业务流程。这太多了,我需要限制它。
我有接收管道,对我的消息进行debatching和功能修改。它以流方式执行应有的操作,并将单个消息放入VirtualStream中;
我有一个编排和辅助方法,可以限制“ProcessOrder”业务流程实例的数量。
我知道我可以在业务流程中运行一个接收管道(这将解决我的问题,因为在每个" getnext"调用管道,如果有太多的运行编排,我可以坚持下去实例)但,挖掘biztalk dll,我注意到使用Microsoft.XLANGs.Pipeline.XLANGPipelineManager仍然加载内存中的所有消息,而不是像Microsoft.BizTalk.PipelineOM.PipelineManager那样枚举它们。我知道他们正在将所有消息都放在VirtualStream中,但对于这么大的消息号,这仍然是不充分的,记忆性的。
我的下一步是直接在接收端口运行接收管道(因此它将使用Microsoft.BizTalk.PipelineOM.PipelineManager),而不必使用限制“ProcessOrder”实例数量的业务流程,而是满足要求,我需要在我的管道中添加一个延迟逻辑。这是一个可行的选择吗?如果没有,为什么?我还有其他选择吗?
答案 0 :(得分:1)
您应该从管道中删除所有消息一次,并将这些单独的消息存储在MSMQ中,甚至在业务流程处理之前。使用标准管道来解除消息,因为它们可以有效地处理大文件的debatching。 MSMQ可通过“打开Windows功能”免费获得。使用MSMQ非常简单,不需要任何开发。发送到MSMQ将是非常快的100K消息根本不是问题。
然后有一个接收位置从MSMQ读取。根据您的业务流程吞吐量,您可以通过使用BizTalk接收主机限制或通过在订单中接收来自MSMQ的消息或使用两者的组合来控制消息流。确保为接收MSMQ和发送MSMQ以及编排处理都有单独的主机实例。
这将通过所有配置完成,无需任何额外的代码简化您的设计。确保编排具有最少的持久点数。