본문 바로가기

Software/C# (.NET Framework)

WCF Load Balancing

반응형

WCF(Windows Communication Foundation) 애플리케이션의 성능을 늘리는 방법 중 한 가지는, 로드 밸런싱 서버를  사용하여 배포하는 것입니다. WCF 애플리캐이션은 Windows Network Load Balancing과 같은 소프트웨어 방식과 하드웨어 기반의 로드벨런서에서 제공하는 표준 기술을 들을 활용하여  로드밸런싱을 할 수 있습니다.

다양한 방식의 바인딩을 사용하는 WCF 애플리케이션의 로드 밸런싱에 대한 고려 사항을 설명합니다.

BasicHttpBinding

BasicHttpBinding을 사용하여 통신하는 WCF 애플리케이션은 일반적인 HTTP 네트워크 트래픽과 다르지 않고, 로드밸런싱의 관점에서도 동일합니다. 이 바인딩을 사용하는 WCF 채널은 stateless 채널로서, 채널이 닫히면 연결이 종료 됩니다. 따라서, 기존의 HTTP 로드밸런싱 기술과 잘 작동합니다. 

기본적으로 BasicHttpBinding은 연결 헤더내 Keep-Alive로 메시지를 보내므로 클라이언트에서 이를 지원하는 서비스에 대해서 지속적인 연결을 설정할 수 있습니다. 이러한 구성은 이전에 구성된 연결을 다시 사용하여 동일한 서버로 후속 메시지를 보낼 수 있기 때문에 향상된 성능을 제공합니다. 그러나, 라운드 로빈 방식으로 구성된 로드 밸런서에서 연결을 재사용하는 상횡에서, 클라이언트가 특성 서버와 강하게 연결될 경우 효율성이 저하 될 수 있습니다.  이러한 효율성 저하를 개선하고자 하면, 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="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>

 

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

 

WSHttpBinding and WSDualHTTPBinding

두 방식 모두, 기본 바인딩의 몇 가지 설정을 수정하면 HTTP 로드 밸런싱 표준 기술을 사용하여 동작 시킬 수 있습니다. 

보안설정을 해제 하여 밸런싱을 동작 : EstablishSecurityContext - false (WSHttpBining)

다른 방법 : 보안 세션이 필요한 경우, CustomBinding  사용

 

TCPBinding

NetTcpBinding은 IP-layer 로드밸런싱 기술을 사용하여 동작시킬 수 있지만, 기본적으로 TCP 연결을 Pooling 하여 연결 지연 시간을 줄입니다. 이러한 방식은 로드밸런싱의 동작을 방해합니다. NetTcpBinding의 최적화를 위한 기본 구성은 Pool 리스 시간 설정입니다. 연결이 길어지면 서버들에 대한 로드 분산이 불균형 해집니다. 따라서, Pool 리스 시간을 줄이는 것이 좋습니다. 30초 리스 시간 설정은 로드 밸런싱 조건에서 적합한 설정입니다. 로드밸런싱을 사용할 경우 성능을 위해 NetTcpSecurity,  Transport, TransportWithMessageCredential을 사용하는 것이 좋습니다. 

reference : https://github.com/dotnet/docs/blob/main/docs/framework/wcf/load-balancing.md

 

GitHub - dotnet/docs: This repository contains .NET Documentation.

This repository contains .NET Documentation. Contribute to dotnet/docs development by creating an account on GitHub.

github.com

 

반응형