【问题标题】:Max amount of sessions on my WCF service?我的 WCF 服务的最大会话数?
【发布时间】:2012-10-27 06:08:31
【问题描述】:

我有一个运行 InstanceContextMode = PerCall、ConcurrencyMode = Multiple、TCP 的 WCF 服务,并且托管在 Selfhost(Windows 服务)和 IIS7/IIS8 中。

节流设置为:

<serviceThrottling maxConcurrentCalls="2000" maxConcurrentSessions="2147483647" maxConcurrentInstances="2000"/>

绑定看起来像这样:

<binding name="netTcpRegular" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="infinite" sendTimeout="01:00:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="1000" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="200" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
          <reliableSession ordered="true" inactivityTimeout="infinite" enabled="false"/>
          <security mode="None">
            <transport clientCredentialType="None"/>
          </security>
        </binding>

我们在服务中保持状态,因此每个用户都会有自己的对象,每次调用都会获取这些对象。

问题是使用这些设置我们可以拥有多少并发用户(会话)以及哪些设置会影响这一点?

【问题讨论】:

    标签: .net wcf iis configuration self-hosting


    【解决方案1】:

    这取决于单个客户端在任何时候进行多少并发调用 - 即,如果它在 5 个不同的线程上进行 5 次调用,那么您的 maxconcurrentusers 值将比它可以处理的会话数大 5 倍。当您使用 InstanceContextMode = PerCall 时,您会发现 WCF 将采用 maxConcurrentCalls 和 maxConcurrentInstances 中较低的值作为它创建的实例数。

    因此,如果您在任何时候只为每个客户拨打一个电话,那么根据您给出的值,您拥有的会话数是 2000。

    如果您对每个客户端进行 5 个并发调用,则应将其设置为 400。

    负载测试中经常试错是最好的方法。

    这里有一个很好的例子——http://blogs.msdn.com/b/rickrain/archive/2009/06/26/wcf-instancing-concurrency-and-throttling-part-3.aspx

    【讨论】:

    • 谢谢!我们通常不会对调用使用多线程,因此大多数情况下客户端一次只有一个调用。但是,如果它进行了任何重大更改,它确实与服务有一个回调合同?所以你说的是我们有 2000 个并发会话(2000 个并发登录用户),如果有更多用户尝试登录,它们将被设置在队列中还是被拒绝?
    • 我相信他们的会话将超时并结束。将其设置为 1 并查看!每项服务都不同且行为不同 - 负载测试肯定会帮助您微调服务限制级别。
    • 好的,我将尝试负载测试,但现在没有时间,所以我可以说我的系统一次支持 2000 个会话吗?这是基于 maxConcurrentInstances 的?
    • 谢谢。如果每个客户端有 5 个具有所述设置的并发呼叫,那么会有多少用户?什么设置对此负责?您说“您应该将其设置为 400”,您指的是什么设置?
    • 我指的是 maxsessions 为 400 - 但这是假设您正在使用多线程......并且假设每个客户端使用 5 个线程 - 作为 2000 maxconcurrentcalls - 和 2000/ 5 给出 400。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多