다음을 통해 공유


부하 분산

WCF(Windows Communication Foundation) 애플리케이션의 용량을 늘리는 한 가지 방법은 부하가 분산된 서버 팜에 배포하여 규모를 확장하는 것입니다. WCF 애플리케이션은 Windows 네트워크 부하 분산과 같은 소프트웨어 부하 분산 장치뿐만 아니라 하드웨어 기반 부하 분산 어플라이언스를 비롯한 표준 부하 분산 기술을 사용하여 부하를 분산할 수 있습니다.

다음 섹션에서는 다양한 시스템 제공 바인딩을 사용하여 빌드된 WCF 애플리케이션 부하 분산에 대한 고려 사항을 설명합니다.

기본 HTTP 바인딩을 사용한 부하 분산

부하 분산의 관점에서 볼 때 이를 사용하여 BasicHttpBinding 통신하는 WCF 애플리케이션은 다른 일반적인 유형의 HTTP 네트워크 트래픽(정적 HTML 콘텐츠, ASP.NET 페이지 또는 ASMX 웹 서비스)과 다르지 않습니다. 이 바인딩을 사용하는 WCF 채널은 기본적으로 상태 비저장이며 채널이 닫히면 연결을 종료합니다. 따라서 BasicHttpBinding 기존 HTTP 부하 분산 기술과 잘 작동합니다.

기본적으로 BasicHttpBindingKeep-Alive 값을 포함한 메시지에 연결 HTTP 헤더를 보내, 이를 지원하는 서비스에 클라이언트가 영구 연결을 설정할 수 있도록 합니다. 이 구성은 이전에 설정된 연결을 다시 사용하여 후속 메시지를 동일한 서버로 보낼 수 있으므로 향상된 처리량을 제공합니다. 그러나 연결을 다시 사용하면 클라이언트가 부하 분산 팜 내의 특정 서버에 강력하게 연결되어 라운드 로빈 부하 분산의 효율성을 줄일 수 있습니다. 이 동작이 바람직하지 않은 경우 서버에서 Keep-Alive 또는 사용자 정의 KeepAliveEnabled 속성을 사용하여 CustomBinding의 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 바인딩을 사용한 부하 분산

기본 바인딩 구성을 몇 가지 수정하면 WSHttpBindingWSDualHttpBinding 모두 HTTP 부하 분산 기술을 사용하여 부하를 조절할 수 있습니다.

  • 보안 컨텍스트 설정을 끄거나 상태 저장 보안 세션을 사용하십시오. EstablishSecurityContext 속성을 WSHttpBinding에 설정하여 보안 컨텍스트 수립을 false 중지할 수 있습니다. 사용 WSDualHttpBinding 중이거나 보안 세션이 필요한 경우 보안 세션에 설명된 대로 상태 저장 보안 세션을 사용할 수 있습니다. 상태 저장 보안 세션을 사용하면 보안 세션에 대한 모든 상태가 각 요청과 함께 보호 보안 토큰의 일부로 전송되므로 서비스가 상태 비주류 상태로 유지됩니다. 상태 저장 보안 세션을 활성화하려면 시스템에서 제공하는 CustomBindingBinding에는 필요한 구성 설정이 노출되지 않으므로 WSHttpBinding 또는 사용자 정의 WSDualHttpBinding을 사용해야 합니다.

  • 보안 컨텍스트 설정을 해제하는 경우 서비스 자격 증명 협상도 해제해야 합니다. 끄려면 NegotiateServiceCredentialWSHttpBinding 속성을 false로 설정하십시오. 서비스 자격 증명 협상을 사용하지 않도록 설정하려면 클라이언트에서 엔드포인트 ID를 명시적으로 지정해야 할 수 있습니다.

  • 신뢰할 수 있는 세션을 사용하지 마세요. 이 기능은 기본적으로 해제되어 있습니다.

Net.TCP 바인딩의 부하 분산

NetTcpBinding IP 계층 부하 분산 기술을 사용하여 부하를 분산할 수 있습니다. 그러나 기본적으로 NetTcpBinding 풀이 TCP 연결을 공유하여 연결 대기 시간을 줄입니다. 이는 부하 분산의 기본 메커니즘을 방해하는 최적화입니다. 최적의 NetTcpBinding 구성을 위한 주요 값은 커넥션 풀 설정의 일부인 리스 타임아웃입니다. 연결 풀링을 사용하면 클라이언트 연결이 팜 내의 특정 서버에 연결됩니다. 이러한 연결의 수명이 증가함에 따라(임대 시간 제한 설정에 의해 제어되는 요소) 팜의 다양한 서버에 대한 부하 분산이 불균형하게 됩니다. 결과적으로 평균 호출 시간이 증가합니다. 따라서 부하 분산 시나리오를 NetTcpBinding 사용하는 경우 바인딩에서 사용하는 기본 임대 시간 제한을 줄이는 것이 좋습니다. 최적 값은 애플리케이션에 따라 다르지만 30초 임대 시간 제한은 부하 분산 시나리오에 적합한 시작점입니다. 채널 임대 시간 제한 및 기타 전송 할당량에 대한 자세한 내용은 전송 할당량을 참조하세요.

부하 분산 시나리오에서 최상의 성능을 얻으려면 NetTcpSecurity을 고려해 보세요. (Transport 또는 TransportWithMessageCredential 중 하나를 사용하십시오.)

참고하십시오