문제

image.png

좌석 선택 페이지에 입장할 수 있는 유저 수에 제한을 두고자, 대기 큐를 도입했다.

늦게 온 유저는 대기 큐에서, 좌석 선택 페이지의 인원이 빠지기를 기다리게 된다.

근데 여기서 문제가 발생했다.

좌석 선택 페이지에 들어와있다고 생각한 인원 수와, 실제 인원 수가 자꾸 일치하지 않았다.

이 때문에 대기 큐에 있는 유저는 더 오랜 시간을 기다리게 됐다.

최악의 경우에는 무한 대기 현상까지도 발생하곤 했다.

해결

image.png

이를 해결하고자 문제의 원인을 다음과 같이 분석했다.

본인의 번호표 순서가 지나 입장해야 하는 클라이언트가, 좌석 현황 SSE에 연결을 맺지 않고 어딘가로 떠났다면, 서버는 이를 추적할 수가 없는 상황이었다.

이렇게 기존 Waiting 상태와 Selecting 상태는 “클라이언트가 이상행동을 했을 수 있다” 라는 변수를 내포하고 있었다. 때문에 각 상태를 100% 신뢰할 수 없었다.

결국 문제의 핵심은, 대기 큐에 있는 상태(Waiting)와, 입장한 상태(Selecting) 간에, 상태 이동 조건이 불명확하다는 것이었다.

image.png

이를 해결하기 위해, 기존 Waiting 상태와 Selecting 상태가 가지고 있던 변수를 떼어내 한 곳에 몰아 담기 위한 Entering 상태를 도입했다.

세 상태의 상태 이동 조건을 보다 명확히 만들고 연결함으로써, Waiting 상태와 Selecting 상태는 100% 신뢰할 수 있는 판단 조건을 갖게 되었다.

그리고 나머지 모든 변수는 Entering 상태가 책임지게 되었다.