Skip to content

Latest commit

ย 

History

18 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๋น„๋™๊ธฐ ํ‹ฐ์ผ€ํŒ… ์›น ์„œ๋น„์Šค

ํ•œ์ • ์ขŒ์„ ์ด๋ฒคํŠธ์—์„œ ๋™์‹œ์— ๋ชฐ๋ฆฌ๋Š” ์˜ˆ์•ฝ ์š”์ฒญ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ‹ฐ์ผ€ํŒ… ์›น ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž๋Š” ์š”์ฒญ ์‹œ ์ฆ‰์‹œ job_id๋ฅผ ๋ฐœ๊ธ‰๋ฐ›๊ณ , ๋ฐฑ์—”๋“œ์—์„œ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ์›Œ์ปค๊ฐ€ ์‹ค์ œ ์˜ˆ์•ฝ(์ขŒ์„ ๋ฐฐ์ •)์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“‹ ๋ชฉ์ฐจ

  1. ๋น ๋ฅธ ์‹œ์ž‘
  2. ์ฃผ์š” ๊ธฐ๋Šฅ
  3. ์•„ํ‚คํ…์ฒ˜
  4. API ์‚ฌ์šฉ๋ฒ•
  5. ํ…Œ์ŠคํŠธ ์‹คํ–‰
  6. ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ
  7. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ
  8. ๋ฌธ์ œ ํ•ด๊ฒฐ

๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘

์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ

ํ”„๋กœ๊ทธ๋žจ ์ตœ์†Œ ๋ฒ„์ „ ์„ค์น˜ ๋งํฌ
Docker Desktop 4.0+ Docker ๊ณต์‹ ์‚ฌ์ดํŠธ
Git 2.0+ Git ๊ณต์‹ ์‚ฌ์ดํŠธ

์„ค์น˜ ํ™•์ธ

macOS/Linux

docker --version
docker-compose --version

Windows

# PowerShell ๋˜๋Š” ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ์—์„œ
docker --version
docker-compose --version

Docker Desktop์ด ์‹คํ–‰๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค - ์‹œ์Šคํ…œ ํŠธ๋ ˆ์ด์— Docker ์•„์ด์ฝ˜ ํ™•์ธ

1๋‹จ๊ณ„: ํ”„๋กœ์ ํŠธ ์‹คํ–‰

# ํ”„๋กœ์ ํŠธ ํด๋ก 
git clone <repository-url>
cd ticketing_test

# ๋ชจ๋“  ์„œ๋น„์Šค ์‹œ์ž‘
docker-compose up -d --build

# ์„œ๋น„์Šค ์ƒํƒœ ํ™•์ธ
docker-compose ps

2๋‹จ๊ณ„: ๋™์ž‘ ํ™•์ธ

# API ์„œ๋ฒ„ ํ™•์ธ
curl http://localhost:8000

# ์˜ˆ์ƒ ์‘๋‹ต
{
  "message": "Asynchronous Ticketing Service API",
  "version": "1.0.0"
}

3๋‹จ๊ณ„: ์„œ๋น„์Šค ์ค‘์ง€

docker-compose down

๐ŸŽฏ ์ฃผ์š” ๊ธฐ๋Šฅ

  1. ํ‹ฐ์ผ“ ์˜ˆ์•ฝ ์š”์ฒญ: ์ฆ‰์‹œ job_id ๋ฐ˜ํ™˜, Redis ํ์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
  2. Job ์ƒํƒœ ์กฐํšŒ: ์˜ˆ์•ฝ ์ง„ํ–‰ ์ƒํ™ฉ ๋ฐ ๊ฒฐ๊ณผ ํ™•์ธ
  3. ์ฒ˜๋ฆฌ ํ†ต๊ณ„: ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ์ž‘์—… ๊ฐœ์ˆ˜ ์กฐํšŒ
  4. ์ด๋ฒคํŠธ ๊ด€๋ฆฌ: ์ด๋ฒคํŠธ ์ƒ์„ฑ ๋ฐ ์ขŒ์„ ํ˜„ํ™ฉ ์กฐํšŒ

๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™

  • Job ID๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€
  • Job์€ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋  ํ•„์š” ์—†์Œ
  • ์ขŒ์„ ์ค‘๋ณต ๋ฐฐ์ • ๋ฐฉ์ง€
  • Job ์ƒํƒœ ์˜์† ์ €์žฅ์œผ๋กœ ์žฌ์กฐํšŒ ๋ณด์žฅ

๐Ÿ—๏ธ ์•„ํ‚คํ…์ฒ˜

  • FastAPI: REST API ์„œ๋ฒ„
  • PostgreSQL: ์˜์† ๋ฐ์ดํ„ฐ ์ €์žฅ (์ด๋ฒคํŠธ, ์ขŒ์„, Job ์ƒํƒœ)
  • Redis: Job ํ + ์‹œํ€€์Šค ๊ด€๋ฆฌ + ํ†ต๊ณ„
  • Worker Threads: ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹ค์ œ ์ขŒ์„ ํ• ๋‹น ์ฒ˜๋ฆฌ
  • Docker Compose: ํ†ตํ•ฉ ์‹คํ–‰ ํ™˜๊ฒฝ

ํ•ต์‹ฌ ๊ตฌํ˜„

  • Thread ์‚ฌ์šฉ: ThreadPoolExecutor๋กœ CPU ์ฝ”์–ด ๊ธฐ๋ฐ˜ ์Šค๋ ˆ๋“œ ํ’€ ๊ด€๋ฆฌ
  • ์ˆœ์ฐจ Job ID: Redis INCR๋กœ job_id ๋ฐœ๊ธ‰
  • ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ: PostgreSQL ํŠธ๋žœ์žญ์…˜ + ๋‚™๊ด€์  ๋ฝ
  • ์‹œ์Šคํ…œ ๋ถ€ํ•˜ ์ œ์–ด: ์ œํ•œ๋œ ์Šค๋ ˆ๋“œ + Redis ํ ๋ฒ„ํผ๋ง

๐Ÿ”Œ API ์‚ฌ์šฉ๋ฒ•

1. ์ด๋ฒคํŠธ ์ƒ์„ฑ

curl -X POST "http://localhost:8000/events" \
  -H "Content-Type: application/json" \
  -d '{"name": "Fan Meet", "total_seats": 100}'

2. ํ‹ฐ์ผ“ ์˜ˆ์•ฝ

curl -X POST "http://localhost:8000/events/1/reserve" \
  -H "Content-Type: application/json" \
  -d '{"request_id": "req-001", "user_id": "user123", "quantity": 2}'

3. Job ์ƒํƒœ ํ™•์ธ

curl "http://localhost:8000/jobs/1024"

4. ์ฒ˜๋ฆฌ ํ†ต๊ณ„

curl "http://localhost:8000/stats/processing_count"

5. ์ด๋ฒคํŠธ ํ˜„ํ™ฉ

curl "http://localhost:8000/events/1/status"

API ๋ฌธ์„œ


๐Ÿงช ํ…Œ์ŠคํŠธ ์‹คํ–‰

Docker ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ (๊ถŒ์žฅ)

# ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์‹คํ–‰
docker-compose exec app pytest tests/ -v

# ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋งŒ
docker-compose exec app pytest tests/test_unit.py -v

# ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋งŒ
docker-compose exec app pytest tests/test_main.py -v

๋กœ์ปฌ ํ™˜๊ฒฝ ํ…Œ์ŠคํŠธ

# ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™”
python3 -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# ์˜์กด์„ฑ ์„ค์น˜
pip install -r requirements.txt

# ํ…Œ์ŠคํŠธ ์‹คํ–‰ (์„œ๋น„์Šค ์‹คํ–‰ ํ•„์š”)
python -m pytest tests/ -v

๐Ÿ“ˆ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ

