Compartir a través de


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. Las aplicaciones WCF pueden equilibrar la carga mediante técnicas de equilibrio de carga estándar, incluidos equilibradores de carga de software, como equilibrio de carga de red de Windows, así como dispositivos de equilibrio de carga basados en hardware.

En las secciones siguientes se describen las consideraciones sobre el equilibrio de carga de las aplicaciones WCF creadas con 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 que se comunican mediante BasicHttpBinding no son diferentes a 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 sin estado de forma inherente y finalizan sus conexiones cuando se cierra el canal. Por lo tanto, BasicHttpBinding se adapta bien a las técnicas de equilibrio de carga HTTP existentes.

De forma predeterminada, BasicHttpBinding envía un encabezado HTTP de conexión en mensajes con un valor de Keep-Alive, lo que permite a los clientes establecer conexiones persistentes a los servicios que los soportan. Esta configuración ofrece un rendimiento mejorado porque se pueden reutilizar las conexiones establecidas previamente para enviar mensajes posteriores al mismo servidor. Sin embargo, la reutilización de conexiones puede hacer que los clientes se asocien fuertemente a un servidor específico dentro de la granja de servidores con carga equilibrada, lo que reduce la eficacia de la distribución cíclica del equilibrio de carga. Si este comportamiento no es deseable, HTTP Keep-Alive se puede deshabilitar en el servidor usando la propiedad KeepAliveEnabled con un CustomBinding o un Binding definido por el usuario. En el ejemplo siguiente se muestra cómo hacerlo mediante 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 para servicios WCF.

Equilibrio de carga con los enlaces WSHttp y WSDualHttp

Tanto WSHttpBinding como WSDualHttpBinding pueden equilibrarse mediante técnicas de balanceo de carga HTTP, siempre que se realicen varias modificaciones en la configuración de enlace predeterminada.

  • Desactive el establecimiento del contexto de seguridad o use sesiones de seguridad con estado. El establecimiento de contexto de seguridad se puede desactivar estableciendo la EstablishSecurityContext propiedad en el WSHttpBinding a 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 desactivarlo, establezca la propiedad NegotiateServiceCredential en WSHttpBinding a false. Para deshabilitar la 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 forma 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. Se trata de una optimización que interfiere con el mecanismo básico de 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 hace que las conexiones de cliente se asocien a servidores específicos dentro de la granja de servidores. 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, aumenta el tiempo medio de 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 partida razonable para escenarios con equilibrio de carga, aunque el valor óptimo depende de la aplicación. Para obtener más información sobre el tiempo de espera del arrendamiento del canal y otras cuotas de transporte, consulte Cuotas de transporte.

Para obtener el mejor rendimiento en escenarios de carga equilibrada, considere la posibilidad de usar NetTcpSecurity (ya sea Transport o TransportWithMessageCredential).

Consulte también