[개발지식] 대용량 트래픽 처리(동시성제어) 관련 추가 방안2 - 대기열(네이버 D2 블로그)

Hyo Kyun Lee·2024년 12월 7일
0

개발지식

목록 보기
62/66

1. 개요

일전에 대용량 트래픽 처리 관련해서 네이버 블로그에 좋은 개념 정리 글이 있어 읽어보았는데, 다른 방안을 찾다가 동일하게 좋은 내용이 있어서 추가 기록하게 되었다.

이전의 방법은 아키텍칭, 하드웨어적인 제어가 많았지만 본 글의 경우 SW적인 제어이므로 향후 업무확장에 좋은 관점이 될 수 있을 것으로 생각하였다.

2. 유의사항

네이버에서 대기열 시스템을 설계할때는 기회비용을 고려하였다. 내가 만약 대용량 트래픽 제어를 위한 설계를 진행한다고 했다면 대기사용자에 대한 번호 부여 뿐 만 아니라, 대기열 시스템 자체의 관리(대기 번호 부여 후 동작, 시퀀스처럼 누락 번호에 대한 고려 등)를 생각하였을 것이다.

대부분의 부하가 주문서의 최초 화면을 불러올 때 발생하므로, 주문서 화면 진입 이후 구매자의 퇴장까지 관리하는 것은 효율적이지 않습니다.

이처럼 네이버는 트래픽이 몰리는 그 부분만 관리하도록 하였고, 나머지는 관리 대상에 포함하지 않았다. 오히려 비효율적이라 생각하였다.

대용량 트래픽 부터 대기, 조회, 주문처리까지 상세한 과정을 알아야하겠지만, 일단 네이버는 최초 주문 시스템 접속을 할 시점에서 트래픽을 제어한다면 그 이후의 유일값 등은 자연스럽게 해결될 문제라 생각한 것 같다.

각설하고 여기서 중요한 점은 문제상황에 집중한다는 것이고, 그 이외의 상황에 대한 접근은 비효율적이라 생각하였다는 점이다.

3-1. ASIS

기존 대용량 트래픽이 있을 경우 네이버는 하기와 같이 처리하였다.

  • 비정상적인 요청이 있을 경우 거부
  • 특정 조건 발생 시 주문 못하도록 validate 처리
  • 대기열에서 대기하는 사용자들이(client) 주기적인 요청을 보내고(polling), 이 요청에 따라 개별의 대기열 서버가 응답을 진행한다.

별도의 대기열 서버는 사용자 수가 많아진다면 그만큼 부하가 늘어날 것이고, 대기열 서버 운용 자체도 비효율적이다.

3-2. TOBE

사용자와 대기열 서버 사이에 Socket.IO 서버를 둔다.

  • 사용자는 대기열 서버로부터 응답을 직접 받지 않고, Socket.IO를 통해 응답을 전달 받는다.
  • 통신 자원이 부족하다면 별도의 서버 작업없이, Socket.IO의 클러스터만 확장하여 관리하면 된다.

4. 대기표 관리 방식

대기표 관리 방식, 나아가 대기 사용자에 대한 순번 등 대기 정보 관리 방식은 관리하지 않고 저장만 한다는 점이 핵심이다.

  • 기본적으로 한꺼번에 많은 트래픽이 온다면, 해당 트래픽 전체에 대한 그룹화를 하여 전체 대기표를 생성하고 만든다.
  • 다만 대기표를 생성 후 정렬까지 한다면 정렬에 대한 비용이 증가하고, 이에 따라 처리속도가 저하되므로 성능과 확장성 면에서 비효율적이다.
  • 따라서 대기표는 단일한 값 그 자체로만 저장하고, 대기번호를 부여하는 기능만 작동할 수 있도록 한다.

판매자 대기 방식을 보면, 대기열 순번은 갱신되고 이에 따라 대기열 처리 작업에 순차적으로 지원한다는 부분이 있는데 한 순간의 트래픽이 아닌 트래픽의 유동성에 따라 유연하게 대응할 수 있어야 하는 것도 고려사항인 것 처럼 보였다.

5. 참고자료

HTTP Polling - https://innu3368.tistory.com/212
대용량 트래픽 제어 - https://d2.naver.com/helloworld/6480558

0개의 댓글