Locust ์›น UI (๊ถŒ์žฅ)

  1. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘์†: http://localhost:8089
  2. ๋‹จ๊ณ„๋ณ„ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ:
๋‹จ๊ณ„ ์‚ฌ์šฉ์ž ์ˆ˜ Spawn Rate ๋ชฉ์ 
๐ŸŸข 1๋‹จ๊ณ„ 5๋ช… 1/์ดˆ ๊ธฐ๋ณธ ๋™์ž‘ ํ™•์ธ
๐ŸŸก 2๋‹จ๊ณ„ 20๋ช… 3/์ดˆ ์‹ค์ œ ์‚ฌ์šฉ๋Ÿ‰ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
๐ŸŸ  3๋‹จ๊ณ„ 50๋ช… 5/์ดˆ ์„ฑ๋Šฅ ํ•œ๊ณ„ ํ™•์ธ
๐Ÿ”ด 4๋‹จ๊ณ„ 100๋ช… 10/์ดˆ ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ

API ๋ฐฉ์‹

# ํ…Œ์ŠคํŠธ ์‹œ์ž‘ (20๋ช… ์‚ฌ์šฉ์ž)
curl -X POST "http://localhost:8089/swarm" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "user_count=20&spawn_rate=3"

# ํ†ต๊ณ„ ํ™•์ธ
curl "http://localhost:8089/stats/requests" | python3 -m json.tool

# ํ…Œ์ŠคํŠธ ์ค‘์ง€
curl -X GET "http://localhost:8089/stop"

๊ฒ€์ฆ๋œ ์„ฑ๋Šฅ

  • 100๋ช… ๋™์‹œ ์‚ฌ์šฉ์ž ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • 325.7 RPS ๋‹ฌ์„ฑ (์˜ˆ์ƒ์น˜ 400% ์ดˆ๊ณผ)
  • 0% ์‹คํŒจ์œจ - 37,189๊ฐœ ์š”์ฒญ ์™„๋ฒฝ ์ฒ˜๋ฆฌ
  • 3.9ms ํ‰๊ท  ์‘๋‹ต์‹œ๊ฐ„

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

ticketing_test/
โ”œโ”€โ”€ app/                    # FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
โ”‚   โ”œโ”€โ”€ api/                # API ๋ผ์šฐํ„ฐ๋“ค
โ”‚   โ”œโ”€โ”€ core/               # ํ•ต์‹ฌ ์„ค์ • ๋ฐ ์ธํ”„๋ผ
โ”‚   โ”œโ”€โ”€ models/             # SQLAlchemy ORM ๋ชจ๋ธ
โ”‚   โ”œโ”€โ”€ schemas/            # Pydantic ์Šคํ‚ค๋งˆ
โ”‚   โ”œโ”€โ”€ services/           # ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ ˆ์ด์–ด
โ”‚   โ””โ”€โ”€ main.py             # FastAPI ์•ฑ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ
โ”œโ”€โ”€ worker/                 # ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์›Œ์ปค
โ”‚   โ”œโ”€โ”€ worker.py           # ํ‹ฐ์ผ“ ์˜ˆ์•ฝ ์ฒ˜๋ฆฌ ์›Œ์ปค
โ”‚   โ””โ”€โ”€ runner.py           # ์›Œ์ปค ํ”„๋กœ์„ธ์Šค ์‹คํ–‰๊ธฐ
โ”œโ”€โ”€ shared/                 # ๊ณต์œ  ์ปดํฌ๋„ŒํŠธ
โ”‚   โ””โ”€โ”€ redis_client.py     # Redis ํด๋ผ์ด์–ธํŠธ ๋ฐ ํ ๊ด€๋ฆฌ
โ”œโ”€โ”€ tests/                  # ํ…Œ์ŠคํŠธ ํŒŒ์ผ
โ”œโ”€โ”€ load_test/              # ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ
โ”œโ”€โ”€ docker-compose.yml      # Docker Compose ์„œ๋น„์Šค ์ •์˜
โ”œโ”€โ”€ Dockerfile              # ์•ฑ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋นŒ๋“œ
โ””โ”€โ”€ requirements.txt        # Python ์˜์กด์„ฑ

