Skip to content

[refactor][queue-service] Sorted Set orphan 멤버 정리 전략 구현 #10

@coderabbitai

Description

@coderabbitai

📌 개요

Hash 와 역인덱스는 30분 TTL 로 자동 정리되지만, Sorted Set 의 멤버는 키 단위 TTL 불가하여 orphan 으로 남는다. 명시적 delete() 호출 없이 사용자가 inactivity 로 떠난 경우 (브라우저 닫기, 30분 무동작 등) 발생한다.

이로 인해 findRank() 가 orphan 포함한 잘못된 순번을 반환하고, findAdmissionCandidates() 도 앞 batchSize 가 orphan 일 시 살아있는 토큰을 놓치는 문제가 있다.

🎯 목표

  • 자동 만료 시 Sorted Set orphan 정리
  • findRank, findAdmissionCandidates 의 정확성 보장
  • 운영 시 사용자에게 정확한 정보 표시

🧩 리팩토링 범위

  • 클래스 / 패키지 구조 개선 (스케줄러 신설 가능)
  • 메서드 분리 / 네이밍 개선
  • 중복 로직 제거
  • 트랜잭션 / 예외 처리 정리

🏗️ 변경 설계

변경 전 구조

  • Hash, 역인덱스: TTL 자동 만료 ✅
  • Sorted Set 멤버: TTL 불가 → orphan 잔재 ❌
  • findRank, findAdmissionCandidates 가 orphan 영향 받음

변경 후 구조 — 해결 방안 후보

방식 장점 단점
스케줄러 정기 정리 구현 단순, 일괄 ZREM 정리 주기 동안 orphan 잔류, 클러스터 환경 중복 실행 방지 필요
Lua lazy cleanup 조회 시점 즉시 정리, 별도 인프라 불필요 조회 지연 증가, findRank·findAdmissionCandidates 복잡도 상승
Keyspace Notification 만료 즉시 ZREM 가능 Redis 설정 변경(notify-keyspace-events) 필요, 알림 유실 가능(at-most-once)

스케줄러 + Lua lazy cleanup 조합도 고려 가능 (스케줄러로 주기 정리, lazy cleanup으로 즉각 보정)

영향 받는 기능

  • findRank(): orphan 멤버를 포함한 잘못된 순번 반환
  • findAdmissionCandidates(): 앞 batchSize개가 orphan일 경우 살아있는 토큰 누락
  • 신규 스케줄러 컴포넌트 추가 가능

⚠️ 주의 사항

  • 기능 동작은 기존과 동일 (정확성만 ↑)
  • API 스펙 변경 없음
  • 클러스터 환경 도입 시 스케줄러 중복 실행 방지 (분산 락 또는 단일 인스턴스 지정)

🧪 검증 방법

  • 기존 테스트 통과 여부 확인
  • orphan 시나리오 통합 테스트 추가 (TTL 만료 후 findRank 검증)
  • 정리 주기 후 Sorted Set 크기 검증

Metadata

Metadata

Assignees

Labels

No fields configured for Feature.

Projects

Status

Todo

Relationships

None yet

Development

No branches or pull requests

Issue actions