diff --git a/README.md b/README.md index b5141f3..1ec3c46 100644 --- a/README.md +++ b/README.md @@ -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) + +
## 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 | +
+ +## 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하여 시스템 안정성 및 최종 처리량 향상 + +
+ +## 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 | + +
+ +## 5. 선착순 쿠폰 발급 기능(시퀀스 다이어그램) ### 1) 쿠폰 발급 정상 처리 ![1-success.png](assets/1-success.png) @@ -45,8 +81,11 @@ ### 4) 쿠폰 발급 성공, Consumer 이벤트 처리 실패 ![4-success-consumer-fail.png](assets/4-success-consumer-fail.png) -## 5. 패키지 구조 -``` +
+ +## 6. 패키지 구조 + +```text . ├── HELP.md ├── README.md # 프로젝트 전체 설명 @@ -251,5 +290,3 @@ ├── nginx │ └── nginx.conf # 로드밸런싱 또는 리버스 프록시 설정 └── settings.gradle.kts # 멀티 모듈 관리 설정 - -``` \ No newline at end of file