【问题标题】:WCF Optimal performance settingsWCF 最佳性能设置
【发布时间】:2011-01-22 11:39:02
【问题描述】:

您好,我正在使用 WCF 创建 API。我的问题可以分为两个单独的问题

1) 我有很多电话,例如我有与客户、产品、订单、员工有关的电话。

我的问题是所有这些都应该进入一个公共接口类,例如

public interface IRestService
public class RestService : IRestService

或者我是否应该为每个电话准备一个,例如

public interface ICustomer
public class Customer : ICustomer

public interface IProducts
public class Products: IProducts

2) 如果您有一个 API 将被数以万计的用户和数以千计的用户同时访问,您将如何设置,您的网络配置设置将是什么,例如在限制方面。另外,您会给InstanceContextModeConcurrencyMode 提供什么设置。最后会是什么类型的绑定,注意网站和手机都可以访问api。

【问题讨论】:

    标签: asp.net wcf web-services


    【解决方案1】:

    为了良好的实践,我会将 API 分解为单独的接口,以便您将来可以选择将它们拆分为单独的实现。您仍然可以让一个服务类实现所有接口,如下所示:

    public class RestService : ICustomer, IProducts, IOrders
    

    但是,听起来您可能还是希望将它们分开实现。

    在并发设置方面,问问自己每次调用需要使用哪些资源。如果您的服务类的构造函数可以在没有任何冗长启动的情况下编写,则使用 PerCall。如果您需要初始化昂贵的资源,那么我建议您使用 InstanceContextMode.Single 和 ConcurrencytMode.Multiple 并确保您编写线程安全的代码。例如:确保在使用任何类属性或其他共享资源之前对其进行 lock()。

    不过,数据库连接算作“昂贵的初始化”,因为 ADO 会为您进行连接池并消除这种开销。

    正如拉迪斯拉夫所说,您的节流设置将通过测试来揭示。您需要对您的服务进行压力测试并使用结果来了解您需要多少台机器来为您的预期负载提供服务。然后,您将需要一个专用的负载均衡器来将请求路由为循环或检查每个服务器的健康状况的东西。负载平衡器可以设置为获取“systemhealth.asp”页面并检查结果。如果您返回“OK”,则该机器将留在池中,或者如果超时或返回任何其他状态,则可以暂时从池中移除。

    您的绑定需要为 REST 的 WebHTTPBinding。 BasicHTTPBinding 用于 SOAP 接口,例如不支持 [WebGet]。

    如果它不必是 REST 服务,那么您可以通过使用 NetTcpBinding 获得更多性能。

    【讨论】:

    • 您好,感谢您抽出时间回复。我会将与接口相关的方法放在哪里,它们会进入“RestService”类。例如,getCustomersByID 会进入客户类吗?
    • 是的,如果您想将每个职责(客户、产品、订单)分解为单独的类,您只需先为每个职责定义一个接口(ICustomer、IProducts、IOrders),然后创建实现每一个的三个类——用它们各自的方法。将这三个组合成一个类的唯一充分理由是,如果它们的方法很少,共享某种状态,并且您希望保持简单。如果他们有很多方法,那么分解它们绝对是个好主意。
    • 再次感谢,好的,在我为每个单独的服务创建和接口和类之后,我如何从一个服务中调用它们,我希望我有意义。
    • 每个都将使用单独的端点公开。当您在客户端代码中“添加服务引用”时,您需要输入每个服务的 URI 并为每个服务创建单独的代理。
    【解决方案2】:
    1. 如果你真的很少操作,可以使用单服务。一般来说,服务是相关操作的逻辑集合,但操作的数量应该是有限的。通常,如果您的服务有超过 20 个操作,您应该考虑重构。

    2. 您打算使用 REST 服务吗?我猜你这样做是因为你的第一个界面示例。在这种情况下,您需要具有默认 InstanceContextMode (PerCall) 和 ConcurrencyMode (Single) 值的 WebHttpBinding(或类似的自定义绑定)。只有其他有意义的 REST 服务组合是 InstanceContextMode.SingleConcurrencyMode.Multiple,但它会将您的服务创建为单例,这可能会影响您的服务实现。我的经验法则:除非你真的需要,否则不要使用单例服务。

    3. 限制配置取决于您的服务实现和服务器的性能。成千上万的并发用户对您来说意味着什么?同时处理数千个请求需要具有负载均衡器的良好服务器集群或在 Azure(云)中托管。一切还取决于处理(操作实现)的速度和消息的大小。 MaxConcurrentInstancesMaxConcurrentCalls 的正确设置(PerCall 实例应该相同)应该通过性能测试来揭示。 Default values 用于服务限制在 WCF 4 中已更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多