【问题标题】:Scaling WCF service which makes Http calls进行 Http 调用的缩放 WCF 服务
【发布时间】:2011-05-20 13:05:05
【问题描述】:

我有一个托管在 IIS 中的 WCF 服务,它是各种第三方 API 的适配器。该服务所做的只是: - 接受来自 GUI 的同步操作调用 - 向第三方发出同步 Http 请求 - 将结果转换为规范格式 - 返回图形界面

实际上,它花费了大部分等待网络 i/o 的时间来完成。 在保持 GUI 同步界面的同时使这种服务规模化的最佳模式是什么?我知道对于具有大量 i/o 的 ASP.NET 应用程序,建议使用异步处理程序来释放执行请求的线程。

WCF 有什么好的模式吗?

谢谢, 彼得

【问题讨论】:

    标签: wcf asynchronous scalability sync


    【解决方案1】:

    正如您所描述的,这是一个潜在的可扩展性问题。

    ASP.NET 有一个线程池(我上次检查时是 250,但可以增加到 1000 - 可配置但不推荐超过 1000)服务请求。 ASP.NET 中的 HTTP 请求具有线程亲和性,因此这些线程和请求之间存在一对一的关系。

    当您调用外部服务时,请求线程一直挂起,如果您的线程用完,您的客户端将收到 503 错误。

    解决方案 用于扩展此服务通常包括客户端请求启动 操作,然后客户端会不断轮询 服务以看看它是否已经完成。如果您以轻量级和高效的方式实现这些服务,您会损失一些性能,但会获得很大的可扩展性

    您还需要考虑:

    • 存储结果以便客户端获取。
    • 如果客户端没有返回服务器获取结果,则丢弃结果。

    【讨论】:

      【解决方案2】:

      我遇到了这个“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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 2011-05-12
        • 2011-07-11
        相关资源
        最近更新 更多