Condividi tramite


Bilanciamento del carico

Un modo per aumentare la capacità delle applicazioni Windows Communication Foundation (WCF) consiste nel ridimensionarle distribuendole in una server farm con carico bilanciato. Le applicazioni WCF possono essere bilanciate con tecniche standard di bilanciamento del carico, inclusi servizi di bilanciamento del carico software, ad esempio bilanciamento carico di rete Windows e appliance di bilanciamento del carico basate su hardware.

Le sezioni seguenti esaminano le considerazioni relative al bilanciamento del carico delle applicazioni WCF compilate usando vari binding forniti dal sistema.

Bilanciamento del carico con l'associazione HTTP di base

Dal punto di vista del bilanciamento del carico, le applicazioni WCF che comunicano usando BasicHttpBinding non sono diverse da altri tipi comuni di traffico di rete HTTP (contenuto HTML statico, pagine ASP.NET o servizi Web ASMX). I canali WCF che usano questo binding sono implicitamente senza stato e terminano le connessioni alla chiusura del canale. Di conseguenza, BasicHttpBinding funziona correttamente con le tecniche esistenti di bilanciamento del carico HTTP.

Per impostazione predefinita, BasicHttpBinding invia nei messaggi un'intestazione HTTP Connection con un valore Keep-Alive che consente ai client di stabilire connessioni permanenti ai servizi che le supportano. Questa configurazione offre un miglioramento della velocità effettiva poiché le connessioni stabilite in precedenza possono essere riutilizzate per l'invio di messaggi successivi allo stesso server. Il riutilizzo delle connessioni può tuttavia causare una forte associazione dei client a un server specifico all'interno della farm con carico bilanciato, riducendo in questo modo l'efficacia del bilanciamento del carico di tipo round robin. Se questo comportamento è inaccettabile, è possibile disattivare il Keep-Alive HTTP nel server utilizzando la proprietà KeepAliveEnabled con una classe CustomBinding o una classe Binding definita dall'utente. Nell'esempio seguente viene illustrato come eseguire questa operazione utilizzando la configurazione.

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

Utilizzando la configurazione semplificata introdotta in .NET Framework 4, lo stesso comportamento può essere ottenuto utilizzando la configurazione semplificata seguente.

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

Per altre informazioni su endpoint, associazioni e comportamenti predefiniti, vedere Simplified Configuration (Configurazione semplificata) e Simplified Configuration for WCF Services (Configurazione semplificata per servizi WCF).

Bilanciamento del carico con l'associazione WSHttp e WSDualHttp

Entrambe le classi WSHttpBinding e WSDualHttpBinding possono essere sottoposte a bilanciamento del carico utilizzando tecniche di bilanciamento del carico HTTP, purché vengano apportate alcune modifiche alla configurazione dell'associazione predefinita.

  • Disattivare la definizione del contesto di protezione o usare sessioni di sicurezza con stato. L'impostazione del contesto di protezione può essere disattivata impostando la proprietà EstablishSecurityContext su WSHttpBindingcome false. Se si sta usando WSDualHttpBinding o se sono necessarie le sessioni di protezione, è possibile usare sessioni di protezione con stato, come descritto in Sessioni sicure. Le sessioni di sicurezza con stato consentono al servizio di rimanere senza stato, poiché l’intero stato per la sessione di sicurezza viene trasmesso con ogni richiesta, come parte del token di sicurezza. Per abilitare una sessione di protezione con stato, è necessario usare un oggetto CustomBinding o un oggetto Binding definito dall'utente. Questo perché le impostazioni di configurazione necessarie non vengono esposte in WSHttpBinding e WSDualHttpBinding forniti dal sistema.

  • Se si disattiva la definizione del contesto di protezione, è necessario disattivare anche la negoziazione delle credenziali del servizio. Per disattivarla, impostare la proprietà NegotiateServiceCredential su WSHttpBinding come false. Per disabilitare la negoziazione delle credenziali del servizio, potrebbe essere necessario specificare in modo esplicito l'identità dell'endpoint nel client.

  • Non utilizzare sessioni affidabili. Questa funzionalità è disattivata per impostazione predefinita.

Bilanciamento del carico dell'associazione Net.TCP

La classe NetTcpBinding può essere sottoposta a bilanciamento del carico utilizzando tecniche di bilanciamento del carico a livello IP. Tuttavia, per impostazione predefinita, NetTcpBinding combina in pool le connessioni TCP per ridurre la latenza delle connessioni. Si tratta di un'ottimizzazione che interferisce con il meccanismo di base del bilanciamento del carico. Il valore di configurazione principale per ottimizzare NetTcpBinding è il timeout di lease, che fa parte delle impostazioni del pool di connessioni. Il pool di connessioni fa in modo che le connessioni client siano associate a server specifici all'interno della farm. Con l'aumento della durata di tali connessioni (un fattore controllato dall'impostazione del timeout di lease), la distribuzione del carico nei vari server della farm diventa sbilanciata. Di conseguenza, la durata media delle chiamate aumenta. Quando si utilizza NetTcpBinding in scenari con carico bilanciato, considerare una riduzione del timeout di lease predefinito utilizzato dall'associazione. Un timeout di lease di 30 secondi è un punto di partenza ragionevole per scenari con carico bilanciato, sebbene il valore ottimale dipenda dall'applicazione. Per ulteriori informazioni sul timeout lease del canale e altre quote di trasporto, vedere Quote di trasporto.

Per migliorare le prestazioni in scenari con carico bilanciato, considerare l'utilizzo di NetTcpSecurity (Transport o TransportWithMessageCredential).

Vedi anche