[MLOps] FastAPI, Uvicorn과 ASGI웹서버
1. FastAPI란?
- python으로 작성된 최신 웹 프레임워크
- 비동기 프로그래밍을 지원해 빠르고 효과적
- 자동 문서화 기능(Swagger): API를 설계하고 문서화하는 도구와 프레임워크의 기능(API테스트, 문서화)
=> API 사용법을 이해하고 테스트하는데 시간을 절약할 수 있다.
- 데이터 검증: 클라이언트가 잘못된 데이터를 보냈을 경우, 개발자가 추가 코드를 작성하지 않아도 FastAPI가 에러를 처리
=> 안정성을 보장하고 개발 시간을 단축
- 타입 힌팅: 변수나 함수의 타입을 지정할 수 있는 기능 => 가독성과 명확성을 높임
- FastAPI를 사용하면 RESTful API를 쉽게 구현할 수 있다
=> 데코레이터(@app.get)를 사용하면 간단히 HTTP메서드와 경로를 정의할 수 있어 직관적이다.
1) 동기 vs 비동기
- 동기 (Synchronous): 하나의 작업이 끝날 때까지 기다려야 다음 작업을 시작할 수 있다./ 느리나 단순
- 비동기(Asynchronous): 여러 작업을 병렬로 처리해 동시에 진행할 수 있다./ 빠르나 복잡한 경우도 있음
2) API (Application Programming Interface)
- 소프트웨어 간의 상호작용을 위한 인터페이스
- RESTful API(HTTP 기반으로 작동), GraphQL(데이터 요청/응답을 더 유연하게 처리) 등
3) RESTful API (Representational State Transfer)
- REST는 HTTP를 기반으로 클라이언트와 서버간의 자원을 주고받는 아키텍쳐 스타일
- HTTP 메서드와 URL을 사용해 동작한다
- 특징: URL 구조가 명확하고 직관적, HTTP프로토콜로 표준화, 독립적인 확장성, 데이터 형식이 다양한 유연성
* 리소스(자원): 서버가 제공하는 데이터의 단위(예. 사용자 정보, 게시글, 제품 정보)
- 실시간 양방향 통신(WebSocket)에는 적합하지 않다
4) GraphQL
- facebook이 개발한 API 쿼리 언어
- 클라이언트가 원하는 데이터의 구조를 스스로 정의할 수 있어 불필요한 데이터를 포함하지 않아 효율적이다.
- REST와 달리 여러 URL을 정의할 필요가 없지만 설계와 구현이 REST에 비해 복잡하다.
2. Uvicorn이란?
- ASGI 웹 서버, 빠르고 가벼우며, 비동기를 지원하는 Python 웹 애플리케이션에 적합
* 웹 애플리케이션: 웹 브라우저를 통해 사용할 수 있는 인터넷 기반 소프트웨어
3. WSGI와 ASGI
1) SGI (Server Gateway Interface)
- 웹 서버와 웹 애플리케이션의 중간다리, 통역사 (gateway: 문,출입구/interface:상호작용을 위한 창구, 규칙, 매개체)
- 웹 애플리케이션(예: Django, Flask)과 웹 서버(예: Apache, Nginx)가 서로 데이터를 주고받는 방식을 정해놓은 표준 규칙
- 웹 서버가 사용자로부터 요청 받은 HTTP 요청을 웹 애플리케이션에 전달/ 웹 애플리케이션이 생성한 응답을 웹 서버로 전달해 사용자가 볼 수 있게 처리
- 예시) 사용자가 www.example.com요청=> 웹서버가 요청 처리 => WSGI/ASGI => 웹 애플리케이션이 요청처리/응답생성 => WSGI/ASGI가 응답을 웹서버로 전달 => 웹서버가 사용자에게 최종 결과를 보여줌
2) HTTP (HyperText Transfer Protocol)
- 웹에서 사용자와 서버(웹 사이트)가 데이터를 주고받는 규칙(protocol)
- 예시) 우리가 브라우저에 url을 입력 => HTTP를 사용해 데이터를 요청하고 응답받음
- 기본 구조: 요청(클라이언트 → 서버, 정보요청 메시지)/응답 (서버 → 클라이언트, 정보 메시지)
- 주요특징: 비연결성(요청-응답)이 끝나면 연결을 끊는다.
- 요청 구성 요소: 메서드(요청의 목적, GET, POST, PUT, DELETE), URL(요청 대상), 헤더(추가정보: 인증정보, 데이터 형식), 본문(요청에 포함된 데이터, POST, PUT 등)
3) WSGI (Web Server Gateway Interface)
- 전통적 방식, 동기식 웹프레임워크(Django, Flast 등)을 위해 만들어짐
- 비동기 요청(실시간 데이터 처리)에 적합하지 않음
4) ASGI (Asynchronous Server Gateway Interface)
- 비동기 처리를 효율적으로 지원
- uvloop: python의 기본 이벤트 루프보다 C로 작성되어 속도가 매우 빠르다.
- httpltools: HTTP 프로토콜을 빠르게 처리하는 라이브러리
- WebSocket(실시간 데이터 전송에 사용하는 양방향 통신 프로토콜: 채팅, 실시간 알림 등에 사용) 쉽게 구현 가능
5) 이벤트 루프
- 비동기 프로그래밍에서 중요한 역할을 하는 중앙 컨트롤러(중간 조율)
- 작업을 대기열(Queue)에 넣고, 준비된 작업을 실행하며, 완료되었는지 확인
- CPU는 한 번에 하나의 작업만 처리할 수 있어, 효율적으로 작업 순서를 관리할 무언가가 필요하다.
* 동기 프로그래밍은 작업을 순서대로 처리하기 때문에 대기열이나 작업 상태 고나리가 필요하지 않다.