티켓팅 시뮬레이션에 가상 유저를 만들면 서버 입장에서 가상 유저와 실제 유저를 구분하여 처리를 해야한다.
따라서, 가상 유저와 실제 유저를 구별할 수 있는 표식이 필요하다.
생각 정리
- 실제 유저는 폴링을 하고, 가상 유저는 하지 않는다. (서버 부하 최소화를 위함)
- 가상 유저는 애초에 이탈할 일이 없다 → 하트비트 큐에 넣을 필요가 없다
- 하트비트 큐에 존재 여부에 따라 판별할 수 있다
- 그렇다면, 하트비트 큐가 필수가 됨 (현재는 토글링 가능한 상태의 기능임)
- 활성 큐에서는 어떻게 판별할 것인가?
- 현재
REDIS_KEY_PREFIXES.ACTIVE_USER(queue:active:user:{userId}) 키는 사실 크게 비교가 없음. 활성 큐에 특정 유저 존재 여부 판단은 ZSCORE를 써도 충분하기 때문
- 그렇다면 이 키를 활용하여 이 유저가
REAL인지 VIRTUAL 인지 판단하는 것이 좋을 것으로 판단됨
- 그 이후, 활성 큐를 매번 순회하면서 가상 유저가 있는 지 판단하고, 그 때마다 랜덤 예매 처리를 해야하는가?
- 매번 순회를 돌면 비효율적임
- 아예 대기 큐 → 활성 큐 이동한 유저가 가상 유저인 경우, Redis List나 Stream에다가 그 가상 유저를 저장해놓고, 꺼내서 예약을 처리하는 방식이 합리적
- 매우 높은 신뢰성이 필요한 것이 아니면 Redis List도 괜찮음
member를 {userId}{구분자}{R|V(실제,가상여부)} 로 구성
- pub/sub하는 경우는 즉시 처리해야하고.. (미세 조정(딜레이 등)이 상대적으로 어렵다)
→ pub/sub으로 받고 어디에 쌓아두면 ? → 2번이랑 달라질게없고..
→ Stream
- 지금 경우는 가상 유저 활성 큐에 넣어놓고, 워커가 돌면서 하나씩 처리