본문으로 이동
문서

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

임우빈 컬리 · 컬리 기술 블로그

원문 보기

AI 핵심 요약

입고관리 시스템에서는 중복 요청과 여러 작업자의 동시 처리로 재고 차감이나 발주 등록의 정합성이 깨질 수 있어, 멀티 인스턴스 환경에서 공유할 분산락을 도입했습니다. 추가 인프라 없이 사용할 수 있는 Redis와 락 인터페이스, 타임아웃 설정, Pub/Sub 기반 획득 방식을 제공하는 Redisson을 선택했습니다. 비즈니스 로직과 락 처리를 분리하기 위해 Spring AOP와 어노테이션을 만들고, SpEL로 락 키를 지정하며 대기 시간과 임대 시간을 조정할 수 있게 했습니다. 별도 트랜잭션을 커밋한 뒤 락을 해제하도록 구성했으며, 쿠폰 차감과 중복 발주 테스트를 통해 락이 동시성 문제를 막는 효과를 확인했습니다.

  • Lettuce의 SETNX 기반 락은 재시도와 타임아웃을 직접 구현해야 하고, 폴링이 잦으면 Redis 부하가 커질 수 있습니다.
  • Redisson의 Pub/Sub 방식은 락 해제 신호를 받은 클라이언트가 획득을 시도하도록 해 스핀락 방식의 반복 요청을 줄입니다.
  • SpEL로 메서드 인자에서 락 키를 구성하면 쿠폰 ID나 발주 코드처럼 업무 단위에 맞춰 락 범위를 정할 수 있습니다.
  • 락을 기다리는 시간과 임대 시간은 작업 특성에 맞게 설정하고, 임대 시간이 작업보다 짧으면 락이 먼저 풀릴 수 있음을 고려해야 합니다.
  • 락을 해제하기 전에 트랜잭션이 커밋되도록 구성해야 다음 요청이 커밋 전 데이터를 읽어 정합성이 깨지는 상황을 막을 수 있습니다.

소개

어노테이션 기반으로 분산락을 사용하는 방법에 대해 소개합니다.

비슷한 학습 자료

문서 함종현

늘어나는 트래픽을 잘 처리하기 위해 서버 개발자는 어떤 고민을 해야 할까요? “라이브 쇼핑 보기” 서비스에 대규모 트래픽이 들어오면서 겪은 문제와 해결책을 공유드려요.

백엔드 데이터베이스

문서 한재엽

이미 운영 중인 제품을 전부 갈아엎고 다시 만드는 경험을 하기는 어려운데요. 운 좋게 팀 내 공감대가 형성되어 여러 팀원과 하나의 제품을 온전히 개선해 볼 수 있었어요. 앞선 내용에 이어서 이 글에서는 구체적으로 어떻게 개선했는지 소개할게요.

프로덕트 매니지먼트 애자일 · 협업

문서 임재후/최수민

웹에서 복잡한 퍼널 쉽게 관리하기

문서 임재후/최수민

토스페이먼츠 프론트엔드 챕터에서 웹에서 퍼널을 손쉽게 관리하기 위해 했던 고민과 해결 방법을 공유해요.

웹 개발 프론트엔드

문서 이창섭

아웃박스 패턴과 재시도 토픽으로 외부 채널 입고 정보를 안전하게 동기화하기

백엔드

문서 박제희, 이규원, 이종립

성능 테스트로 데드락을 찾아 없애고 TPS를 끌어올리자!

데이터베이스 프로덕트 지표 · 실험

문서 이규원

Redis 테스트를 진행했습니다.

데이터베이스 소프트웨어 테스트