Celery로 하는 비동기 작업 개발
참고
celery 공식 문서
Task Queue
- 스레드 또는 머신에 작업을 분산시키기 위한 메커니즘
- task 라는 하나의 작업 단위를 입력으로 받는다.
- 전담 워커 프로세스는 새로운 작업을 수행하기 위해 태스크 큐를 지속적으로 모니터링 한다.
- Celery는 클라이언트와 워커 사이를 중재하는 브로커를 사용하며 메시지를 통해 통신한다.
- 클라이언트는 태스크를 시작하기 위해 큐에 메시지를 추가하고,
브로커는 워커에게 메시지를 전달한다.
→ Python으로 짜여졌지만, 프로토콜 자체는 어느 언어에서든 구현할 수 있다.
→ celery는 메시지를 주고 받기 위해 메시지 전송이 필요하다. RabbitMQ와 Redis 브로커 전송 기능은 완벽하지만, 로컬 개발환경의 SQLite를 위한 다양한 실험적인 솔루션도 지원된다.
특징
- 간단하다. — 환경 설정 파일이 필요 없기 때문에 사용 및 유지가 쉽다.
- 고가용성 워커와 클라이언트는 커넥션이 유실되거나 실패했을 때 자동으로 retry한다. 몇몇 브로커는 Primary/Primary 또는 Primary/Replica 의 방법에서 HA를 지원한다.
- 빠르다. 단일 Celery 프로세스는 RabbitMQ, librabbitmq 또는 최적화된 설정을 사용하여 밀리 세컨드 미만의 왕복 대기 시간을 통해 분당 수백만 건의 태스크를 처리할 수 있다.
- 유연하다. Celery의 거의 모든 부분을 자체적으로 확장하거나 사용할 수 있다. → Custom Pool 구현, serializers, compression schemes, logging, schedulers, consumers, producers, broker transports
Celery가 지원하는 것
- 브로커 Rabbit MQ, Redis — Amazon SQS 등
- 동시성 (Concurrency) Prefork(멀티 프로세싱) — Eventlet, gevent, thread(멀티스레딩), solo(단일스레딩)
- 결과 스토어 (Result Stores) AMQP, Redis
- Memcached
- SQLAlchemy, Django ORM
- Apache Cassandra, Eleastic Search, Riak
- MongoDB, CouchDB, Couchbase, ArangoDB
- Amazon DynamoDB, Amazon S3
- Microsoft Azure BlockBlob, Microsoft Azure CosmosDB
- 파일 시스템
- Serialization pickle, json, yaml, msgpack
- zlib, bzip2 압축
- Cryptographic message signing
기능
- 모니터링 이벤트 모니터링 스트림은 워커가 생성하며 내장 또는 외부 툴에서 클러스터가 수행중인 작업을 실시간으로 알려주는 데에 사용된다.
- 스케줄링 초 단위 또는 일시로 태스크 수행할 시간을 정할 수 있다. Crontab 을 기반으로 반복되는 이벤트에 대해 주기적인 작업을 수행할 수 있다.
- 워크 플로우 grouping, chaining, chunking 등을 포함하여 canvas 라는 파워풀한 집합으로 구성될 수 있다.
- 리소스 누수 방지 — max-tasks-per-child 옵션을 통해 메모리 또는 파일 디스크립터와 같은 리소스를 누수시키는 작업을 방지할 수 있다.
- 시간 & 속도 제한 초당, 분당, 시간당 얼마나 많은 태스크를 수행할지 설정할 수 있다. 각 태스크 유형 또는 특정 워커에 대해 기본 값을 설정할 수 있다.
- 사용자 컴포넌트 각 워커 컴포넌트는 커스터 마이징 할 수 있고, 추가적으로 컴포넌트를 정의할 수 있다. 워커 내부를 세밀하게 제어할 수 있는 의존성 그래프인 bootsteps 를 통해 워커가 빌드 된다.
셀러리 이용 사례
- Celery를 이용한 긴 작업 처리
- Celery 첫 걸음마 떼기
- Django + AI 아키텍처