피드로 돌아가기
Redis Pub/Sub을 활용한 쿠폰 발급 비동기 처리
올리브영 테크블로그올리브영 테크블로그
Backend

Redis Pub/Sub을 활용한 쿠폰 발급 비동기 처리

올리브영이 Redis Pub/Sub과 List 자료구조를 조합해 쿠폰 발급을 비동기 처리하면서 분당 최대 발급량 2.2배 증대

2023년 8월 7일8intermediate

Context

올리브영 선착순 쿠폰 발급 시스템은 트래픽 몰림 시간대(0시, 12시)에 모든 쿠폰 발급 프로세스가 동기 방식으로 진행되면서 DB 커넥션 고갈과 사용자 대기시간 증가 문제가 발생했다.

Technical Solution

  • 쿠폰 발급 로직을 두 단계로 분리: 유효성 검사는 온라인몰에서 동기 처리, 실제 발급은 Worker에서 비동기 처리
  • Redis Pub/Sub의 Topic 구독 기능으로 Worker 할당 결정: 올리브영 온라인몰이 여러 Worker 중 1개를 선택해 해당 Topic에 publish하면 선택된 Worker만 수신
  • Redis List 자료구조로 쿠폰 발급 데이터 큐 구현: Worker별 '일련번호'가 할당되고 각 Worker는 자신의 일련번호로 채번된 '쿠폰 발급 저장소' List에서 RPush된 데이터를 주기적으로 LPop하여 처리
  • 과발급 현상 해결: 단일 Topic을 여러 Worker가 구독하면서 중복 발급되던 문제를 Worker 선택 메커니즘으로 1:1 매핑
  • 미발급 현상 해결: Redis Pub/Sub의 비보장 전송 특성 때문에 발생한 데이터 유실을 List의 영구 저장으로 보완

Impact

  • 분당 최대 쿠폰 발급량 2.2배 증가 (2023년 3월 대비 2023년 6월)
  • 전체 쿠폰 소진 시간 1~2분으로 단축

Key Takeaway

Redis Pub/Sub의 빠른 전송 속도와 List의 데이터 영속성을 결합하면, 고트래픽 환경에서 메시지 손실을 방지하면서도 비동기 작업 분배를 안정적으로 처리할 수 있다.


높은 동시성 이벤트(선착순 판매, 쿠폰 발급)에서 단순 Pub/Sub 구독 방식은 다중 Worker 환경에서 중복 처리를 유발하므로, Worker 선택 로직(일련번호 할당)과 List 기반 큐를 조합하면 정확히 1회의 처리를 보장하면서 대기시간을 단축할 수 있다.

원문 읽기