Compartilhar via


Balanceamento de carga

Uma maneira de aumentar a capacidade dos aplicativos WCF (Windows Communication Foundation) é dimensioná-los horizontalmente implantando-os em um farm de servidores com balanceamento de carga. Os aplicativos WCF podem ter balanceamento de carga usando técnicas de balanceamento de carga padrão, incluindo balanceadores de carga de software, como o Balanceamento de Carga de Rede do Windows, bem como dispositivos de balanceamento de carga baseados em hardware.

As seções a seguir discutem considerações sobre o balanceamento de carga de aplicativos WCF criados usando várias associações fornecidas pelo sistema.

Balanceamento de carga com a associação HTTP básica

Na perspectiva do balanceamento de carga, os aplicativos WCF que se comunicam usando BasicHttpBinding não são diferentes de outros tipos comuns de tráfego de rede HTTP (conteúdo HTML estático, páginas ASP.NET ou Serviços Web ASMX). Os canais WCF que usam essa associação são inerentemente sem estado e terminam suas conexões quando o canal é fechado. Como tal, BasicHttpBinding funciona bem com as técnicas de balanceamento de carga HTTP existentes.

Por padrão, ele BasicHttpBinding envia um cabeçalho HTTP de conexão em mensagens com um valor Keep-Alive, o que permite que os clientes estabeleçam conexões persistentes com os serviços que dão suporte a eles. Essa configuração oferece uma taxa de transferência aprimorada porque conexões estabelecidas anteriormente podem ser reutilizadas para enviar mensagens subsequentes para o mesmo servidor. No entanto, a reutilização da conexão pode fazer com que os clientes se tornem fortemente associados a um servidor específico dentro do farm com balanceamento de carga, o que reduz a eficácia do balanceamento de carga round robin. Se esse comportamento for indesejável, HTTP Keep-Alive poderá ser desabilitado no servidor usando a propriedade KeepAliveEnabled com um CustomBinding ou Binding definido pelo usuário. O seguinte exemplo mostra como fazer isso usando a configuração.

<?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>  

Usando a configuração simplificada introduzida no .NET Framework 4, o mesmo comportamento pode ser realizado usando a configuração simplificada a seguir.

<?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 obter mais informações sobre pontos de extremidade, associações e comportamentos padrão, confira Configuração simplificada e Configuração simplificada para serviços WCF.

Balanceamento de carga com a associação WSHttp e a associação WSDualHttp

É possível balancear a carga de WSHttpBinding e WSDualHttpBinding usando técnicas de balanceamento de carga HTTP, desde que várias modificações sejam feitas na configuração de associação padrão.

  • Desative o Estabelecimento de Contexto de Segurança ou use sessões de segurança com estado. O Estabelecimento de Contexto de Segurança pode ser desativado definindo a propriedade EstablishSecurityContext em WSHttpBinding como false. Se você estiver usando WSDualHttpBinding ou sessões de segurança forem necessárias, será possível usar sessões de segurança com estado, conforme descrito em Sessões seguras. Sessões de segurança com estado permitem que o serviço permaneça sem estado, pois todo o estado da sessão de segurança é transmitido com cada solicitação como parte do token de segurança de proteção. Para habilitar uma sessão de segurança com estado, você deve usar um CustomBinding ou Binding definido pelo usuário, pois as configurações necessárias não são expostas em WSHttpBinding e WSDualHttpBinding fornecidos pelo sistema.

  • Se você desativar o Estabelecimento de Contexto de Segurança, também precisará desativar a Negociação de Credenciais de Serviço. Para desativá-la, defina a propriedade NegotiateServiceCredential no WSHttpBinding como false. Para desabilitar a Negociação de Credenciais de Serviço, talvez seja necessário especificar explicitamente a identidade do ponto de extremidade no cliente.

  • Não use sessões confiáveis. Esse recurso está desativado por padrão.

Balanceamento de carga da associação Net.TCP

É possível fazer o balanceamento de carga de NetTcpBinding usando técnicas de balanceamento de carga da camada IP. No entanto, NetTcpBinding faz o pool de conexões TCP por padrão para reduzir a latência de conexão. Essa é uma otimização que interfere no mecanismo básico de balanceamento de carga. O valor de configuração principal para otimizar NetTcpBinding é o tempo limite de concessão, que faz parte das Configurações do Pool de Conexões. O pool de conexões faz com que as conexões do cliente se associem a servidores específicos dentro do farm. À medida que o tempo de vida dessas conexões aumenta (um fator controlado pela configuração de tempo limite de concessão), a distribuição de carga entre vários servidores no farm fica desequilibrada. Como resultado, o tempo médio de chamada aumenta. Portanto, ao usar NetTcpBinding nos cenários com balanceamento de carga, considere reduzir o tempo limite de concessão padrão usado pela associação. Um tempo limite de concessão de 30 segundos é um ponto de partida razoável para cenários com balanceamento de carga, embora o valor ideal seja dependente do aplicativo. Para obter mais informações sobre o tempo limite de concessão de canal e outras cotas de transporte, consulte Cotas de transporte.

Para obter o melhor desempenho em cenários com balanceamento de carga, considere o uso de NetTcpSecurity (Transport ou TransportWithMessageCredential).

Confira também