FastAPI

FastAPI 강좌 5강: 비동기 처리와 성능 최적화

atomicdev 2024. 10. 9. 10:27
728x90

비동기 처리와 성능 최적화


강의 목표:

  • FastAPI에서 비동기 처리를 이해하고 실시간 요청을 효율적으로 처리하는 방법을 학습한다.
  • 비동기 작업을 사용하여 대량의 요청을 처리하는 API를 구현하고 성능을 최적화한다.
    FastAPI에서 여러 비동기 요청을 동시에 처리하는 과정

 


강의 세부 내용:

1. 비동기 처리의 개념

  • 비동기 처리(Async): 요청과 응답 사이의 차단을 없애고, 여러 요청을 동시에 처리할 수 있도록 돕는 방식. FastAPI는 Python의 비동기 기능(async, await)을 지원하여 I/O 바운드 작업에서 높은 성능을 발휘할 수 있습니다.
  • 동기 vs 비동기:
    • 동기(Synchronous): 각 요청이 완료될 때까지 기다렸다가 다음 요청을 처리하는 방식.
    • 비동기(Asynchronous): 요청을 비동기적으로 처리하여 여러 요청을 동시에 처리 가능.

2. 비동기 작업 구현하기

예제: 비동기 API 엔드포인트 구현

  1. 기본 비동기 처리 엔드포인트: 비동기 작업을 처리하는 FastAPI 엔드포인트를 구현하여 클라이언트 요청을 효율적으로 처리합니다.
from fastapi import FastAPI
import asyncio

app = FastAPI()

# 비동기 작업 구현
@app.get("/async_process")
async def async_process():
    await asyncio.sleep(3)  # 3초 대기하는 비동기 작업
    return {"message": "Async process complete!"}

설명:

  • async def: 비동기 함수 선언을 의미하며, 내부에서 await를 사용할 수 있습니다.
  • await asyncio.sleep(3): 3초 동안 비동기적으로 대기하는 예제입니다. 동기적으로 대기하지 않고 다른 작업을 처리할 수 있게 해줍니다.

3. 비동기 API 성능 테스트:

비동기 엔드포인트 /async_process에 다수의 요청을 보낸 후 성능을 테스트합니다.

# curl로 비동기 요청을 동시에 보내기
for i in {1..5}; do curl http://127.0.0.1:8000/async_process & done

결과: 동시에 여러 요청을 보내도 비동기적으로 처리되므로 모든 요청이 비동기적으로 처리되며, 동시에 응답을 받을 수 있습니다.


3. 대량 요청 처리와 성능 최적화

FastAPI에서 성능 최적화 전략

  1. 비동기 작업 사용: CPU 바운드 작업보다 I/O 바운드 작업(예: 파일 읽기/쓰기, 데이터베이스 요청)에서 비동기 처리가 성능을 크게 개선합니다.
  2. async와 await 사용: 모든 I/O 작업(데이터베이스 쿼리, 파일 시스템 접근 등)을 async로 처리하면 동시성을 높일 수 있습니다.
  3. 다중 프로세싱: FastAPI와 Uvicorn에서 다중 워커를 설정하여 여러 프로세스가 동시에 요청을 처리하도록 설정합니다.
    • Uvicorn 워커 설정:
      uvicorn main:app --workers 4
     
    • 워커 수를 늘리면 더 많은 요청을 동시에 처리할 수 있습니다.

 


4. 비동기 작업 큐 구현

예제: 비동기 작업 큐 구현

대량의 요청을 처리할 때, 큐를 사용하여 작업을 비동기적으로 처리하는 방법을 설명합니다.

import asyncio
from fastapi import FastAPI, BackgroundTasks

app = FastAPI()

# 비동기 작업을 백그라운드에서 처리
async def async_task(message: str):
    await asyncio.sleep(5)  # 5초 후에 완료
    print(f"Task completed: {message}")

# 백그라운드 작업 처리 엔드포인트
@app.post("/background_task")
async def background_task(message: str, background_tasks: BackgroundTasks):
    background_tasks.add_task(async_task, message)
    return {"message": "Task submitted"}
 

설명:

  • BackgroundTasks: FastAPI에서 비동기 작업을 백그라운드에서 처리할 수 있게 해주는 기능.
  • 클라이언트는 비동기 작업이 완료되기 전에 응답을 받을 수 있으며, 서버는 작업을 백그라운드에서 처리합니다.

백그라운드 작업 테스트:

curl -X POST "http://127.0.0.1:8000/background_task" -d "message=Hello World"
 

서버는 즉시 응답하고, 5초 후 작업이 완료되었다는 메시지가 출력됩니다.


5. 성능 테스트 및 모니터링

1. 성능 테스트 도구:

  • locust: 대규모 성능 테스트를 위한 오픈 소스 도구로, FastAPI 서버에 대량의 요청을 보내 성능을 측정합니다.
    pip install locust
  • locustfile.py 예시:
    from locust import HttpUser, task
    
    class LoadTestUser(HttpUser):
        @task
        def async_process(self):
            self.client.get("/async_process")
    • 서버에서 대량의 비동기 요청을 처리하는 성능을 확인할 수 있습니다.

 

 

2. 성능 모니터링:

  • Uvicorn 로그: Uvicorn 서버는 기본적으로 요청 처리 시간과 응답 시간을 로그로 제공합니다. 이를 활용해 병목 현상과 비동기 처리의 성능을 모니터링할 수 있습니다.

마무리 및 추가 학습

  • 이번 강의에서는 FastAPI에서 비동기 작업을 처리하는 방법을 학습하고, 실시간으로 많은 요청을 처리할 수 있는 성능 최적화 전략을 살펴봤습니다.
  • 다음 강의에서는 데이터베이스 연동과 비동기 쿼리 처리를 다룰 예정입니다.
728x90