새소식

반응형
Python/성능

[FastAPI] Celery와 RabbitMQ로 슈퍼차징하기

  • -
반응형

[FastAPI]성능 향상feat.Celery,RabbitMQ text image

FastAPI 애플리케이션을 Celery와 RabbitMQ로 슈퍼차징하기

FastAPI 애플리케이션에 Celery와 RabbitMQ를 결합하여 백그라운드 작업을 업그레이드하는 방법에 대해 다뤄보겠습니다. 대용량 이미지 처리나 데이터 분석처럼 시간이 오래 걸리는 작업을 효율적으로 관리하는 방법을 찾고 계신가요? 그렇다면 이 글이 딱 맞을 거예요!


Celery와 RabbitMQ란?

🟢 Celery: 강력한 비동기 작업 큐

Celery는 Python 기반의 비동기 작업 큐 시스템입니다. 쉽게 말해, **"이 작업을 백그라운드에서 처리해줘!"**라고 맡길 수 있는 도구죠. 예를 들어, 사용자가 웹사이트에서 이미지를 업로드했을 때, Celery가 백그라운드에서 크기 조정을 처리하도록 만들 수 있습니다.

특징:

  • 작업을 작은 단위로 분리하여 워커(worker)가 실행
  • 여러 개의 서버로 확장 가능
  • 작업 실패 시 재시도 및 결과 저장 기능 제공

🔵 RabbitMQ: 메시지를 주고받는 중재자

Celery가 효율적으로 작동하려면 메시지를 전달할 브로커가 필요합니다. RabbitMQ는 작업 요청을 안전하게 큐(queue)에 저장하고, 워커가 이를 순차적으로 처리할 수 있도록 도와주는 역할을 합니다.

특징:

  • 작업 요청을 잃어버리지 않도록 보장
  • 웹 기반 관리 화면 제공(큐 상태 모니터링 가능)
  • 서버가 갑자기 종료되더라도 메시지가 유지됨
반응형

왜 Celery와 RabbitMQ를 사용해야 할까?

현대 웹 애플리케이션에서 빠른 응답 시간은 필수입니다. 사용자가 "이미지 변환" 버튼을 눌렀을 때 10초 이상 기다린다면 불편하겠죠? 이런 무거운 작업을 백그라운드로 넘기고, 사용자에게 빠르게 응답할 수 있도록 Celery와 RabbitMQ를 활용합니다.

✅ Celery vs FastAPI의 기본 백그라운드 작업

FastAPI에도 백그라운드 작업을 처리하는 기능이 있지만, 몇 가지 한계가 있습니다:

  • FastAPI 백그라운드 작업은 API 서버에 종속되어 서버가 꺼지면 작업도 중단됨.
  • 확장성 부족: 여러 서버에서 작업을 분산할 수 없음.
  • 결과 저장 기능 없음: 실행된 작업의 결과를 저장할 수 없음.

반면, Celery는:

  • 여러 개의 워커(worker)로 확장 가능
  • 서버가 여러 대라도 분산 처리 가능
  • 결과를 저장하고 나중에 확인 가능

RabbitMQ 설정하기

RabbitMQ를 쉽게 설치하려면 Docker를 사용하는 것이 편합니다. 먼저 RabbitMQ 컨테이너를 실행해볼까요?

🛠️ RabbitMQ 설치 및 실행

docker pull rabbitmq:3-management
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management

RabbitMQ 관리 UI에 접속하려면 브라우저에서 http://localhost:15672/로 이동하세요.

  • 기본 로그인 정보: ID: guest / PW: guest

FastAPI와 Celery & RabbitMQ 통합하기

이제 Celery를 FastAPI와 연결하고, 이미지 크기 조정을 백그라운드에서 처리하는 예제를 만들어 보겠습니다.

🛠️ 1. 의존성 설치

pip install fastapi celery pillow
  • fastapi: API 서버
  • celery: 백그라운드 작업 처리
  • pillow: 이미지 크기 조정을 위한 라이브러리

🛠️ 2. Celery 설정 (celery_main.py)

