Equilibrio de carga

Una forma de aumentar la capacidad de las aplicaciones Windows Communication Foundation (WCF) es escalarlas horizontalmente mediante su implementación en una granja de servidores de carga equilibrada. Es posible equilibrar la carga de las aplicaciones WCF mediante técnicas de equilibrio de carga estándar, entre las que se incluyen 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.

Las secciones siguientes tratan sobre las consideraciones para las aplicaciones WCF de equilibrio de carga compiladas con varios enlaces que proporciona el sistema.

Equilibrio de carga con el enlace HTTP básico

Desde la perspectiva del equilibrio de carga, las aplicaciones WCF que se comunican mediante BasicHttpBinding no son diferentes de otros tipos comunes de tráfico de red HTTP (contenido HTML estático, páginas ASP.NET o servicios web de ASMX). Los canales WCF que usan este enlace son sin estado de forma inherente 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>  

Si se usa la configuración simplificada que se presenta 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 al establecer la propiedad EstablishSecurityContext en WSHttpBinding para false. Si usa WSDualHttpBinding o se necesitan sesiones de seguridad, es posible usar sesiones de seguridad con estado, tal y como se describe en Sesiones seguras. Las sesiones de seguridad con estado permiten que el servicio siga sin estado, ya que se transmitirá todo el estado para la sesión de seguridad con cada solicitud como parte del token de seguridad de protección. Para habilitar una sesión de seguridad con estado, debe usar un CustomBinding o Binding que define el usuario, ya que los valores de configuración necesarios no están expuestos en el WSHttpBinding y WSDualHttpBinding que proporciona el sistema.

  • Si desactiva el establecimiento del contexto de seguridad, también debe desactivar la negociación de credenciales de servicio. Para desactivarla, establezca la propiedad NegotiateServiceCredential en WSHttpBinding para false. Para deshabilitar la negociación de credenciales de servicio, es posible que deba especificar de forma explícita la identidad del punto de conexión del 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 de canal y otras cuotas de transporte, consulte Cuotas de transporte.

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

Consulte también