피드로 돌아가기
Dev.toBackend
원문 읽기
Redis 분산 락과 Idempotency를 통한 중복 배치 작업 완전 제거
Distributed Scheduled Job Locking with Redis
AI 요약
Context
단일 서버 환경에서 10대의 서버로 Scale-out 하며 동일한 Scheduled Job이 중복 실행되는 문제 발생. 이로 인해 Third-party API 호출 폭증과 데이터베이스 내 중복 레코드 생성이라는 리소스 낭비 및 데이터 정합성 결여 상황에 직면함.
Technical Solution
- Redis의 SET NX EX 옵션을 활용해 원자적(Atomic)인 분산 락 획득 구조 설계
- 락 획득 실패 시 즉시 작업을 종료하여 단일 서버만 실행되는 상호 배제(Mutual Exclusion) 보장
- Job 실행 시간 초과로 인한 락 만료 시 타 서버의 락을 오삭제하는 문제를 방지하고자 Random Token 기반의 소유권 검증 도입
- Token 검증과 삭제 과정을 Lua Script로 묶어 원자성을 확보함으로써 Race Condition 제거
- 락 메커니즘의 한계를 보완하기 위해 Database 쓰기 단계에서 Upsert 기반의 Idempotency를 적용하여 중복 실행 시에도 데이터 정합성 유지
실천 포인트
1. Redis SET NX EX를 통한 원자적 락 획득 및 TTL 설정을 통한 Deadlock 방지 적용 여부 확인
2. 락 해제 시 소유자 검증을 위한 고유 토큰 사용 및 Lua Script를 통한 원자적 삭제 구현 검토
3. 분산 락 실패 가능성을 염두에 둔 Database 수준의 Upsert 로직 및 Unique Key 제약 조건 설계