from celery import Celery
from PIL import Image
import io

celery_app = Celery(
    "celery_main",
    broker="amqp://guest:guest@localhost:5672//",
    backend="rpc://"
)

celery_app.conf.update(result_expires=3600)  # 결과는 1시간 후 만료

@celery_app.task
def resize_image_task(image_data: bytes, width: int, height: int):
    img = Image.open(io.BytesIO(image_data))
    resized_img = img.resize((width, height))
    output = io.BytesIO()
    resized_img.save(output, format="PNG")
    print(f"Image resized to {width}x{height}")
    return {"width": width, "height": height, "status": "resized"}

🛠️ 3. FastAPI 앱 만들기 (main.py)

from fastapi import FastAPI, UploadFile
from celery.result import AsyncResult
from celery_main import resize_image_task

app = FastAPI()

@app.post("/resize-image/")
async def resize_image(file: UploadFile, width: int = 100, height: int = 100):
    image_data = await file.read()
    task = resize_image_task.delay(image_data, width, height)
    return {"task_id": task.id}

@app.get("/task-status/{task_id}")
async def get_task_status(task_id: str):
    task_result = AsyncResult(task_id)
    return {"task_id": task_id, "status": task_result.status, "result": task_result.result}

🛠️ 4. 실행하기

1️⃣ Celery 워커 실행

celery -A celery_main.celery_app worker --loglevel=info

2️⃣ FastAPI 서버 실행

uvicorn main:app --reload

API 테스트하기

🔹 이미지 크기 조정 요청 (POST /resize-image/)

{
  "task_id": "629071be-b12e-45f1-a796-347a941b4a39"
}

🔹 작업 상태 확인 (GET /task-status/{task_id})

🟡 처리 중일 때:

{
  "task_id": "629071be-b12e-45f1-a796-347a941b4a39",
  "status": "PENDING",
  "result": null
}

🟢 완료 시:

{
  "task_id": "418afe12-1e78-49cd-b335-59f189325be5",
  "status": "SUCCESS",
  "result": {
    "width": 100,
    "height": 100,
    "status": "resized"
  }
}

마무리하며 🎯

FastAPI에 Celery와 RabbitMQ를 결합하면 백그라운드 작업이 훨씬 강력해집니다. 사용자는 빠른 응답을 받을 수 있고, 서버는 안정적으로 이미지 처리 같은 무거운 작업을 실행할 수 있죠.

📌 이번 예제를 바탕으로 여러분의 프로젝트에도 적용해보세요.

 

 

같이보면 좋은글

Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법

 

Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법

Python 코드가 느려서 답답한 경험, 누구나 한 번쯤 있죠? 제가 사용한 주요 Python 성능 최적화 방법들을 공유하려고 합니다. 이 방법들을 통해 여러분도 Python 스크립트를 빠르게 만들 수 있을 것

intelloper.tistory.com

MongoDB 성능 개선! 빠른 속도 튜닝!을 위한 DB 인덱싱 적용 db.collection.createIndex

 

MongoDB 성능 개선! 빠른 속도 튜닝!을 위한 DB 인덱싱 적용 db.collection.createIndex

인덱싱은 데이터베이스 성능 최적화의 핵심이며, 제대로 사용하면 쿼리 속도를 크게 향상시킬 수 있습니다. MongoDB 인덱싱이란?인덱싱은 데이터베이스 테이블의 검색 속도를 향상시키기 위해

intelloper.tistory.com

FastAPI와 함께하는 SOLID 원칙: Python으로 깔끔한 코드 작성하기

 

FastAPI와 함께하는 SOLID 원칙: Python으로 깔끔한 코드 작성하기

소프트웨어 설계에서 중요한 SOLID 원칙을 FastAPI와 Python을 활용해 어떻게 적용할 수 있는지 알아보겠습니다. 🚀SOLID는 로버트 C. 마틴(일명 "Uncle Bob")이 제안한 5가지 설계 원칙으로, 코드를 더 깔

intelloper.tistory.com

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.