부하 분산
WCF(Windows Communication Foundation) 애플리케이션의 용량을 늘리는 한 가지 방법은 부하가 분산된 서버 팜에 배포하여 크기 조정하는 것입니다. WCF 애플리케이션에서는 Windows 네트워크 부하 분산과 같은 소프트웨어 부하 분산 장치와 하드웨어 기반의 부하 분산 장치 등 표준 부하 분산 기술을 사용하여 부하를 분산할 수 있습니다.
다음 단원에서는 여러 가지 시스템 제공 바인딩을 사용하여 부하 분산 WCF 애플리케이션을 빌드할 때의 고려 사항에 대해 설명합니다.
기본 HTTP 바인딩을 사용한 부하 분산
부하 분산 측면에서 볼 때, BasicHttpBinding을 사용하여 통신하는 WCF 애플리케이션은 정적 HTML 콘텐츠, ASP.NET 페이지 또는 ASMX 웹 서비스와 같은 다른 일반적인 형식의 HTTP 네트워크 트래픽과 다르지 않습니다. 이 바인딩을 사용하는 WCF 채널은 기본적으로 상태 비저장 채널이며 채널이 닫힐 때 연결을 종료합니다. 따라서 BasicHttpBinding은 기존의 HTTP 부하 분산 기술과 호환됩니다.
기본적으로 BasicHttpBinding은 Keep-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 바인딩을 사용한 부하 분산
기본 바인딩 구성을 일부 수정한다면, HTTP 부하 분산 기술을 사용하여 WSHttpBinding과 WSDualHttpBinding을 모두 부하 분산할 수 있습니다.
보안 컨텍스트 설정을 끄거나 상태 저장 보안 세션을 사용합니다. 보안 컨텍스트 설정은 WSHttpBinding의 EstablishSecurityContext 속성을
false
로 설정하여 끌 수 있습니다. WSDualHttpBinding을 사용하거나 보안 세션이 필요한 경우 보안 세션에 설명된 대로 상태 저장 보안 세션을 사용할 수 있습니다. 상태 저장 보안 세션을 사용하면 보안 세션을 각 요청과 함께 보호 보안 토큰의 일부로 전송할 때 서비스의 상태를 비저장 상태로 유지할 수 있습니다. 상태 저장 보안 세션을 사용하려면 CustomBinding 또는 사용자 정의 Binding을 사용해야 합니다. 필요한 구성 설정이 시스템에서 제공하는 WSHttpBinding 및 WSDualHttpBinding에 노출되지 않기 때문입니다.보안 컨텍스트 설정을 끄면 서비스 자격 증명 협상도 꺼야 합니다. 끄려면 WSHttpBinding의 NegotiateServiceCredential 속성을
false
로 설정합니다. 서비스 자격 증명 협상을 사용하지 않도록 설정하려면 클라이언트에서 엔드포인트 ID를 명시적으로 지정해야 할 수 있습니다.신뢰할 수 있는 세션은 사용하지 마십시오. 이 기능은 기본적으로 해제되어 있습니다.
Net.TCP 바인딩을 사용한 부하 분산
NetTcpBinding은 IP 계층 부하 분산 기술을 사용하여 부하 분산될 수 있습니다. 하지만 NetTcpBinding은 연결 대기 시간을 줄이기 위해 기본적으로 TCP 연결을 풀링합니다. 이러한 최적화 작업은 기본 부하 분산 메커니즘과 충돌하게 됩니다. NetTcpBinding을 최적화하기 위한 기본 구성 값은 연결 풀 설정의 일부인 대여 시간 제한입니다. 연결을 풀링하면 클라이언트 연결이 팜 내의 특정 서버와 이루어지게 됩니다. 이러한 연결 수명은 대여 시간 제한 설정으로 제어할 수 있지만 수명이 늘어나면 팜 내 여러 서버 간에 부하 분산 균형이 맞지 않게 됩니다. 결과적으로 평균 호출 시간이 늘어납니다. 따라서 NetTcpBinding을 부하 분산 시나리오에 사용할 때는 이 바인딩에서 사용하는 기본 대여 시간 제한을 줄이는 것이 좋습니다. 애플리케이션에 따라 최적 값이 다르겠지만 부하 분산 시나리오에 적절한 대여 시간 제한은 30초부터입니다. 채널 임대 시간 제한 및 기타 전송 할당량에 대한 자세한 내용은 전송 할당량을 참조하세요.
부하 분산 시나리오에서 성능을 최대화하려면 NetTcpSecurity(Transport 또는 TransportWithMessageCredential)를 사용하는 것이 좋습니다.