
참여 중인 프로젝트에서 스케줄링을 위해 Celery를 사용한다. 옆 프로젝트에서 사용한다기에 어깨 너머로 얼핏 얼핏 듣긴 했는데 도저히 뭔지, 어떻게 쓰는지 몰랐다. 이번 기회에 사용법을 익혀보고자 한다.
마찬가지로 공식 문서를 번역하면서 작성하므로 의역/오역이 상당히 많을 수 있다. 😞😞😞
Task Queue는 스레드 또는 머신에 작업을 분산시키기 위한 메커니즘이다. task라는 하나의 작업 단위를 입력으로 받는다. 전담 워커 프로세스는 새로운 작업을 수행하기 위해 태스크 큐를 지속적으로 모니터링한다.
Celery는 보통 클라이언트와 워커 사이를 중재하는 브로커를 사용하여 메시지를 통해 통신한다. 태스크를 시작하기 위해 클라이언트는 큐에 메시지를 추가하고, 브로커는 워커에게 메시지를 전달한다.
Celery 시스템은 여러 워커와 브로커들로 구성될 수 있고, 고가용성 및 수평적 확장이 가능하다.
Python으로 짜여졌지만 프로토콜 자체는 어느 언어에서든 구현할 수 있다. Node.js 환경을 위한 node-celery, node-celery-ts, PHP 환경을 위한 PHP client가 있다.
Celery는 메시지를 주고 받기 위해 메시지 전송이 필요하다. RabbitMQ와 Redis 브로커 전송 기능은 완벽하지만, 로컬 개발환경의 SQLite를 위한 다양한 실험적인 솔루션도 지원된다.
단일 머신, 다중 머신 또는 데이터 센터 간에서도 운용될 수 있다.
아래 코드에서 볼 수 있듯이 굉장히 간단하다.
from celery import Celery
app = Celery('hello', broker='amqp://guest@localhost//')
@app.task
def hello():
return 'Hello World'
Primary/Primary 또는 Primary/Replica의 방법에서 HA를 지원한다.RabbitMQ, librabbitmq 또는 최적화된 설정을 사용하여 밀리세컨드 미만의 왕복 대기 시간을 통해 분당 수백만 건의 태스크를 처리할 수 있다.Crontab을 기반으로 반복되는 이벤트에 대해 주기적인 작업을 수행할 수 있다.canvas라는 파워풀한 집합으로 구성될 수 있다.--max-tasks-per-child 옵션을 통해 메모리 또는 파일 디스크립터와 같은 리소스를 누수시키는 작업들을 방지할 수 있다.bootsteps를 통해 워커가 빌드된다. https://docs.celeryproject.org/en/stable/getting-started/introduction.html