Skip to content

Sangyong-Jeon/coupon_fifo-concurrency_issue

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

47 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

선착순 쿠폰 발급 API 백엔드

1. 프로젝트 개요

1-1. 프로젝트 소개

  • 선착순 쿠폰 발급을 위한 백엔드 시스템
  • 육각형 아키텍처(Hexagonal Architecture) 스타일
  • 요구사항
    • 선착순으로 쿠폰 발급
    • 중복 발급 X
    • 멀티 서버라고 가정

image

1-2. 문제 해결 전략

  • 쿠폰 발급 이벤트는 특정 시간(짧은 시간)대용량 트래픽 발생
  • 수많은 동시 요청 에서 제한적인 쿠폰수량과 선착순 발급에 대한 정확성과 무결성 을 지켜야 함

DB에 Exclusive Lock(배타적 잠금)을 걸어 동시요청에 대한 데이터 정확성고 무결성을 지키면서 해결하였음.

하지만 막대한 트래픽이 왔을 때 해당 쿠폰 DB에 잠금을 걸었기에 쿠폰을 사용하는 다른 서비스도 대기를 하거나 데드락이 걸릴 가능성이 있습니다.

따라서 redis를 이용한 Distribution Lock(분산락)을 사용하게 되었습니다.

분산락으로 하나의 공유자원(쿠폰)에 접근할 때 데이터 결함이 발생하지 않도록 원자성(atomic)을 보장하여 여러 서버에서의 동시성 이슈를 해결하였습니다.

1-3. 기술 스택

  • Language : Java 11
  • Framework : Spring Boot 2.7.8
  • Database : MySQL 8.0, JPA, QueryDSL, Redis
  • API Documentation : Swagger 3.0.0

2. 개발 내용

2-1. 백엔드 아키텍처

image

2-2. 육각형 아키텍처 패키지 구조

  • 회원쿠폰 발급 API에 관한 클래스만 적은 패키지 구조

image

image

image

image

2-3. 데이터베이스 ERD

image

- COUPON : 쿠폰 정보 - MEMBER : 회원 정보 - MEMBER_COUPON : 회원이 발급받은 쿠폰 내역

2-4 API 문서화

image

2-5 부하 테스트

image

  • JMeter를 사용하여 5초안에 2000명 요청하는 것을 5번 반복
  • 쿠폰남은개수는 1000개이고, 회원은 10000명이 있음
  • MEMBER_COUPON 값 : 뒤죽박죽 요청된 것을 볼 수 있음

image

  • COUPON 값 : 제한된 1000개의 수량만큼만 빠진것을 볼 수 있음

image

  • 발급된 회원쿠폰 개수 : 1000개만 발급된 것을 볼 수 있음

image

  • 회원쿠폰 테이블에서 중복 발급되었는지 조회 : 중복 발급이 없는 것을 볼 수 있음
    • 11번 쿠폰에 대해서만 발급요청을 했기에 회원id(mem_id)가 중복됐는지만 체크하면 됨

image

2-6 쿠폰발급 테스트

image
  • 15개 쓰레드 생성하여 10000명의 회원쿠폰 발급을 병렬처리 테스트함

About

선착순 쿠폰 발급 시 동시성 이슈

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages