콘텐츠로 이동

2025 05 19

2025-05-19

RedisLock 재고 관리

참고: https://turtledev.tistory.com/71
참고: https://turtledev.tistory.com/72
참고: https://techblog.woowahan.com/17416/
참고: https://mangkyu.tistory.com/311
참고: https://velog.io/@rkdalstj4505/Redis-%EB%B6%84%EC%82%B0-%EB%9D%BDLettuce-Redisson

  • 해야할 것
    • Redis <-> DB 재고 동기화
    • Spring에서는 @PostConstructor와 같은 처리로 동기화 해둬야 함.
  • 동시성 문제 해결 - 분산락
    • 분산락: 락을 획득한 프로세스/스레드만이 임계 영역에 접근!
    • 레디스의 분산락은 RedLock
      • 레디스가 Replication Mode로 구축되어 있는 경우, 복제 비동기적으로 진행되어 경쟁상태 발생도 가능
    • RedLock: N개의 단일 레디스 노드들을 이용하여, Quorom 이상의 노드에서 잠금 획득시, 분산락을 획득한 것으로 판단
      1. 현재 시간 ms 단위로 가져옴
      2. 모든 인스턴스에서 순차잠금 획득하려 시도.
      3. 각 클라이언트는 전체 잠금 자동 해제 시간에 비해 작은 타임아웃을 가지고 잠금 획득.
        • 이로써 다운된 redis 노드와 통신을 위해 블로킹되는 것 방지
      4. 클라이언트는 잠금을 획득하기 위해 경과한 시간 계산
      5. 클라이언트가 과반이 넘는 인스턴스에서 잠금 획득했고, 경과시간이 잠금 유효시간보다 적다면 획득한 것으로 간주
      6. 클라이언트 실패시, 잠금 해제하려 시도
  • Redis 구현체 비교 - Lettuce
    • setnx 활용 스핀락
    • 지속적으로 락 획득 시도하기에, CPU 지속적으로 사용
      • 단점: CPU 사용량 Up, NW 트래픽 Up
  • Redis 구현체 비교 - Redisson
    • Redlock 알고리즘 지원
    • Pub/Sub 메커니즘을 통한 락 관리
    • 효율적 + 자원 소모 적은 방식으로 락 제어
    • publisher 메시지 발생, subscriber 특정 주제 구독 발행된 메시지 받음
      • 장점: 여러 redis 인스턴스에서 분산락 관리, redlock 알고리즘 쉽게 구현 간으
      • 단점: 라이브러리 조금 무거움