우리 시스템은 초당 수만 명에서 최대 10만 명 이상의 대기자를 수용해야 합니다. 이때 가장 큰 위협은 **'좀비 유저(Zombie User)'**입니다. 브라우저를 닫거나 네트워크가 끊긴 유저가 대기열에 계속 남아있다면 다음과 같은 치명적인 문제가 발생합니다.
우리의 목표: "최소한의 자원(Redis CPU/Memory)으로 최대한 빠르게 이탈자를 찾아내고 제거한다."
유저가 나갔다는 것을 서버가 즉시 알 방법은 없습니다. 따라서 유저가 주기적으로 "나 여기 살아있어요"라고 신호를 보내는 하트비트(Heartbeat) 방식은 필수적입니다.
10만 명이 1초마다 Redis에 ZADD를 날리면 100,000 TPS입니다. 이는 Redis 단일 노드에 큰 부담을 줍니다.
두 가지 선택지가 있습니다.
lease:userId 키를 만들고 30초 TTL을 건다. Redis가 알아서 지워주니 편하지 않을까?EXISTS 명령어로 키가 살아있는지 확인해야 합니다. 100명을 뽑으려면 100번의 네트워크 왕복이 생깁니다.{유저ID: 마지막시간}을 몰아넣고 관리하면 어떨까?ZREMRANGEBYSCORE라는 강력한 명령어 한 줄로 **"지금 시각보다 30초 이전인 애들 싹 지워줘"**가 가능합니다. 수천 명을 단 1ms 만에 지울 수 있습니다.