목록 보기
풀필먼트 입고 서비스팀에서 분산락을 사용하는 방법 - Spring Redisson
백엔드

풀필먼트 입고 서비스팀에서 분산락을 사용하는 방법 - Spring Redisson

마켓컬리
마켓컬리
2023년 5월 17일

두줄요약

Spring AOP와 Redisson으로 어노테이션 기반 분산락 컴포넌트를 구성했습니다. 트랜잭션 커밋 후 락을 해제해 재고 차감과 중복 등록의 정합성을 검증했습니다.

문제 상황

  • Kafka 중복 발주 수신, 중복 요청, 동시 작업으로 인한 재고 트랜잭션 정합성 문제
  • 멀티 인스턴스 환경에서 애플리케이션 예외 처리만으로 부족한 동시성 제어

선택 이유

  • 기존 Redis 사용 환경 활용으로 추가 인프라 구축 불필요
  • Lettuce 직접 구현 대비 Lock 인터페이스, timeout 설정, Pub/Sub 기반 락 획득 지원
  • MySQL 락 운용 시 별도 커넥션 풀과 RDS 부하 고려

구조와 흐름

  • @DistributedLock 어노테이션으로 key, waitTime, leaseTime 설정 분리
  • AOP에서 SpEL 기반 동적 락 키 생성, RLock.tryLock 수행, 종료 시 unlock 처리
  • 별도 REQUIRES_NEW 트랜잭션으로 비즈니스 로직 실행 후 커밋 뒤 락 해제

주의할 점

  • 트랜잭션 커밋 전에 락을 해제하면 후속 요청이 이전 데이터를 읽어 재고 차감 누락 가능성
  • 쿠폰 차감과 중복 발주 등록 동시성 테스트로 락 적용 시 정합성 검증

컬리 계열사 채용12건

채용 사이트에서 전체 보기

다음 읽기

#Spring Boot 주제를 이어서 읽기

풀필먼트 입고 서비스팀에서 분산락을 사용하는 방법 - Spring Redisson

풀필먼트 입고 서비스의 동시성 문제를 해결하기 위해 Redisson 기반 분산락을 적용한 사례를 소개했습니다. AOP와 어노테이션으로 락을 추상화하고 트랜잭션 커밋 이후 해제로 정합성을 보장했습니다.

마켓컬리
마켓컬리
백엔드

댓글 0개

댓글을 작성하려면 로그인이 필요합니다.

댓글을 불러오는 중...