좌석 선택 페이지에 입장할 수 있는 유저 수에 제한을 두고자, 대기 큐를 도입했다.
늦게 온 유저는 대기 큐에서, 좌석 선택 페이지의 인원이 빠지기를 기다리게 된다.
근데 여기서 문제가 발생했다.
좌석 선택 페이지에 들어와있다고 생각한 인원 수
와, 실제 인원 수
가 자꾸 일치하지 않았다.
이 때문에 대기 큐에 있는 유저는 더 오랜 시간을 기다리게 됐다.
최악의 경우에는 무한 대기 현상까지도 발생하곤 했다.
이를 해결하고자 문제의 원인을 다음과 같이 분석했다.
본인의 번호표 순서가 지나 입장해야 하는 클라이언트
가, 좌석 현황 SSE
에 연결을 맺지 않고 어딘가로 떠났다면, 서버는 이를 추적할 수가 없는 상황이었다.
이렇게 기존 Waiting
상태와 Selecting
상태는 “클라이언트가 이상행동을 했을 수 있다” 라는 변수를 내포하고 있었다. 때문에 각 상태를 100% 신뢰할 수 없었다.
결국 문제의 핵심은, 대기 큐에 있는 상태(Waiting)
와, 입장한 상태(Selecting)
간에, 상태 이동 조건이 불명확하다는 것이었다.
이를 해결하기 위해, 기존 Waiting
상태와 Selecting
상태가 가지고 있던 변수를 떼어내 한 곳에 몰아 담기 위한 Entering
상태를 도입했다.
세 상태의 상태 이동 조건을 보다 명확히 만들고 연결함으로써, Waiting
상태와 Selecting
상태는 100% 신뢰할 수 있는 판단 조건을 갖게 되었다.
그리고 나머지 모든 변수는 Entering
상태가 책임지게 되었다.
Waiting
이탈 조건: 유저가 가진 번호표 순서가 지남Selecting
진입 조건: Waiting
상태에서 이탈함