WCF最佳性能设置

时间:2011-01-22 11:39:02

标签: asp.net wcf web-services

您好我正在使用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,你将如何设置,例如在限制方面你的web配置设置是什么。您还可以为InstanceContextModeConcurrencyMode设置什么设置。最后是什么类型的绑定,记住网站和手机可以访问api。

2 个答案:

答案 0 :(得分:1)

  1. 如果您的操作很少,可以使用单一服务。通常,服务是相关操作的逻辑集合,但操作的数量应该是有限的。通常,如果您的服务有超过20个操作,您应该考虑重构。

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

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

答案 1 :(得分:1)

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

public class RestService : ICustomer, IProducts, IOrders

但是,听起来好像你可能想要将它们分开实现。

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

数据库连接计为“初始化成本高”,因为ADO会为您进行连接池并消除开销。

正如Ladislav所提到的那样,您的节流设置将通过测试显示出来。您需要对服务进行压力测试并使用结果来了解您需要为预期负载提供多少台机器。然后,您需要一个专用的负载均衡器来将请求路由为循环,或者检查每个服务器运行状况的东西。可以将负载平衡器设置为GET“systemhealth.asp”页面并检查结果。如果您返回“确定”,则该计算机将保留在池中,或者如果计时器超时或返回任何其他状态,则可以暂时从池中删除。

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

如果它不必是REST服务,那么使用NetTcpBinding可以获得更高的性能。