0

我有一个运行 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>

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

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

4

1 回答 1

0

这取决于单个客户端在任何时候进行多少次并发调用 - 即,如果它在 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

于 2012-11-07T08:33:19.380 回答