我开发了一个BizTalk应用程序,它接收包含大量消息的文件作为输入。我使用BizTalk XML反汇编程序组件在sepereate消息中'debatch'文件。这些消息中的每一个都是由编排从MessageBox中获取的,该编排可以转换消息并调用wcf服务。
我现在遇到的问题是每个批处理包含1000条消息,而这1000条消息似乎都是立即调用wcf服务。 wcf服务被这些消息“轰炸”,并被配置为并行处理10个消息(每个调用必须处理数据并将数据放入数据库中)并将一堆“Too Busy”异常返回给BizTalk。我配置了wcf适配器,在1分钟后再次重试连接。
最终结果是BizTalk首先对消息进行了报告,然后用所有1000条消息轰炸wcf服务,得到一堆“太忙”异常,然后等待什么都不做,直到1分钟过去,然后再次轰炸它等等。
如果我可以将BizTalk配置为打开与该特定wcf服务的最多10个连接,则处理效率会更高,但据我所知,这是不可能的。 (wcf服务配置为使用net.tcp。)
我确实已经以几种不同的方式尝试主机的限制设置,但要么它没有帮助,要么它使应用程序难以忍受。此外,BizTalk中的限制似乎是以第一次轰炸服务的方式实现,然后注意到它正在轰炸,然后等待一段时间无所事事,然后提起油门并再次开始轰炸。欺骗请求/消息似乎要好得多,以便它们在时间上更均匀地传播。我想配置WCF适配器以接收每秒最多4条消息。现在可能出现的限制类似于:在5秒的滑动窗口上,如果有超过20条消息,我希望激活限制。但这不一样,因为它允许“爆发”效应。
我如何提高吞吐量?
答案 0 :(得分:3)
使用BizTalk singleton pattern。这很难看。但BizTalk优雅的架构在遇到现实世界时会产生丑陋。
答案 1 :(得分:2)
这个问题已经超过一年了,但我只想添加一个答案,以防有人遇到同样的问题。
我尝试使用BizTalk主机的限制配置。这没有用。我实际上并没有尝试使用单例模式,因为这是我不想要的:我们创建了一个功能强大的面向服务的体系结构,可以轻松地并行处理多个消息,我不想通过引入单例模式完全撤消它
那么我最终做了什么呢?首先,我再次考虑实际需要的内容:我们需要处理一堆文件,每个文件包含1000条消息。处理文件中的消息的顺序并不重要。处理文件的顺序很重要。通常,我们应该处理第一个文件1,然后是2,然后是3,依此类推。然而,它并不严格,顺序仅在文件范围上,例如,必须处理第一范围1-5,然后范围6-8,但在一定范围内,文件的顺序并不重要。所以那些是要求。
我改变的第一件事是,不是一次处理1条消息,而是更改服务以接受消息集合,这样我就可以一次处理1个文件。通过一次处理1个文件,只有1个WCF服务调用,这样做的好处是BizTalk和WCF服务之间的聊天少了很多。但请注意,这使得WCF服务端的代码更加复杂,因为每个消息仍然必须独立于其他消息处理(使错误处理更复杂)。如果我们设法一次处理有限数量的文件,我们也可以避免过于繁忙的错误。
在消息的实际处理之后,WCF服务还提供“注册”文件处理的调用。这是服务器端的代码,用于检查当时是否可以处理文件:它考虑了文件的顺序,并确保只有在前一个文件(范围)已经存在时才能注册文件(范围)处理。这些寄存器调用尝试在内部等待的循环中注册文件(范围)。该调用尝试注册该文件,如果未被接受,则等待然后再次尝试。我真的不喜欢这个解决方案,但它确实有用。
所以最后我有一个考虑到文件范围顺序的解决方案,旁边有一个关于可以并行处理多少文件的配置。这意味着我不再有任何太忙的错误。对我的解决方案并不完全满意,但它确实有效并且非常稳定。在过去的一年里,它一直没有问题。
答案 2 :(得分:2)
对于基于SOAP,HTTP和HTTP的WCF适配器,您可以使用connectionManagement设置并限制其中的连接数。您可以准确指定每个BizTalk主机实例允许的并发连接数。 Setting SOAP, HTTP, and HTTP-based WCF Adapters Concurrent Connections
注意:
这会限制每主机实例的连接数。因此,如果您在不同主机上有多个发送端口,或者每个主机有多个主机实例,则所做的连接总数仍然可以超过此数量。
这仅适用于基于SOAP,HTTP和HTTP的WCF适配器。不适用于rvdginste
答案 3 :(得分:1)
BizTalk中的主机限制状态是BizTalk本身可用性的自我保护机制 - 我不会轻易改变这些。
与Igal的单身创意一样,你可以对BizTalk做脏事,以防止它使用WS调用重载你的应用程序,但恕我直言最终你可能会因此而损害你的BizTalk服务器的可扩展性。似乎对您的应用程序的同步调用可能是问题 - 可能会改为使用MSMQ异步执行此操作?
但是如果你保持同步wcf,你也可以在发送主机上查看these knobs的WCF适配器(我认为你需要移动到WCF-Custom适配器,如果还没有)
答案 4 :(得分:0)
我多次使用Instance Controller模式,似乎效果很好。我们的想法是将您的真实消息包装在业务流程的有效负载中。当需要调用您的服务时,您可以将其传递给业务流程,如果运行的业务流程过多,则该流程会脱水。它是一个简单的概念,效果很好。
我会说博客已经过时了......但这个想法很有效。