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
- celery workers 실행
- https://stackoverflow.com/questions/50019948/reuse-image-built-by-one-service-in-another-service/50025029
- https://stackoverflow.com/questions/63405314/dockercompose-build-one-image-and-run-multiple-containers
- https://hackmd.io/@samueltseng/Flask-Celery-DockerCompose
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
- https://buildabetterworld.tistory.com/146
- https://stackoverflow.com/questions/17366579/celery-logs-into-file
- https://docs.celeryproject.org/en/latest/userguide/tasks.html#logging
이슈사항
- config key name: 버전이 업데이트 되면서 환경 설정 시 참조하는 키가 변경됨
- celery.conf.update(app.config) - config 클래스 변수를
CELERY_BROKER_URL, CELERY_RESULT_BACKEND->
broker_url, result_backend
- celery.conf.update(app.config) - config 클래스 변수를
Celery 적용 후기
- 4년 전쯤 처음 프로그래밍을 시작하면서 파이썬 프로젝트를 진행할때도 Celery를 적용했던 기억이 난다. 그때는 메일 보내는 작업을 비동기로 처리하기 위해서 사용했었다. 이번과 많이 다른 점은 디버깅 스킬이 향상된 것과 Celery의 목적에 대해 더 생각을 하게 되었다.
참고 링크
- Flask doc - https://flask.palletsprojects.com/en/1.1.x/patterns/celery/
- 아주 간단한 예제가 소개되어 있음
- Miguel Blog - https://blog.miguelgrinberg.com/post/using-celery-with-flask
- Flask를 처음 공부할때부터 자주 참고한 Miguel의 블로그에서 celery 관한 글
- 내 프로젝트에 적용하면서 전체적인 파일 구조를 조금 수정했는데 해당 글이 오래되다 보니 현재 버전과는 안 맞는 부분이 있었음 (이슈사항 - config key name)
- Celery documentation - https://docs.celeryproject.org/en/stable/