【问题标题】:Creating a WCF Restful service, concurrency issues创建 WCF Restful 服务,并发问题
【发布时间】:2011-01-15 09:39:24
【问题描述】:

您好,我正在使用 WCF 创建一个宁静的服务,该服务在任何给定时间都可能被至少 500 人使用。为了处理这个问题,我需要设置什么设置。请给我任何积分和提示,谢谢。

这是我目前所拥有的示例;

[ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] 

这是一个方法被调用的例子;

    public UsersAPI getUserInfo(string UserID)
    {
        UsersAPI users = new UsersAPI(int.Parse(UserID));

        return users;
    }



    [OperationContract]
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, UriTemplate = "User/{UserID}")]
    [WebHelp(Comment = "This returns a users info.")]
    UsersAPI getUserInfo(string UserID);

【问题讨论】:

    标签: wcf web-services rest


    【解决方案1】:

    最好的方法是使用:

    • InstanceContextMode.PerCall
    • ConcurrencyMode.Single

    这将为每个调用者创建一个新的服务类实例,让您不必担心对代码的多线程并发访问,因为每个请求都有自己的服务类实例(它本身是单线程 - 它一次只为一个调用者服务)。

    此外,通过这种方法,您可以轻松“横向扩展”,例如只需简单地添加更多服务器来处理更高的负载(您所在位置的服务器,或“在云中”,例如 Windows Azure 工作人员)。

    使用ServiceThrottling 服务行为,您可以非常轻松地控制允许多少并发调用者 - 这取决于您机器的类型和大小。

    <serviceBehaviors>
      <behavior name="Throttling">
         <serviceThrottling 
                 maxConcurrentCalls="16"
                 maxConcurrentInstances="16"
                 maxConcurrentSessions="10" />
      </behavior>
    </serviceBehaviors>
    

    这些是 WCF 3.5 的默认值 - maxConcurrentCalls 设置定义了可以同时处理多少调用者。

    查看MSDN docs on Service throttling了解更多详情。

    【讨论】:

    • 您好,感谢您的回复,如果我们发展壮大,并且拥有大约 30000 个用户,相同的设置是否仍然适用?
    • +1,很好的答案。使用上述设置,如果您访问服务实例之外的共享状态,您仍然需要担心线程安全。此外,如果您不在服务实例中存储可变状态,则可以使用 InstanceContextMode.SingleConcurrencyMode.Multiple 以获得最佳性能。
    • @pmillio:您可能需要增加 maxConcurrentCalls 的数量(这只是默认设置),或者您可能需要购买额外的服务器 - 但架构的扩展性很好
    • @Allon Guralnek:数据库通常会很好地处理这些并发问题,这就是为什么任何服务都应该将其状态存储在数据库中并尝试避免任何其他状态共享存储(正确处理会变得混乱) )
    • 我在谈论对象中的共享状态(例如静态引用、缓存、外部依赖项,例如 3rd 方组件等)。这些有时是不可避免的,因此应该小心。我认为线程无知的能力只适用于非常琐碎的应用程序。此外,您通常不希望仅仅为了同步短暂的共享状态而承受数据库往返的性能损失。
    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 2011-08-12
    • 2012-11-10
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多