Equilibrio de carga

Una manera de aumentar la capacidad de Windows Communication Foundation (WCF) es escalarlas horizontalmente implementándolos en una granja de servidores con equilibrio de carga. Las aplicaciones WCF se pueden equilibrar la carga mediante técnicas de equilibrio de carga estándar, incluidos los equilibradores de carga de software, como el equilibrio de carga de red de Windows, así como los dispositivos de equilibrio de carga basados en hardware.

En las secciones siguientes se de abordan las consideraciones para el equilibrio de carga de las aplicaciones WCF creadas mediante varios enlaces proporcionados por el sistema.

Equilibrio de carga con el enlace HTTP básico

Desde la perspectiva del equilibrio de carga, las aplicaciones WCF BasicHttpBinding que se comunican mediante no son diferentes de otros tipos comunes de tráfico de red HTTP (contenido HTML estático, páginas ASP.NET o servicios web ASMX). Los canales WCF que usan este enlace son intrínsecamente sin estado y finalizan sus conexiones cuando se cierra el canal. Como tal, BasicHttpBinding funciona bien con técnicas de equilibrio de carga de HTTP existentes.

De forma predeterminada, BasicHttpBinding envía un encabezado HTTP de conexión en mensajes con un valor Keep-Alive, que permite a los clientes establecer conexiones permanentes a los servicios que las admiten. Esta configuración proporciona un rendimiento mejorado ya que las conexiones previamente establecidas se pueden reutilizar para enviar los mensajes subsiguientes al mismo servidor. Sin embargo, la reutilización de la conexión puede hacer que los clientes se asocien con un servidor concreto dentro de la granja con la carga equilibrada, lo que reduce la eficacia del equilibrio de carga por turnos (round-robin). Si este comportamiento no es adecuado, Keep-Alive de HTTP puede estar deshabilitado en el servidor utilizando la propiedad KeepAliveEnabled con CustomBinding o Binding definido por el usuario. En el ejemplo siguiente se muestra cómo hacerlo usando la configuración.

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  
 <system.serviceModel>  
  <services>  
   <service
     name="Microsoft.ServiceModel.Samples.CalculatorService"  
     behaviorConfiguration="CalculatorServiceBehavior">  
     <host>  
      <baseAddresses>  
       <add baseAddress="http://localhost:8000/servicemodelsamples/service"/>  
      </baseAddresses>  
     </host>  
    <!-- configure http endpoint, use base address provided by host  
         And the customBinding -->  
     <endpoint address=""  
           binding="customBinding"  
           bindingConfiguration="HttpBinding"
           contract="Microsoft.ServiceModel.Samples.ICalculator" />  
   </service>  
  </services>  
  
  <bindings>  
    <customBinding>  
  
    <!-- Configure a CustomBinding that disables keepAliveEnabled-->  
      <binding name="HttpBinding" keepAliveEnabled="False"/>  
  
    </customBinding>  
  </bindings>  
 </system.serviceModel>  
</configuration>  

Con la configuración simplificada introducida en .NET Framework 4, se puede lograr el mismo comportamiento mediante la siguiente configuración simplificada.

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
 <system.serviceModel>  
    <protocolMapping>  
      <add scheme="http" binding="customBinding" />  
    </protocolMapping>  
    <bindings>  
      <customBinding>  
  
      <!-- Configure a CustomBinding that disables keepAliveEnabled-->  
        <binding keepAliveEnabled="False"/>  
  
      </customBinding>  
    </bindings>  
 </system.serviceModel>  
</configuration>  

Para obtener más información sobre los puntos de conexión, enlaces y comportamientos predeterminados, vea Configuración simplificada y Configuración simplificada de los servicios de WCF.

Equilibrio de carga con los enlaces WSHttp y WSDualHttp

WSHttpBinding y WSDualHttpBinding pueden tener la carga equilibrada gracias a las técnicas de equilibrio de carga de HTTP siempre que se hagan algunas modificaciones a la configuración de enlace predeterminada.

  • Desactive el establecimiento del contexto de seguridad o use sesiones de seguridad con estado. El establecimiento del contexto de seguridad se puede desactivar estableciendo la EstablishSecurityContext propiedad en WSHttpBinding en false. Si usa sesiones de WSDualHttpBinding seguridad o son necesarias, es posible usar sesiones de seguridad con estado como se describe en WSDualHttpBinding. Las sesiones de seguridad con estado permiten que el servicio permanezca sin estado, ya que todo el estado de la sesión de seguridad se transmite con cada solicitud como parte del token de seguridad de protección. Para habilitar una sesión de seguridad con estado, CustomBindingBindingdebe usar o definido por el usuario , ya que los valores de configuración necesarios no se exponen WSHttpBinding en los valores proporcionados por el sistema y WSDualHttpBinding.

  • Si desactiva establecimiento de contexto de seguridad, también debe desactivar negociación de credenciales de servicio. Para desactivarlo, establezca la propiedad NegotiateServiceCredential en WSHttpBinding en false. Para deshabilitar negociación de credenciales de servicio, es posible que tenga que especificar explícitamente la identidad del punto de conexión en el cliente.

  • No utilice las sesiones confiables. Esta característica está desactivada de manera predeterminada.

Equilibrio de carga del enlace Net.TCP

Puede equilibrarse la carga de NetTcpBinding mediante técnicas de equilibrio de carga de nivel IP. Sin embargo, NetTcpBinding agrupa de forma predeterminada las conexiones TCP para reducir la latencia de conexión. Ésta es una optimización que interfiere con el mecanismo básico del equilibrio de carga. El valor de configuración principal para optimizar NetTcpBinding es el tiempo de espera de la concesión, que forma parte de la configuración del grupo de conexiones. La agrupación de conexiones produce conexiones de cliente que se asociarán a servidores concretos dentro de la granja. Como la duración de esas conexiones aumenta (un factor controlado por el valor de tiempo de espera de la concesión), la distribución de carga en varios servidores de la granja pasa a estar sin equilibrar. Como resultado, aumentará el tiempo medio de la llamada. Así, al utilizar NetTcpBinding en escenarios con carga equilibrada, considere reducir el tiempo de espera de concesión predeterminado utilizado por el enlace. Un tiempo de espera de concesión de 30 segundos es un punto de inicio razonable para los escenarios con carga equilibrada, aunque el valor óptimo depende de la aplicación. Para obtener más información sobre el tiempo de espera de concesión del canal y otras cuotas de transporte, vea Cuotas de transporte.

Para obtener el máximo rendimiento en escenarios con carga equilibrada, considere utilizar NetTcpSecurity (Transport o TransportWithMessageCredential).

Consulta también