Fast API 사용 이유 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki
1. 개요
- ai 서버로 fast api를 선정한 이유에 대해 설명한다.
- 근본인 Django나 이용이 간편한 Flask보다 Fast API가 우리 서비스에 적합함을 설명한다.
2. WSGI vs ASGI
a. WSGI (Web Server Gateway Interface)
-
요청을 처리하는 동안 다른 요청은 blocking 처리되기 때문에 여러 요청이 오면 병목 발생
[Client Request] → [WSGI Server (Gunicorn)] → [Flask 앱] | (block)
b. ASGI (Asynchronous Server Gateway Interface)
-
Nonblocking 방식으로 여러 요청을 병목 처리하기 때문에 여러 요청을 동시 처리하는데 강하다
-
I/O 작업은 하나의 작업을 처리하는데 발생하는 지연시간이 길다.
- 그동안 cpu 사용률은 낮기 때문에 I/O 작업을 기다리기보다 다른 요청을 처리하고 있음으로써 cpu를 유휴 상태로 냅두지 않는다
[Client Request] → [ASGI Server (Uvicorn)] → [FastAPI 앱] | async def → 병렬 처리 가능 (Non-blocking)
3. Django, Flask, Fast API 비교
| Django | Flask | Fast API | |
|---|---|---|---|
| 특징 | 전체 서비스 서빙에 적합한 백엔드 프레임워크 | 입문하기 좋은 쉽고 간편한 프레임워크 | 비동기 처리가 많은 api 요청 처리에 적합한 프레임 워크 |
| 장점 | - 세션 유지 기능 제공(로그인 상태, 장바구니) |
- 인증/보안 기능 제공
- ORM을 통해 sql 없이 DB 이용 가능 (안정적인 DB 이용)
- 관리페이지 자동 생성
- HTML 렌더링 기능 | - 최소한의 기능으로 구성되어 있어 배우기 쉽다
- 간단한 테스트나 학습용으로 적합하다 | - 비동기 처리에 강하다
- async def, await을 이용한 고성능 API 서버 구현에 적합
- Swagger/OpenAPI 문서 자동 생성
- APIRouter, Depends등올 모듈화/계층 구조화에 유리
- pydantic을 이용한 요청, 응답 검증 | | 단점 | - 비동기 처리에 약하다
- 코드가 무겁다 | - 비동기 처리에 약하다
- ORM, 인증, 세션, html 렌더링, 관리페이지 자동 생성 등의 기능을 이용하려면 외부 모듈을 이용해야 한다 | - ORM, 인증 등이 제공되지 않음
- 로그인, 세션, 관리 기능은 직접 구현하거나 외부 라이브러리에 의존 |
4. 결론: 우리 서비스에는 FastAPI가 가장 적합한 프레임워크
a. 서비스 흐름
요청 (최대 100장 이미지)
↓
GCS or S3 이미지 다운로드
↓
임베딩 (Batch 처리)
↓
사진 처리
↓
JSON 결과 응답
b. 서비스 특징
- 이미지 병렬 다운로드
- 고속 임베딩 연산
- 태깅 및 분류 결과 생성
- 메시지 큐 기반 요청 관리
- 고성능 API 응답
c. FastAPI가 적합한 이유
- async def로 병령 다운로드 가능
- 대량 요청 처리 Uvicorn + ASGI 기반으로 동시 요청 처리에 강함
- 라우터 모듈화: 기능별로 분리 가능
- 서버 응답 속도 빠름
d. Flask가 적합하지 않은 이유
- 이미지 다운로드를 동기 처리해서 느리다
- 임베딩 연산이 완료될 때까지 한 요청이 블로킹함
e. Django가 적합하지 않은 이유
- API 서버만 필요한데 ORM/Template/Forms까지 불필요하게 포함됨
- 고성능 비동기 구조 구현에 불편함