6장. 서비스 퍼포먼스 패턴

이 장에서는 서비스 퍼포먼스를 보장하는 패턴에 대해 설명한다. 클라이언트 접속이 높아지면 서비스 부하가 증가하는 것을 당연시 생각한다. 하지만 콘텐츠 접근비율은 읽기보다 쓰기가 압도적으로 높다. 콘텐츠의 소비형태를 파악하면 백엔드 부하를 획기적으로 절감할 수 있다.

고정부하

해결하고 싶은 문제

순간적으로 접속자가 폭증할 경우 원본 장애가 빈번하다. 랭킹, 검색, 핫딜, 항공권 등 특정 시간에 오픈되는 서비스에 이런 경우가 많다.

솔루션/패턴 설명

순간적으로 발생한 동일한 요청에 대해 최초의 결과를 공유한다. TTL(Time To Live)을 0으로 설정하면 원본서버의 1트랜잭션 시간동안(1ms 내외)만 결과는 유효하다.

../_images/dgm017.png

M2 는 최초의 요청만 원본서버로 보낸다. 응답은 대기 중인 모든 클라이언트에게 공유됨과 동시에 만료된다. (=유효하지 않다.) 이 과정의 반복을 통해 접속자 수와 무관하게 원본부하를 고정시킨다.

구현

  • 웹서버 앞에 M2 를 배치한다. (=HTTP 통신이 가능하다.)

  • 모든 콘텐츠를 캐싱하고 TTL을 0으로 설정한다.

    # server.xml - <Server><VHostDefault><Options>
    # vhosts.xml - <Vhosts><Vhost><Options>
    
    <TTL>
       <Res2xx Ratio="20" Max="0">0</Res2xx>
       <NoCache Ratio="0" Max="0" MaxAge="0">0</NoCache>
       <Res3xx>0</Res3xx>
       <Res4xx>0</Res4xx>
       <Res5xx>0</Res5xx>
    </TTL>
    

장점/효과

  • 백엔드 부하를 고정/예측할 수 있어 서비스 안정성이 높아진다.

주의점

  • 읽기에는 적합하나 쓰기에는 사용할 수 없다.
  • 휘발성이 높은 콘텐츠에 대해서는 Memory-Only 모드 를 권장한다.

기타

로그인한 개인 페이지라도 공유할 수 있는 영역에 대해서는 AJAX 로 분리하는 것이 효과적이다.

프록시 서버

해결하고 싶은 문제

사업장 외부에 존재하는 대용량 파일에 대한 접근이 특정 시간에 집중된다. 급격한 전송속도 저하로 업무에 차질이 발생한다.

솔루션/패턴 설명

사업장 내부에 존재하는 Local DNS 를 이용해 대용량 트래픽을 발생시키는 도메인을 M2 로 위임한다.

../_images/dgm025.png

사업장 내부 클라이언트는 특정 도메인에 대하여 M2 로부터 대용량 파일을 다운로드 받는다.

주석

위 그림에서는 bar.comLocal DNS 가 리졸빙 해주는 것처럼 표현됐지만 DNS forwarding으로 동작한다. DNS 구성/운영 및 포워딩은 이 문서의 범위를 벗어난다.

구현

  • 서비스할 도메인의 가상호스트를 생성한다.

  • 모든 요청을 바이패스하도록 설정한다.

    # server.xml - <Server><VHostDefault><Options>
    # vhosts.xml - <Vhosts><Vhost><Options>
    
    <BypassPostRequest>ON</BypassPostRequest>
    <BypassGetRequest>ON</BypassGetRequest>
    
  • access.log 를 분석해 용량순으로 캐싱대상을 찾는다.

    # /svc/www.example.com/bypass.txt
    
    /bigfile.exe, cache
    /patch*.zip, cache
    

장점/효과

  • 외부 네트워크 대역폭 증설없이 빠른 전송속도를 제공한다.

주의점

  • HTTPS 통신이라면 원본서버의 인증서를 설치하거나, 비공인/Self-Siegned 인증서 환경을 구성해야 한다.
  • 개인화된 파일을 캐싱해서는 안된다.

기타

접근 빈도보다는 용량 기준으로 캐싱대상을 산정하는 것을 권장한다.