다음을 통해 공유


부하 분산

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

다음 단원에서는 여러 가지 시스템 제공 바인딩을 사용하여 부하 분산 WCF 애플리케이션을 빌드할 때의 고려 사항에 대해 설명합니다.

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

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

기본적으로 BasicHttpBindingKeep-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을 모두 부하 분산할 수 있습니다.

  • 보안 컨텍스트 설정을 끄거나 상태 저장 보안 세션을 사용합니다. 보안 컨텍스트 설정은 WSHttpBindingEstablishSecurityContext 속성을 false로 설정하여 끌 수 있습니다. WSDualHttpBinding을 사용하거나 보안 세션이 필요한 경우 보안 세션에 설명된 대로 상태 저장 보안 세션을 사용할 수 있습니다. 상태 저장 보안 세션을 사용하면 보안 세션을 각 요청과 함께 보호 보안 토큰의 일부로 전송할 때 서비스의 상태를 비저장 상태로 유지할 수 있습니다. 상태 저장 보안 세션을 사용하려면 CustomBinding 또는 사용자 정의 Binding을 사용해야 합니다. 필요한 구성 설정이 시스템에서 제공하는 WSHttpBindingWSDualHttpBinding에 노출되지 않기 때문입니다.

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

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

Net.TCP 바인딩을 사용한 부하 분산

NetTcpBinding은 IP 계층 부하 분산 기술을 사용하여 부하 분산될 수 있습니다. 하지만 NetTcpBinding은 연결 대기 시간을 줄이기 위해 기본적으로 TCP 연결을 풀링합니다. 이러한 최적화 작업은 기본 부하 분산 메커니즘과 충돌하게 됩니다. NetTcpBinding을 최적화하기 위한 기본 구성 값은 연결 풀 설정의 일부인 대여 시간 제한입니다. 연결을 풀링하면 클라이언트 연결이 팜 내의 특정 서버와 이루어지게 됩니다. 이러한 연결 수명은 대여 시간 제한 설정으로 제어할 수 있지만 수명이 늘어나면 팜 내 여러 서버 간에 부하 분산 균형이 맞지 않게 됩니다. 결과적으로 평균 호출 시간이 늘어납니다. 따라서 NetTcpBinding을 부하 분산 시나리오에 사용할 때는 이 바인딩에서 사용하는 기본 대여 시간 제한을 줄이는 것이 좋습니다. 애플리케이션에 따라 최적 값이 다르겠지만 부하 분산 시나리오에 적절한 대여 시간 제한은 30초부터입니다. 채널 임대 시간 제한 및 기타 전송 할당량에 대한 자세한 내용은 전송 할당량을 참조하세요.

부하 분산 시나리오에서 성능을 최대화하려면 NetTcpSecurity(Transport 또는 TransportWithMessageCredential)를 사용하는 것이 좋습니다.

참고 항목