Skip to main content

파이썬으로 전문가 수준의 작업 큐: Celery, RabbitMQ, Redis 활용법

Summary

AI 클립으로 정리됨

출처 및 참고 : https://www.youtube.com/watch?v=0gtdUkEzzn4

핵심 요약

비동기 처리, 작업 예약, 분산 작업을 파이썬에서 구현하려면 Celery, RabbitMQ, Redis가 핵심입니다. Docker 환경을 활용하면 복잡한 셋업도 쉽게 구축할 수 있습니다. 실무에서는 API 호출, 대용량 데이터 처리, 웹 백엔드 등 다양한 분야에서 아주 유용하게 쓰입니다.

비동기 작업 처리란 무엇인가요?

동기 방식에서는 모든 작업이 순서대로 진행되면서 기다려야 하지만, 비동기 작업 처리 시스템에서는 여러 작업을 동시에 백그라운드에서 진행할 수 있습니다. 대표적으로 사용되는 Celery는 파이썬에서 비동기/동시 작업 처리를 쉽고 안정적으로 구현할 수 있게 해줍니다.

Celery의 구조와 역할

Celery는 클라이언트, 워커(worker), 메시지 브로커(broker), 그리고 결과 백엔드(result backend) 4가지 구성요소로 이루어집니다.

  • 클라이언트: 실행할 작업을 메시지 큐로 보냄

  • 워커: 큐에서 작업을 가져와 실제 처리

  • 브로커: 클라이언트와 워커 사이를 연결하는 역할

  • 결과 백엔드: 작업 결과를 저장

RabbitMQ vs Redis: 메시지 브로커의 차이

RabbitMQ는 메시지의 안정적인 전달과 복구 기능 등 다양한 고급 기능이 있습니다. Redis는 훨씬 간단하고 빠르지만, 메시지 손실 방지 등의 고급 기능은 부족합니다. 상황에 따라 둘 중 적합한 것을 선택하면 됩니다.

결과 저장 백엔드란?

작업 결과를 어디에 저장할지는 선택할 수 있습니다. 예시: Redis, PostgreSQL, Amazon S3, 메모리 등 실전에서는 결과 저장소 유형을 상황에 따라 결정합니다.

Docker Compose로 환경 쉽게 구축하기

개별적으로 RabbitMQ, Redis, Celery를 설치하기보다, Docker Compose로 통합 환경을 빠르게 구성할 수 있습니다. 예시:

  1. docker-compose.yml 에 RabbitMQ, Redis, Celery, 클라이언트 서비스 추가

  2. .env 파일에 환경변수(계정, 연결주소, API키 등) 관리

  3. 각 서비스의 health check와 데이터 영속성 설정

간단한 작업 예시: 랜덤 숫자 생성

간단한 Celery 사용법:

  • worker.py:

from celery import Celery
app = Celery("random_number", broker=..., backend=...)
@app.task
def random_number(max_value):
    # 5초 후 0 ~ max_value 중 랜덤 숫자 리턴
    ...
  • client.py:

from worker import random_number
result = random_number.delay(100)
while not result.ready():
    print("기다리는 중…")
print("최종 결과:", result.get())

OpenAI API 등 외부 서비스와 연결

Celery는 API 호출, 복잡한 데이터 처리 등 실전 업무에 활용되는 비동기 작업에도 적합합니다. 예를 들어, 영화 정보를 OpenAI API로 받아오는 작업을 Celery로 비동기 처리할 수 있습니다.

작업 모델 분할 처리: 그룹과 코드 활용

복잡한 대형 데이터 모델은 작업을 여러 부분으로 쪼개 병렬 처리한 뒤, 마지막에 전체 결과를 합칠 수 있습니다. Celery의 group, chord 기능을 활용하면 여러 작업을 동시에 실행하고, 최종 결과를 하나로 합칠 수 있습니다.

from celery import group, chord
tasks = group([task1.s(arg), task2.s(arg), task3.s(arg)])
result = chord(tasks)(merge_result.s())

작업 예약: Celery Beat 활용법

정기적인 작업이 필요할 땐 Celery Beat를 추가하면 됩니다. 예시: 매일 오후 3시 45분에 특정 작업 실행, 10초마다 파일에 타임스탬프 기록 등

from celery.schedules import crontab
app.conf.beat_schedule = {
    'every-10-seconds': {
        'task': 'write_timestamp',
        'schedule': 10.0,
    },
    'daily-task': {
        'task': 'daily_report',
        'schedule': crontab(minute=45, hour=15),
    }
}

Django와의 통합

Django 프로젝트에서 Celery를 쓰면 웹 요청으로 비동기 작업 수행, 작업 상태 조회, 결과 확인이 가능합니다.

  • Django 설정에서 Celery 연동

  • Django DB를 결과 백엔드로 활용

  • 뷰에서 비동기 작업 실행 및 상태 표시

인사이트

실전에선 Celery와 메시지 브로커, 백엔드 선택이 프로젝트 상황마다 다릅니다. Docker Compose를 쓰면 환경 셋업이 훨씬 수월해지고, 다양한 작업 분산/비동기/예약 문제를 유연하게 해결할 수 있습니다. 조언: 처음 배우는 단계라면 RabbitMQ, Redis, Docker, Celery의 각각을 미니 프로젝트로 실험해보고, 실제 프로젝트에서는 Docker Compose로 전체 구조를 효율적으로 설계하세요. 작업 예약, API 비동기 호출, 대용량 처리 등 실무 문제를 직접 해결해보면 훨씬 쉽게 개념이 잡힙니다. 세팅이 어렵다면 공식 예제와 깃허브 자료를 참고하세요!

출처 및 참고 :

이 노트는 요약·비평·학습 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.