Condividi tramite


Bilanciamento del carico

Per aumentare la capacità delle applicazioni Windows Communication Foundation (WCF), è possibile applicare ad esse una scalabilità orizzontale distribuendole in una server farm con carico bilanciato. Nelle applicazioni WCF il bilanciamento del carico può essere realizzato utilizzando tecniche standard, tra cui servizi di bilanciamento del carico come Bilanciamento carico di rete di Windows, nonché appositi dispositivi hardware.

Nelle sezioni seguenti vengono illustrate alcune considerazioni sul bilanciamento del carico delle applicazioni WCF create utilizzando varie associazioni fornite dal sistema.

Bilanciamento del carico con l'associazione HTTP di base

Dal punto di vista del bilanciamento del carico, le applicazioni WCF che comunicano utilizzando la classe 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 utilizzano questa associazione sono intrinsecamente senza stato e terminano le connessioni quando il canale viene chiuso. 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="https://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 ulteriori informazioni su endpoint, associazioni e comportamenti predefiniti, vedere Configurazione semplificata e 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 sicurezza. A tale scopo, impostare la proprietà EstablishSecurityContext della classe WSHttpBinding su false. In alternativa, se sono necessarie sessioni di sicurezza, è possibile utilizzare sessioni di sicurezza con stato come illustrato nell'argomento Sessioni protette. Le sessioni di sicurezza con stato consentono al servizio di rimanere senza stato, poiché lo stato per la sessione di sicurezza viene trasmesso con ogni richiesta come parte del token di sicurezza. Si noti che per abilitare una sessione di sicurezza con stato, è necessario utilizzare una classe CustomBinding o una classe Binding definita dall'utente, poiché le impostazioni di configurazione necessarie non vengono esposte sulle classi WSHttpBinding e WSDualHttpBinding fornite dal sistema.

  • 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 di lease del canale e su altre quote del trasporto, vedere Quote dei trasporti.

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

Vedere anche

Concetti

Procedure consigliate per l'hosting in Internet Information Services (IIS)