Balanceamento de Carga
Uma maneira de aumentar a capacidade dos aplicativos WCF (Windows Communication Foundation) é dimensioná-los implantando-os em um farm de servidores com balanceamento de carga. Os aplicativos WCF podem ser balanceados 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 para o balanceamento de carga de aplicativos WCF criados usando várias associações fornecidas pelo sistema.
Balanceamento de carga com a vinculação HTTP básica
Do ponto de vista do balanceamento de carga, os aplicativos WCF que se comunicam usando o 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 ligação são inerentemente sem monitoração de estado e encerram suas conexões quando o canal é fechado. Como tal, o funciona bem com as BasicHttpBinding técnicas de balanceamento de carga HTTP existentes.
Por padrão, o envia um cabeçalho HTTP de conexão em mensagens com um Keep-Alive
valor, o BasicHttpBinding que permite que os clientes estabeleçam conexões persistentes com os serviços que os suportam. Essa configuração oferece uma taxa de transferência aprimorada porque as 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 associem fortemente 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, o HTTP Keep-Alive
pode ser desabilitado no servidor usando a KeepAliveEnabled propriedade com um CustomBinding ou definido pelo Bindingusuário . O exemplo a seguir 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 seguinte configuração 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 obter mais informações sobre pontos de extremidade padrão, associações e comportamentos, consulte Configuração simplificada e configuração simplificada para serviços WCF.
Balanceamento de carga com a vinculação WSHttp e a vinculação WSDualHttp
Tanto o WSHttpBinding e o pode ser balanceado WSDualHttpBinding de carga usando técnicas de balanceamento de carga HTTP, desde que várias modificações sejam feitas na configuração de vinculação padrão.
Desative o Estabelecimento de contexto de segurança ou use sessões de segurança com monitoração de estado. O Estabelecimento de Contexto de Segurança pode ser desativado definindo a EstablishSecurityContext propriedade no WSHttpBinding para
false
. Se você estiver usando WSDualHttpBinding ou se forem necessárias sessões de segurança, é possível usar sessões de segurança com monitoração de estado, conforme descrito em Sessões seguras. As sessões de segurança com monitoração de estado permitem que o serviço permaneça sem monitoração de 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 monitoração de estado, você deve usar um CustomBinding ou definido Bindingpelo usuário , pois as definições de configuração necessárias não são expostas no sistema fornecido WSHttpBinding e WSDualHttpBinding.Se você desativar o Estabelecimento de contexto de segurança, também precisará desativar a negociação de credenciais de serviço. Para desativá-lo, defina a NegotiateServiceCredential propriedade em 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 utilize sessões fiáveis. Esse recurso está desativado por padrão.
Balanceamento de carga da ligação Net.TCP
O pode ser balanceado NetTcpBinding de carga usando técnicas de balanceamento de carga de camada IP. No entanto, os NetTcpBinding pools de conexões TCP por padrão para reduzir a latência de conexão. Esta é uma otimização que interfere com o mecanismo básico de balanceamento de carga. O principal valor de configuração para otimizar o 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 de cliente sejam associadas 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 torna-se desequilibrada. Como resultado, o tempo médio de chamada aumenta. Portanto, ao usar os NetTcpBinding 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 dependa do aplicativo. Para obter mais informações sobre o tempo limite de locação do 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 (ou TransportTransportWithMessageCredential).