2022년 7월 이야기

여기 어때 팀에서는 서비스 성수기나 선착순 쿠폰 지급 이벤트와 같이 동시성이 많이 요구되는 상황에서도 대응 가능한 시스템(기존의 Monolithic 구조에서 벗어난 MSA 기반 신규 쿠폰 플랫폼)을 설계하였습니다

선착순 이벤트 문제 및 개선

여기 어때 내 기존 선착순 이벤트는 RDB에 의존하여 수량 체크하였으나, 이로 인해 초과 지급과 전체 서비스에 장애 전파의 위험이 있었습니다.

이를 개선하고자 쿠폰 플랫폼을 개발하였으며, 주요 요구사항은:

  1. 이벤트 기간에 매일 특정 시간에 한정 수량 오픈
  2. 쿠폰 지급 수량은 당일 양을 초과 안됨
  3. 쿠폰은 1인당 1장만 지급

위 요구사항을 충족시키기 위해 처음에는 Redis를 사용하였습니다.

1) INCR 커맨드로 재고 관리

INCR 커맨드는 특정키의 값을 1씩 빠르게 증가시키고, 초과 시 지급되지 않습니다.

중복 지급 처리(개수가 올라가 버림)는 불가능하며, 사용자 정보 저장에 별도 Redis or RDB가 필요합니다.

2) SET 자료형으로 재고 관리

쿠폰 한정 지급을 위해, Redis의 SET 자료형을 선택했습니다. 이를 이용해 사용자의 유니크한 userId를 확인하고, 기존에 이미 다운로드 받았는지 확인하고, 중복 지급을 막았습니다.

SCARD와 SADD 커맨드로 지급 처리했으나, 트래픽이 몰릴 경우 동시성 이슈를 야기하며 아래 그림처럼 초과 지급이 발생하는 케이스를 확인했습니다.