TIL

redis 남아있는 죽은 socket.id 정리하기.

하얀잔디 2025. 11. 24. 21:26

 

 

소켓 서버 운영하다 보면 Redis에 저장된 socket.id랑
실제 소켓 서버가 가진 socket.id가 불일치하는 경우 종종 생김.


브라우저 강제 종료, 네트워크 끊김, 모바일 전환 등에서 흔하게 발생함.

 

이럴 때 무조건 Redis 전체를 정리하는 방식은 비효율적임.
그래서 발견되는 순간에만 제거하는 lazy-clean 방식 적용함.

 

 

🔍 정리 조건

 

 

Redis에 저장된 sid가 실제 소켓 서버에 없으면 정리함.

 

if (!io.sockets.sockets.has(sid)) {
    client.srem(`${tenant}:${user}:socket`, sid)
}
 

🔧 장점

  • 쓸데없는 전체 스캔 없음
  • 정상 동작 중인 유저에게 부담 없음
  • 자연스럽게 “좀비 socket.id”만 제거됨
  • Redis와 socket 서버 사이의 정합성 점진적으로 맞춰짐

 

📌 요약

소켓 저장 로직 자체는 유지하지만,
정리 작업은 “이 sid가 진짜 존재하나?” 체크했을 때만 수행함.
과도한 Redis 정리 없이 정확도는 유지되는 안정적인 방식임.