我开发了一个BizTalk应用程序,它接收一个包含大量消息的文件作为输入。我使用BizTalk XML反汇编组件在不同的消息中‘讨论’这个文件。这些消息中的每一条都是由转换消息并调用MessageBox服务的编排从wcf中选取的。
我现在遇到的问题是,每批包含1000条消息,而这1000条消息似乎都同时调用wcf服务。wcf服务被这些消息“轰炸”,并被配置为只并行处理10条消息(每个调用都必须处理数据并将数据放入数据库中),并将一堆“太忙”的异常返回给BizTalk。我已将wcf适配器配置为在1分钟后重试连接。
最终的结果是,BizTalk首先处理消息,然后用全部1000条消息轰炸wcf服务,得到一堆“太忙”的异常,然后等待,直到1分钟过去,然后再次轰炸它,依此类推。
如果我可以将BizTalk配置为打开到该特定wcf服务的最多10个连接,处理效率会更高,但据我所知,这是不可能的。( wcf服务配置为使用net.tcp。)
我已经用几种不同的方法尝试了主机的节流设置,但要么没有帮助,要么使应用程序变得无法忍受。此外,BizTalk中的节流似乎是以这样一种方式实现的:它首先轰炸一个服务,然后注意到它正在轰炸,然后等待一段时间什么也不做,然后取消油门并再次开始轰炸。让请求/消息在时间上更均匀地传播似乎要好得多。例如,我想将WCF适配器配置为每秒最多接收4条消息。现在可能的节流是这样的:在5秒的滑动窗口中,如果有超过20条消息,我希望激活节流。但这是不同的,因为它允许“突发”效果。
您知道如何提高吞吐量吗?
发布于 2011-11-06 20:20:55
这个问题已经提出一年多了,但我只是想补充一个答案,以防有人遇到同样的问题。
我尝试使用BizTalk主机的限制配置。这并没有起到作用。我实际上并没有尝试使用单例模式,因为这是我不想要的东西:我们创建了一个强大的面向服务的体系结构,可以轻松地并行处理多个消息,我不想通过引入单例模式来完全取消这一点。
那么我最终做了什么呢?首先,我再次考虑了实际需要的内容:我们需要处理一堆文件,每个文件包含1000条消息。处理文件内消息的顺序并不重要。处理文件的顺序很重要。通常,我们应该首先处理文件1,然后是2,然后是3,依此类推。然而,这并不是那么严格,顺序只针对文件的范围,例如,首先必须处理范围1-5,然后是范围6-8,但在一个范围内,文件的顺序并不重要。因此,这些都是要求。
我更改的第一件事不是一次处理一条消息,而是将服务更改为接受一组消息,这样我就可以一次处理一个文件。通过一次处理一个文件,只有一个对WCF服务的调用,这有一个优点,那就是BizTalk和WCF服务之间的聊天减少了很多。但是,请注意,这会使WCF服务端的代码变得更加复杂,因为每条消息仍然必须独立于其他消息进行处理(使错误处理更加复杂)。如果我们设法一次处理有限数量的文件,我们也可以避免too busy错误。
除了实际的消息处理之外,WCF服务还提供了“注册”文件处理的调用。这是服务器端的代码,用于检查文件是否可以在当时被处理:它考虑文件的顺序,并确保仅当前一个文件(范围)已经处理时才能注册文件(范围)。这些寄存器调用尝试在一个循环中注册一个文件(范围),里面有一个等待。该调用尝试注册该文件,如果未被接受,它将等待,然后重试。我真的不喜欢这个解决方案,但它是有效的。
所以最后我有了一个解决方案,它考虑了文件范围的顺序,并且在它旁边有一个关于可以并行处理多少文件的配置。这意味着我不再收到任何太忙的错误。对我的解决方案并不完全满意,但它确实有效并且非常稳定。在过去的一年里,它一直在运行,没有任何问题。
发布于 2010-08-29 03:41:12
使用BizTalk singleton pattern。这太难看了。但是,当BizTalk优雅的架构与现实世界相遇时,它就会变得丑陋。
发布于 2013-07-11 11:52:56
对于SOAP、HTTP和基于HTTP的WCF适配器,您可以使用connectionManagement设置并限制那里的连接数量。您可以指定每个BizTalk主机实例允许多少个并发连接。Setting SOAP, HTTP, and HTTP-based WCF Adapters Concurrent Connections
备注:
指出的其他WCF适配器
https://stackoverflow.com/questions/3591283
复制相似问题