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의 목적에 대해 더 생각을 하게 되었다.
참고 링크