Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 64 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,37 +1,73 @@
# **선착순 쿠폰 발급 시스템**
# 선착순 쿠폰 발급 시스템

# **목차**
## 📋 목차
1. [프로젝트 개요](#1-프로젝트-개요)
2. [아키텍처](#2-아키텍처)
3. [사용한 기술](#3-사용한-기술)
4. [선착순 쿠폰 발급 기능(시퀀스 다이어그램)](#4-선착순-쿠폰-발급-기능시퀀스-다이어그램)
5. [패키지 구조](#5-패키지-구조)
3. [문제 해결 과정](#3-문제-해결-과정)
4. [사용한 기술](#4-사용한-기술)
5. [선착순 쿠폰 발급 기능(시퀀스 다이어그램)](#5-선착순-쿠폰-발급-기능시퀀스-다이어그램)
6. [패키지 구조](#6-패키지-구조)

---

## 1. 프로젝트 개요
**목표**: 대규모 트래픽을 처리할 수 있는 쿠폰 발급 시스템 설계 및 구현
- 제한된 서버 리소스에서 최대한의 효율을 이끌어 내보기 위한 목적을 가지고 시작
### AWS
- EC2 - t3.medium(2vCPU, 4GB RAM)
- RDS - db.t4g.micro(2vCPU, 1GB RAM)
> **목표**: 대규모 트래픽을 처리할 수 있는 쿠폰 발급 시스템 설계 및 구현

제한된 서버 리소스 환경에서 최대한의 효율을 이끌어내기 위한 최적화 작업을 중점으로 진행했습니다.

### ☁️ AWS 환경
- **EC2**: t3.medium (2vCPU, 4GB RAM)
- **RDS**: db.t4g.micro (2vCPU, 1GB RAM)

<br>

## 2. 아키텍처
![architecture.png](assets/architecture.png)

## 3. 사용한 기술
| **분류** | **사용한 기술** |
|-----------------------------------|-----------------------------------------------------------------------------------------------------------------|
| **Backend** | Java 21, Kotlin, Spring Boot 3.4.1 |
| **Database** | MySQL 8.0.41, Redis, InfluxDB |
| **Messaging & Streaming** | Kafka 3.x, KRaft, Kafka-UI |
| **Load Balancer** | Nginx |
| **Containerization** | Docker |
| **Build & Dependency Management** | Gradle |
| **Testing** | k6 |
| **Monitoring** | Prometheus, Grafana, Prometheus Micrometer, Spring Boot Actuator(JVM (Micrometer), Spring Boot HikariCP / JDBC) |
| **Exporters** | mysql-exporter, redis-exporter, kafka-exporter |
<br>

## 3. 문제 해결 과정

### 🏆 핵심 성과
> - **동시성 이슈 해결**: 10,000명 동시 요청 환경에서 발생한 Race Condition(초과 발급)을 **100% 제어**
> - **성능 최적화**: `DB Lock` → `Redis` → `Kafka` 순차적 고도화를 통해 응답 속도 개선 및 시스템 안정성 확보

### 🛠️ 단계별 해결 과정

#### Step 1. 데이터 정합성 보장
- **문제**: `Java synchronized` 사용 시 다중 서버 환경에서 동시성 제어 불가 및 성능 저하 발생
- **해결**: **DB 비관적 락(Pessimistic Lock)** 도입으로 데이터 정합성 보장
- **결과**: 동시성 문제는 해결했으나, DB 커넥션 풀 고갈(Pending Threads 폭증)로 인한 병목 발생

#### Step 2. 응답 속도 개선 (Latency 감소)
- **문제**: DB 커넥션 대기 시간 증가(최대 1초) 및 CPU 사용률 100% 도달
- **해결**: **Redis Lua Script**를 활용해 원자적 연산 처리 및 DB 접근 최소화
- **결과**: **Latency 62% 감소**. 단, 성공 건에 대한 동기식 DB 저장(Insert) 작업이 새로운 병목지점이 됨

## 4. 선착순 쿠폰 발급 기능(시퀀스 다이어그램)
#### Step 3. 시스템 처리량(Throughput) 향상
- **문제**: 동기식 DB 저장 구조로 인한 전체 처리량의 한계 확인
- **해결**: **Kafka 기반 Event-Driven 아키텍처**로 전환하여 비동기 Batch Insert 처리
- **결과**: DB 부하를 격리하고 소비(Consume) 속도를 Throttling하여 시스템 안정성 및 최종 처리량 향상

<br>

## 4. 사용한 기술

| 분류 | 사용한 기술 |
| :--- | :--- |
| **Backend** | Java 21, Kotlin, Spring Boot 3.4.1 |
| **Database** | MySQL 8.0.41, Redis, InfluxDB |
| **Messaging & Streaming** | Kafka 3.x, KRaft, Kafka-UI |
| **Load Balancer** | Nginx |
| **Containerization** | Docker |
| **Build & Tool** | Gradle |
| **Testing** | k6 |
| **Monitoring** | Prometheus, Grafana, Micrometer (JVM, HikariCP), Spring Boot Actuator |
| **Exporters** | mysql-exporter, redis-exporter, kafka-exporter |

<br>

## 5. 선착순 쿠폰 발급 기능(시퀀스 다이어그램)

### 1) 쿠폰 발급 정상 처리
![1-success.png](assets/1-success.png)
Expand All @@ -45,8 +81,11 @@
### 4) 쿠폰 발급 성공, Consumer 이벤트 처리 실패
![4-success-consumer-fail.png](assets/4-success-consumer-fail.png)

## 5. 패키지 구조
```
<br>

## 6. 패키지 구조

```text
.
├── HELP.md
├── README.md # 프로젝트 전체 설명
Expand Down Expand Up @@ -251,5 +290,3 @@
├── nginx
│ └── nginx.conf # 로드밸런싱 또는 리버스 프록시 설정
└── settings.gradle.kts # 멀티 모듈 관리 설정

```
Loading