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