# 네이버 메인 페이지의 트래픽 처리

[https://d2.naver.com/helloworld/206816](https://d2.naver.com/helloworld/206816)

## 분산 처리 모델

1.  일반적인 3계층(3-Tier) 분산 처리 모델의 문제점

    ![3-Tier](https://d2.naver.com/content/images/2018/11/helloworld-201810-naver_main-03.png)

    * 클라이언트의 트래픽이 로드 밸런서를 통해 각 웹서버로 분산
    * WAS는 동일한 데이터베이스 참조
    * WAS에 문제 발생 시 웹서버가 다른 WAS를 찾도록 해야 함
    * 사용자가 로그인한 상태면 WAS에 세션 클러스터링 설정해야 함
    * 세션 클러스터링 설정을 위한 추가 작업 필요하고 관리 지점 증대
    * 데이터 동기화 등의 문제로 데이터 스토리지 레이어의 다중화는 특히 어려운 부분임
2.  네이버 메인페이지의 분산 처리 모델 요구사항

    ![네이버 분산 처리 모델](https://d2.naver.com/content/images/2018/11/-----.png)

    * 어떤 서버로 접속해도 동일한 내용 표시
    * 특정 상태(사용자의 로그인 여부)에 의존하지 않아야 함
    * 무중단 서비스
    * 트래픽 증가에 대해 탄력적인 대처 가능해야 함
3. 네이버 메인페이지의 분산 처리 모델의 구성요소
   * GCDN(Global CDN): 공통적으로 호출되는 리소스의 부하 분산을 위해 GCDN 활용. GCDN에서 지원되는 GSLB(Global Server LB) 기능은 접속 IP로부터 가장 가까운 CDN 서버를 자동 선정해 연결해줌.
   * SSI, APR(Apache Portable Runtime): 웹서버의 활용도를 높여 효율적인 서버 자원 사용.
   * Data Publisher: WAS와 통신 실패 시 웹서버에서 참조할 파일을 특정 주기에 따라 정상 응답 결과값을 웹서버에 미리 파일로 생성해 둔다.
   * NodeJs: 외부 시스템과 API 연동에 사용. 병렬 처리 시 스레드 문제 해결, 비동기식 외부 시스템 연동 시 병렬로 여러개의 요청을 한번에 처리 가능.
   * 서킷 브레이커(Netflix OSS Hystrix): 외부 서비스의 장애로 연쇄적 장애 전파를 막기 위해 외부 서비스와 연결을 차단 및 복구하는 역할. 오류 발생 횟수가 일정치에 도달하면 서킷을 오픈하여 미리 지정된 응답 반환하도록 구성.
   * 서비스 디스커버리: 동적으로 생성, 삭제되는 서버 인스턴스에 대한 IP 주소와 포트를 자동으로 찾아 설정할 수 있게 하는 기능.
4. 네이버 메인 페이지의 모니터링
   * Spring Boot Actuator의 MetricWriter로 성능 지표 수집
   * NPOT(사내시스템, Grafana기반)으로 네이버 메인 페이지의 상태를 모니터링
5. 네이버 메인 페이지의 비상 대응 체계
   * MEERCAT(사내시스템): 갑작스러운 트래픽 증가 시 방어하는 애플리케이션. 실시간 트래픽을 수집하고 그 양상을 예측한 다음 트래픽 폭증이 예측되는 경우 또는 기상청의 지진 발생 신호가 수신되는 경우 외부 시스템과 연결을 끊고 자체 서버로만 서비스를 제공.
