실시간 대기열 시스템 만들기 (1) - Ideation

최창효·2024년 8월 10일
0

이 글은 본격적인 구현에 앞서 대기열 시스템의 설계에 대해 고민한 내용을 작성한 글입니다.
정확한 자료를 찾아본 게 아니라 개인적인 생각과 판단을 적었기 때문에 부정확하거나 잘못된 내용이 포함되어 있을 수 있습니다.

대기열 시스템

대기열 시스템은 다양한 서비스에서 만나볼 수 있는 굉장히 익숙한 시스템 중 하나입니다.

서비스마다 다르겠지만 제가 대략적으로 생각한 대기열 시스템의 요구사항은 다음과 같습니다.

  • 트래픽이 적을 때는 대기열 화면 없이 곧바로 서비스를 이용할 수 있다
  • 트래픽이 몰렸을 때는 곧바로 서비스를 이용할 수 없으며 대기열 화면을 보여준다. 자신의 차례가 됐을 때 서비스를 이용할 수 있다
  • 대기열 화면에는 자신의 순번이 보이며 이 번호는 실시간 또는 일정 주기로 갱신된다

마음대로 생각해보기

실시간으로 대기열 번호가 줄어들려면 websocket으로 클라이언트-서버의 연결을 유지하고 있어야 할까?

  • 이렇게 되면 서버는 부하를 전혀 줄이지 못하는거 아닌가?
    • C10K와 같은 문제가 발생하지 않을까? 이를 방지하기 위해 앞단에 nginx서버를 두고 여기서 연결을 맺고 있는다?
  • 실시간을 포기하고 Polling방법을 이용하한다?
  • SSE를 이용한다?

일반적인 상황과 대기열 서비스가 필요한 상황을 어떻게 구분할 수 있을까?

  • 서버가 요청을 받은 뒤 자신의 상태를 판단한다?
    • 서버는 요청이 들어왔을 때마다 현재 동작 중인 스레드의 개수를 확인해 그 개수가 n개 미만이면 곧바로 요청을 처리, n개 이상이면 대기열 서비스를 사용하게 한다?
    • 이 방법 역시 서버는 부하를 전혀 줄이지 못하는거 아닌가?
  • 로드밸런서가 먼저 요청을 받고 서버의 부하를 판단해 부하가 높다면 대기열 서비스로, 부하 가 낮다면 메인 서비스로 요청을 보낸다?
  • 트래픽 여부와 관계 없이 항상 대기열 서비스를 이용하는 로직으로 처리한다?
    • 부하가 적을때 화면에 잠시동안 대기열 팝업이 노출되는 불편함이 있을 수 있지 않을까?

대기열 화면은 팝업으로 보여주는게 좋을까 아니면 새로운 화면이 좋을까?

  • 구현상 어떤 차이가 있을까?

클라이언트는 대기열 신청만 넣어두고 끝. 자신의 차례가 오면 서버에서 알려준다?

  • 현실에서의 방식과 가장 흡사한 형태다?

클라이언트에서 곧바로 큐에 접근할 수 있을까? 없다면 요청만 받는 별도의 서버가 필요할까?

profile
기록하고 정리하는 걸 좋아하는 백엔드 개발자입니다.

0개의 댓글