6장. 서비스 퍼포먼스 패턴¶
이 장에서는 서비스 퍼포먼스를 보장하는 패턴에 대해 설명한다. 클라이언트 접속이 높아지면 서비스 부하가 증가하는 것을 당연시 생각한다. 하지만 콘텐츠 접근비율은 읽기보다 쓰기가 압도적으로 높다. 콘텐츠의 소비형태를 파악하면 백엔드 부하를 획기적으로 절감할 수 있다.
고정부하¶
해결하고 싶은 문제¶
순간적으로 접속자가 폭증할 경우 원본 장애가 빈번하다. 랭킹, 검색, 핫딜, 항공권 등 특정 시간에 오픈되는 서비스에 이런 경우가 많다.
솔루션/패턴 설명¶
순간적으로 발생한 동일한 요청에 대해 최초의 결과를 공유한다. TTL(Time To Live)을 0으로 설정하면 원본서버의 1트랜잭션 시간동안(1ms 내외)만 결과는 유효하다.
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
로 위임한다.
사업장 내부 클라이언트는 특정 도메인에 대하여 M2
로부터 대용량 파일을 다운로드 받는다.
주석
위 그림에서는 bar.com
을 Local 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 인증서 환경을 구성해야 한다.
- 개인화된 파일을 캐싱해서는 안된다.
기타¶
접근 빈도보다는 용량 기준으로 캐싱대상을 산정하는 것을 권장한다.