次の方法で共有


負荷分散

Windows Communication Foundation (WCF) アプリケーションの容量を増やす方法の 1 つは、負荷分散されたサーバー ファームに展開してスケールアウトすることです。 WCF アプリケーションは、Windows ネットワーク負荷分散などのソフトウェア ロード バランサーやハードウェア ベースの負荷分散アプライアンスなど、標準的な負荷分散手法を使用して負荷分散できます。

以降のセクションでは、さまざまなシステム提供のバインディングを使用して構築された WCF アプリケーションの負荷分散に関する考慮事項について説明します。

基本的な HTTP バインディングを使用した負荷分散

負荷分散の観点から、 BasicHttpBinding を使用して通信する WCF アプリケーションは、他の一般的な種類の HTTP ネットワーク トラフィック (静的 HTML コンテンツ、ASP.NET ページ、または ASMX Web サービス) と同じではありません。 このバインディングを使用する WCF チャネルは本質的にステートレスであり、チャネルが閉じると接続が終了します。 そのため、 BasicHttpBinding は既存の HTTP 負荷分散手法で適切に機能します。

既定では、 BasicHttpBinding は、 Keep-Alive 値を持つメッセージに接続 HTTP ヘッダーを送信します。これにより、クライアントはそれらをサポートするサービスへの永続的な接続を確立できます。 この構成では、以前に確立された接続を再利用して同じサーバーに後続のメッセージを送信できるため、スループットが向上します。 ただし、接続を再利用すると、クライアントが負荷分散ファーム内の特定のサーバーに厳密に関連付けられる可能性があるため、ラウンド ロビン負荷分散の有効性が低下します。 この動作が望ましくない場合は、Keep-Aliveまたはユーザー定義のKeepAliveEnabledCustomBinding プロパティを使用して、サーバーで HTTP Bindingを無効にすることができます。 次の例は、構成を使用してこれを行う方法を示しています。

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

.NET Framework 4 で導入された簡略化された構成を使用すると、次の簡略化された構成を使用して同じ動作を実現できます。

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

既定のエンドポイント、バインディング、および動作の詳細については、「WCF サービスの 簡略化された構成簡略化された構成」を参照してください。

WSHttp バインディングと WSDualHttp バインディングを使用した負荷分散

既定のバインド構成に対していくつかの変更が加えられた場合、HTTP 負荷分散手法を使用して、 WSHttpBindingWSDualHttpBinding の両方を負荷分散できます。

  • セキュリティ コンテキストの確立を無効にするか、ステートフル セキュリティ セッションを使用します。 セキュリティ コンテキストの確立は、EstablishSecurityContextWSHttpBinding プロパティを false に設定することで無効にすることができます。 WSDualHttpBindingを使用している場合、またはセキュリティ セッションが必要な場合は、「セキュリティで保護されたセッション」の説明に従ってステートフル セキュリティ セッションを使用できます。 ステートフル セキュリティ セッションを使用すると、セキュリティ セッションのすべての状態が保護セキュリティ トークンの一部として各要求と共に送信されるため、サービスはステートレスなままになります。 ステートフル セキュリティ セッションを有効にするには、 CustomBinding またはユーザー定義の Bindingを使用する必要があります。これは、必要な構成設定がシステム提供の WSHttpBinding および WSDualHttpBindingで公開されないためです。

  • セキュリティ コンテキストの確立を無効にする場合は、サービス資格情報ネゴシエーションもオフにする必要があります。 オフにするには、NegotiateServiceCredentialWSHttpBinding プロパティを false に設定します。 サービス資格情報ネゴシエーションを無効にするには、クライアントでエンドポイント ID を明示的に指定することが必要な場合があります。

  • 信頼できるセッションは使用しないでください。 この機能は既定では無効です。

Net.TCP バインディングの負荷分散

NetTcpBindingは、IP 層負荷分散手法を使用して負荷分散できます。 ただし、 NetTcpBinding は既定で TCP 接続をプールし、接続の待機時間を短縮します。 これは、負荷分散の基本的なメカニズムを妨げる最適化です。 NetTcpBindingを最適化するためのプライマリ構成値は、接続プール設定の一部であるリース タイムアウトです。 接続プールにより、クライアント接続がファーム内の特定のサーバーに関連付けられます。 これらの接続の有効期間が長くなるにつれて (リース タイムアウト設定によって制御される要因)、ファーム内のさまざまなサーバー間の負荷分散が不均衡になります。 その結果、平均通話時間が長くなります。 そのため、負荷分散シナリオで NetTcpBinding を使用する場合は、バインディングで使用される既定のリース タイムアウトを減らすことを検討してください。 最適な値はアプリケーションに依存しますが、負荷分散シナリオでは、30 秒のリース タイムアウトが妥当な開始点です。 チャネルのリース タイムアウトとその他のトランスポート クォータの詳細については、「 トランスポート クォータ」を参照してください。

負荷分散シナリオで最適なパフォーマンスを得る場合は、 NetTcpSecurity ( Transport または TransportWithMessageCredential) の使用を検討してください。

こちらも参照ください