참여 중인 프로젝트에서 스케줄링을 위해 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