Python

Flask - Celery - 비동기 처리하기

foxlee 2022. 2. 7. 12:52

Celery 

  • Python 동시성 프로그래밍에서 가장 많이 사용하는 방법 중 하나이며, 분산 메시지 전달을 기반으로 동작하는 비동기 작업 큐(Asynchronous Task/Job Queue)
  • 웹서버레벨에서 모든것을 다 처리하기엔 부담이 크거나, 외부의 모듈과 협업해야 할 때, 즉 비동기적으로 요청에 대한 부하를 외부에 전가
  • Celery client: Flask app 에서 celery 백그라운드 잡을 실행시키기 때문에 Flask app이 됨
  • Celery workers: 백그라운드 잡을 실행하는 프로세스들. local, remote workers들이 있고, 확장가능함
  • Message broker. Celery client(Flask App)에서 Celery workers과 통신, RabbitMQ and Redis.

docker-copmose 

  worker:
    build:
      context: ./flask
    hostname: worker
    entrypoint: celery
    command: -A celery_worker.celery worker --loglevel=info -f ./celery.logs
    volumes:
      - ./flask/celery.logs:/usr/src/flask_app/celery.logs

Celery-worker

  • celery worker -A celery_worker.celery --loglevel=info  -> 워커 실행(celery_worker.py 의 celery) flask app와 연결해줌
# ./celery_worker.py
#!/usr/bin/env python
import os
from app import celery, create_app

app = create_app()
app.app_context().push()

logging

이슈사항

  • config key name: 버전이 업데이트 되면서 환경 설정 시 참조하는 키가 변경됨 
    • celery.conf.update(app.config) - config 클래스 변수를 CELERY_BROKER_URL, CELERY_RESULT_BACKEND -> 
      broker_url, result_backend

Celery 적용 후기

  • 4년 전쯤 처음 프로그래밍을 시작하면서 파이썬 프로젝트를 진행할때도 Celery를 적용했던 기억이 난다. 그때는 메일 보내는 작업을 비동기로 처리하기 위해서 사용했었다. 이번과 많이 다른 점은 디버깅 스킬이 향상된 것과 Celery의 목적에 대해 더 생각을 하게 되었다.

참고 링크