我在IIS中托管了一个WCF服务,它是各种ThirdParty API的适配器。所有这些服务都是: - 接受来自GUI的同步操作调用 - 向第三方发起同步Http请求 - 将结果转换为规范格式 - 返回GUI
在实践中,它花费大部分等待网络i / o来完成。 在维护GUI的同步接口的同时,实现此类服务规模的最佳模式是什么?我知道对于具有大量i / o的ASP.NET应用程序,建议使用异步处理程序来释放执行请求的线程。
WCF有什么好的模式吗?
谢谢, 彼得
答案 0 :(得分:0)
如您所述,这是一个潜在的可扩展性问题。
ASP.NET有一个线程池(我上次检查的时间是250但可以增加到1000 - 可配置,但不是真正推荐的1000以上)服务请求。 ASP.NET中的HTTP请求具有线程关联性,因此这些线程和请求之间存在一对一的关系。
当您调用externals服务时,请求线程会一直挂起,如果线程用完,您的客户端将收到503错误。
用于扩展此服务的解决方案通常会包含客户端启动操作的请求,然后客户端会持续轮询该服务看看它是否已经完成。如果您将这些服务实现为轻量级且高效,会失去一点性能,但会获得如此多的可伸缩性。
您还需要考虑:
答案 1 :(得分:0)
我遇到过这个“AsyncPattern”可能是这个问题的解决方案(http://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontractattribute.asyncpattern.aspx)
我看起来像是在等待I / O完成时“释放”服务线程的方法。同时它从调用者的角度保留了操作的同步性(即这是严格的服务方实施细节)。缺点似乎是服务端的代码复杂性:所有外部调用都必须使用Begin / End API。
一些有用的链接: What is the use of "AsyncPattern" property of "OperationContractAttribute" + wcf? WCF - AsyncPattern Performance http://blogs.msdn.com/b/wenlong/archive/2009/02/09/scale-wcf-application-better-with-asynchronous-programming.aspx