ํ์ ์ข์ ์ด๋ฒคํธ์์ ๋์์ ๋ชฐ๋ฆฌ๋ ์์ฝ ์์ฒญ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ํฐ์ผํ
์น ์๋น์ค์
๋๋ค.
์ฌ์ฉ์๋ ์์ฒญ ์ ์ฆ์ job_id๋ฅผ ๋ฐ๊ธ๋ฐ๊ณ , ๋ฐฑ์๋์์ ์ค๋ ๋ ๊ธฐ๋ฐ ์์ปค๊ฐ ์ค์ ์์ฝ(์ข์ ๋ฐฐ์ )์ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋น ๋ฅธ ์์
- ์ฃผ์ ๊ธฐ๋ฅ
- ์ํคํ ์ฒ
- API ์ฌ์ฉ๋ฒ
- ํ ์คํธ ์คํ
- ๋ถํ ํ ์คํธ
- ํ๋ก์ ํธ ๊ตฌ์กฐ
- ๋ฌธ์ ํด๊ฒฐ
| ํ๋ก๊ทธ๋จ | ์ต์ ๋ฒ์ | ์ค์น ๋งํฌ |
|---|---|---|
| Docker Desktop | 4.0+ | Docker ๊ณต์ ์ฌ์ดํธ |
| Git | 2.0+ | Git ๊ณต์ ์ฌ์ดํธ |
docker --version
docker-compose --version# PowerShell ๋๋ ๋ช
๋ น ํ๋กฌํํธ์์
docker --version
docker-compose --versionDocker Desktop์ด ์คํ๋์ด ์์ด์ผ ํฉ๋๋ค - ์์คํ ํธ๋ ์ด์ Docker ์์ด์ฝ ํ์ธ
# ํ๋ก์ ํธ ํด๋ก
git clone <repository-url>
cd ticketing_test
# ๋ชจ๋ ์๋น์ค ์์
docker-compose up -d --build
# ์๋น์ค ์ํ ํ์ธ
docker-compose ps# API ์๋ฒ ํ์ธ
curl http://localhost:8000
# ์์ ์๋ต
{
"message": "Asynchronous Ticketing Service API",
"version": "1.0.0"
}docker-compose down- ํฐ์ผ ์์ฝ ์์ฒญ: ์ฆ์ job_id ๋ฐํ, Redis ํ์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ
- Job ์ํ ์กฐํ: ์์ฝ ์งํ ์ํฉ ๋ฐ ๊ฒฐ๊ณผ ํ์ธ
- ์ฒ๋ฆฌ ํต๊ณ: ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ์์ ๊ฐ์ ์กฐํ
- ์ด๋ฒคํธ ๊ด๋ฆฌ: ์ด๋ฒคํธ ์์ฑ ๋ฐ ์ข์ ํํฉ ์กฐํ
- 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 ํ ๋ฒํผ๋ง
curl -X POST "http://localhost:8000/events" \
-H "Content-Type: application/json" \
-d '{"name": "Fan Meet", "total_seats": 100}'curl -X POST "http://localhost:8000/events/1/reserve" \
-H "Content-Type: application/json" \
-d '{"request_id": "req-001", "user_id": "user123", "quantity": 2}'curl "http://localhost:8000/jobs/1024"curl "http://localhost:8000/stats/processing_count"curl "http://localhost:8000/events/1/status"- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
# ๋ชจ๋ ํ
์คํธ ์คํ
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- ๋ธ๋ผ์ฐ์ ์์ ์ ์: http://localhost:8089
- ๋จ๊ณ๋ณ ๋ถํ ํ ์คํธ:
| ๋จ๊ณ | ์ฌ์ฉ์ ์ | Spawn Rate | ๋ชฉ์ |
|---|---|---|---|
| ๐ข 1๋จ๊ณ | 5๋ช | 1/์ด | ๊ธฐ๋ณธ ๋์ ํ์ธ |
| ๐ก 2๋จ๊ณ | 20๋ช | 3/์ด | ์ค์ ์ฌ์ฉ๋ ์๋ฎฌ๋ ์ด์ |
| ๐ 3๋จ๊ณ | 50๋ช | 5/์ด | ์ฑ๋ฅ ํ๊ณ ํ์ธ |
| ๐ด 4๋จ๊ณ | 100๋ช | 10/์ด | ์คํธ๋ ์ค ํ ์คํธ |
# ํ
์คํธ ์์ (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 ์์กด์ฑ
# ์ฌ์ฉ ์ค์ธ ํฌํธ ํ์ธ (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# ์๋น์ค ์ํ ํ์ธ
docker-compose ps
# ์ฑ ๋ก๊ทธ ํ์ธ
docker-compose logs app --tail=50
# ํฌ์ค์ฒดํฌ
curl -I http://localhost:8000/- M1/M2 ์นฉ์์๋ Docker ์ด๋ฏธ์ง ํ๋ซํผ ํธํ์ฑ ํ์ธ ํ์
- WSL2 ๋ฐฑ์๋ ์ฌ์ฉ ๊ถ์ฅ
- PowerShell ์คํ ์ ์ฑ ํ์ธ
- 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๋ฅผ ํตํ ์ํ ๊ณต์
- ์บ์ฑ: ์์ฃผ ์กฐํ๋๋ ์ด๋ฒคํธ ์ ๋ณด ์บ์ฑ
์ด ํ๋ก์ ํธ๋ ๊ต์ก ๋ชฉ์ ์ผ๋ก ์ ์๋ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค.