Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Uma maneira de aumentar a capacidade dos aplicativos do WCF (Windows Communication Foundation) é escalá-los implantando-os em uma fazenda 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
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 associação são inerentemente sem estado e terminam suas conexões quando o canal é fechado. Assim, as BasicHttpBinding funcionam bem com as técnicas de balanceamento de carga HTTP existentes.
Por padrão, o 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 os suportam. Essa configuração oferece um desempenho melhorado 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 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 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, consulte Configuração Simplificada e Configuração Simplificada para Serviços WCF.
Balanceamento de carga com a associação WSHttp e a associação WSDualHttp
Tanto o WSHttpBinding quanto o WSDualHttpBinding podem ser balanceados 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 estado. O Estabelecimento de Contexto de Segurança pode ser desativado definindo a propriedade EstablishSecurityContext no WSHttpBinding para
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 para
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
O NetTcpBinding pode ser balanceado usando técnicas de balanceamento de carga na 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 agrupamento de conexões faz com que as conexões do cliente se tornem associadas a servidores específicos dentro do conjunto. À 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 dependa 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 NetTcpSecurity (ou Transport ou TransportWithMessageCredential).