- 선착순 쿠폰 발급을 위한 백엔드 시스템
- 육각형 아키텍처(Hexagonal Architecture) 스타일
- 요구사항
- 선착순으로 쿠폰 발급
- 중복 발급 X
- 멀티 서버라고 가정
- 쿠폰 발급 이벤트는 특정 시간(짧은 시간) 에 대용량 트래픽 발생
- 수많은 동시 요청 에서 제한적인 쿠폰수량과 선착순 발급에 대한 정확성과 무결성 을 지켜야 함
DB에 Exclusive Lock(배타적 잠금)을 걸어 동시요청에 대한 데이터 정확성고 무결성을 지키면서 해결하였음.
하지만 막대한 트래픽이 왔을 때 해당 쿠폰 DB에 잠금을 걸었기에 쿠폰을 사용하는 다른 서비스도 대기를 하거나 데드락이 걸릴 가능성이 있습니다.
따라서 redis를 이용한 Distribution Lock(분산락)을 사용하게 되었습니다.
분산락으로 하나의 공유자원(쿠폰)에 접근할 때 데이터 결함이 발생하지 않도록 원자성(atomic)을 보장하여 여러 서버에서의 동시성 이슈를 해결하였습니다.
- Language :
Java 11
- Framework :
Spring Boot 2.7.8
- Database :
MySQL 8.0
,JPA
,QueryDSL
,Redis
- API Documentation :
Swagger 3.0.0
- 회원쿠폰 발급 API에 관한 클래스만 적은 패키지 구조
- JMeter를 사용하여 5초안에 2000명 요청하는 것을 5번 반복
- 쿠폰남은개수는 1000개이고, 회원은 10000명이 있음
- MEMBER_COUPON 값 : 뒤죽박죽 요청된 것을 볼 수 있음
- COUPON 값 : 제한된 1000개의 수량만큼만 빠진것을 볼 수 있음
- 발급된 회원쿠폰 개수 : 1000개만 발급된 것을 볼 수 있음
- 회원쿠폰 테이블에서 중복 발급되었는지 조회 : 중복 발급이 없는 것을 볼 수 있음
- 11번 쿠폰에 대해서만 발급요청을 했기에 회원id(mem_id)가 중복됐는지만 체크하면 됨
- 15개 쓰레드 생성하여 10000명의 회원쿠폰 발급을 병렬처리 테스트함