공부

(작성 중) 대기열 시스템 구현

늦깎이_개발자 2024. 4. 4. 18:39
반응형
예제에 대한 전체 코드는 https://github.com/minseokLim/practice/tree/main/queue-practice 에서 확인할 수 있다.

 

1. 서론

필자가 이전 회사에 재직 중일 때, 회사에선 가끔 숙박세일페스타나 BTS 프로모션과 같은 이벤트를 했다. 선착순 이벤트였기 때문에 이벤트가 시작되는 오전 10시에는 트래픽이 폭발했다. 당연히 미리 서버 스케일 아웃을 충분히 해놓은 상태였지만, 가끔은 예상했던 것보다 훨씬 많은 트래픽이 몰리면서 서버가 터지는(?) 상황이 발생했다. 이러한 상황에서 앞단에 대기열 시스템이 있었다면 어땠을까라는 생각을 했다. 제한된 수의 클라이언트만 이벤트 페이지에 접속하는 것을 가능하게 만듦으로써 트래픽을 제어했다면, 서버가 터지는 상황은 발생하지 않았을 것이다.

앞으로 소개할 방법은 필자가 혼자 고민하고 개발해본 것이다. 실무에서 테스트해본 적은 없기 때문에 운영 상황에 적합하지 않을 수 있다. 다른 개발자들과 이 상황에 대해 고민하며, 라이브 환경에 대기열 시스템을 적용해볼 수 있는 날이 오길 기대해본다.

 

2. 설계

요구사항

* 대기열 시스템을 구현한다.
  * 특정 페이지로의 접속자 수는 제한된다.
    * 제한된 수의 클라이언트들은 서버로부터 토큰을 발급받아 특정 페이지로 접속하게 된다.
    * 사용자가 화면을 닫거나 특정 기능을 완료하여 다른 페이지로 넘어가게 되면 해당 토큰은 삭제된다. 
    * 다른 사용자의 토큰이 삭제되어 접속자 수가 제한된 수 미만으로 떨어지면 대기열에 있던 다른 클라이언트가 토큰을 발급받아 페이지에 접속할 수 있게 된다.
  * 대기열에는 여러 클라이언트가 대기할 수 있다.
    * 대기열에 있는 클라이언트들은 서버로부터 토큰을 발급받아 페이지에 접속할 수 있게 된다.
    * 대기열에 있는 클라이언트들은 자신의 앞으로 몇 명의 대기자가 있는지를 5초 간격으로 확인할 수 있다.

 

레디스의 Sorted set 사용

Redis의 Sorted set에 대한 자세한 내용은 https://redis.io/docs/data-types/sorted-sets 에서 확인할 수 있다.

UUID로 unique하게 생성된 token에 대해 현재 시간에 해당하는 timestamp를 score로 설정함으로써 순서대로 들어오는 클라이언트에 대한 대기열을 구현하였다.

 

 

반응형