๐Ÿ› ๏ธ ๋ฌธ์ œ ํ•ด๊ฒฐ

Docker ๊ด€๋ จ ๋ฌธ์ œ

ํฌํŠธ ์ถฉ๋Œ

# ์‚ฌ์šฉ ์ค‘์ธ ํฌํŠธ ํ™•์ธ (macOS/Linux)
lsof -i :8000

# Windows
netstat -ano | findstr :8000

์ปจํ…Œ์ด๋„ˆ ๋นŒ๋“œ ์‹คํŒจ

# ์บ์‹œ ์—†์ด ์žฌ๋นŒ๋“œ
docker-compose build --no-cache

# ์ „์ฒด ์žฌ์‹œ์ž‘
docker-compose down -v
docker-compose up -d --build

ํ…Œ์ŠคํŠธ ๊ด€๋ จ ๋ฌธ์ œ

ํ…Œ์ŠคํŠธ ์‹คํŒจ

# ์ƒ์„ธ ์˜ค๋ฅ˜ ํ™•์ธ
docker-compose exec app pytest tests/ -v -s --tb=long

# ๋กœ๊ทธ ํ™•์ธ
docker-compose logs app worker

API ์„œ๋ฒ„ ์‘๋‹ต ์—†์Œ

# ์„œ๋น„์Šค ์ƒํƒœ ํ™•์ธ
docker-compose ps

# ์•ฑ ๋กœ๊ทธ ํ™•์ธ
docker-compose logs app --tail=50

# ํ—ฌ์Šค์ฒดํฌ
curl -I http://localhost:8000/

์šด์˜์ฒด์ œ๋ณ„ ์ฃผ์˜์‚ฌํ•ญ

macOS

  • M1/M2 ์นฉ์—์„œ๋Š” Docker ์ด๋ฏธ์ง€ ํ”Œ๋žซํผ ํ˜ธํ™˜์„ฑ ํ™•์ธ ํ•„์š”

Windows

  • WSL2 ๋ฐฑ์—”๋“œ ์‚ฌ์šฉ ๊ถŒ์žฅ
  • PowerShell ์‹คํ–‰ ์ •์ฑ… ํ™•์ธ

Linux

  • Docker ์‚ฌ์šฉ์ž ๊ถŒํ•œ ์„ค์ •: sudo usermod -aG docker $USER

๐Ÿš€ ๊ฐœ๋ฐœ ๋ช…๋ น์–ด

# ์„œ๋น„์Šค ์‹œ์ž‘
docker-compose up -d

# ์„œ๋น„์Šค ์ค‘์ง€
docker-compose down

# ๋กœ๊ทธ ํ™•์ธ
docker-compose logs -f app worker

# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘์†
docker-compose exec postgres psql -U user -d ticketing_db

# Redis ์ ‘์†
docker-compose exec redis redis-cli

๐Ÿ“Š ํ™•์žฅ ๊ณ ๋ ค์‚ฌํ•ญ

  • ์ˆ˜ํ‰ ํ™•์žฅ: Celery, Redis Streams, Kafka๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€๋Šฅ
  • ๋ชจ๋‹ˆํ„ฐ๋ง: Prometheus, Grafana ์—ฐ๋™
  • ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ: ๋‹ค์ค‘ ์ธ์Šคํ„ด์Šค ๋ฐฐํฌ์‹œ Redis๋ฅผ ํ†ตํ•œ ์ƒํƒœ ๊ณต์œ 
  • ์บ์‹ฑ: ์ž์ฃผ ์กฐํšŒ๋˜๋Š” ์ด๋ฒคํŠธ ์ •๋ณด ์บ์‹ฑ

๐Ÿ“„ ๋ผ์ด์„ผ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” ๊ต์œก ๋ชฉ์ ์œผ๋กœ ์ œ์ž‘๋œ ์ƒ˜ํ”Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages