WSHttp 绑定和 WSDualHttp 绑定的负载平衡
如果对默认的绑定配置进行一些修改,则 WSHttpBinding 和 WSDualHttpBinding 都可以使用 HTTP 负载平衡技术来实现负载平衡。
- 关闭安全上下文的建立:这可以通过将 WSHttpBinding 上的 EstablishSecurityContext 属性设置为 false 来完成。或者,如果需要安全会话,则可以按照 安全会话 主题中的说明,使用有状态安全会话。有状态安全会话使服务保持无状态,因为安全会话的所有状态都随每个请求作为保护安全令牌的一部分进行传输。请注意,若要启用有状态安全会话,必须使用 CustomBinding 或用户定义的 Binding,因为系统提供的 WSHttpBinding 和 WSDualHttpBinding 上并不会公开必需的配置设置。
- 不要使用可靠会话。默认情况下此功能处于关闭状态。
使 Net.TCP 绑定实现负载平衡
可以使用 IP 层负载平衡技术实现 NetTcpBinding 的负载平衡。不过,默认情况下, NetTcpBinding 会汇集 TCP 连接以减少连接延迟。这是一种干扰负载平衡基本机制的优化。用于优化 NetTcpBinding 的主配置值是租约超时,它是连接池设置的一部分。连接池导致客户端连接与场内特定的服务器关联。随着这些连接的生存期的增加(一个受租约超时设置控制的因素),场内不同服务器上的负载分布会变得不平衡。结果使平均调用时间增加。因此,在负载平衡方案中使用 NetTcpBinding 时,应考虑减少由绑定使用的默认租约超时。虽然租约超时的最佳值取决于应用程序,但 30 秒的租约超时对于负载平衡方案不失为一个合理的始点。有关通道租约超时和其他传输配额的更多信息,请参见 传输配额。
若要在负载平衡方案中获得最佳性能,请考虑使用 NetTcpSecurity( Transport 或 TransportWithMessageCredential)。
启用异步处理
默认情况下,以同步方式处理发送到承载于 IIS 下的 WCF 服务的消息。ASP.NET 在它自己的线程(ASP.NET 工作线程)上调入 WCF,且 WCF 使用其他线程处理请求。WCF 在完成其处理之前会保持 ASP.NET 工作线程。这将导致同步处理请求。异步处理请求能够实现更大的可伸缩性,因为它可减少处理请求所需的线程数(在处理请求时,WCF 不保持 ASP.NET 线程)。对于运行 IIS 6.0 的计算机,不建议使用异步行为,因为无法对传入请求进行限制,以避免服务器遭受 DOS 攻击的威胁。从 IIS 7.0 开始,引入了并发请求限制: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0]“MaxConcurrentRequestsPerCpu。借助这一新的限制,可安全地使用异步处理。可在应用程序的 Web.config 文件中启用请求的异步处理。所使用的设置取决于 aspNetCompatibilityEnabled 设置。如果已将 aspNetCompatibilityEnabled 设置为 false,请按照下面的配置代码段所示配置 ServiceHttpModule。
<system.serviceModel>
<serviceHostingEnvironmentaspNetCompatibilityEnabled="false" />
</system.serviceModel>
<system.webServer>
<modules>
<removename="ServiceModel"/>
<addname="ServiceModel"
preCondition="integratedMode,runtimeVersionv2.0"
type="System.ServiceModel.Activation.ServiceHttpModule,System.ServiceModel,Version=3.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
</modules>
</system.webServer>
<system.serviceModel>
<serviceHostingEnvironmentaspNetCompatibilityEnabled="false" />
</system.serviceModel>
<system.webServer>
<modules>
<remove name="ServiceModel"/>
<add name="ServiceModel"
preCondition="integratedMode,runtimeVersionv2.0"
type="System.ServiceModel.Activation.ServiceHttpModule,System.ServiceModel,Version=3.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
</modules>
</system.webServer>
如果已将 aspNetCompatibilityEnabled 设置为 true,请按照下面的配置代码段所示配置 ServiceHttpHandlerFactory。
<system.serviceModel>
<serviceHostingEnvironmentaspNetCompatibilityEnabled="true" />
</system.serviceModel>
<system.webServer>
<handlers>
<clear/>
<addname="TestAsyncHttpHandler"
path="*.svc"
verb="*"
type="System.ServiceModel.Activation.ServiceHttpHandlerFactory,System.ServiceModel, Version=3.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089"
/>
</handlers>
</system.webServer>
<system.serviceModel>
<serviceHostingEnvironmentaspNetCompatibilityEnabled="true" />
</system.serviceModel>
<system.webServer>
<handlers>
<clear/>
<add name="TestAsyncHttpHandler"
path="*.svc"
verb="*"
type="System.ServiceModel.Activation.ServiceHttpHandlerFactory,System.ServiceModel, Version=3.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089"
/>
</handlers>
</system.webServer>
在 InstanceContextMode 设置为 PerCall 时, ConcurrencyMode 设置对吞吐量没有影响