1. Introduction to Celery
1. What’s a Task Queue?
- 태스크 큐는 스레드 또는 시스템 간 작업을 분산하는 메커니즘으로 사용된다.
- 태스크 큐의 입력은 태스크라고 하는 작업 단위(Unit of Work)이다.
- 워커 프로세스는 수행할 새 작업에 대해 태스크 큐를 지속적으로 모니터링한다.
- Celery는 일반적으로 브로커를 사용하여 클라이언트와 워커 사이를 중재하는 메시지를 통해 통신한다.
- 클라이언트가 큐에 메시지를 추가하는 태스크를 시작하기 위해 브로커는 해당 메시지를 워커에게 전달한다.
- Celery 시스템은 여러 워커와 브로커로 구성될 수 있으므로 고가용성과 수평적 확장이 가능하다.
- Celery는 Python으로 작성되었지만, 프로토콜은 모든 언어로 구현할 수 있다.
2. What do I need?
- Celery는 메시지를 보내고 받으려면 메시지 전송이 필요하다.
- 이때 일반적으로 RabbitMQ 및 Redis 브로커를 사용하여 메시지 전송을 수행한다.
3. Celery is
1) Simple
- Celery는 사용 및 유지 관리가 쉽고 구성 파일이 필요하지 않다.
- 다음의 코드는 간단한 애플리케이션을 생성하는 예시이다.
from celery import Celery
app = Celery("hello", broker="amqp://guest@localhost//")
@app.task
def hello():
return "hello world"
2) Highly Available
- 워커와 클라이언트는 연결이 끊어지거나 실패하는 경우 자동으로 재시도하며, 일부 브로커는 Primary/Primary 또는 Primary/Replica 복제 방식으로 HA를 지원한다.
3) Fast
- RabbitMQ, librabbitmq 및 최적화된 설정을 사용하는 경우 단일 Celery 프로세스는 밀리초 미만의 왕복 대기 시간으로 분당 수백만 개의 태스크를 처리할 수 있다.
4) Flexible
- Celery의 거의 모든 부분을 자체적으로 확장하거나 사용할 수 있으며, 사용자 정의 풀 구현, 직렬 변환기, 압축 체계, 로깅, 스케줄러, 소비자, 생산자, 브로커 전송 등을 사용할 수 있다.
4. It supports
1) Brokers
- RabbitMQ
- Redis
- Amazon SQS 등
2) Concurrency
- prefork(multiprocessing)
- Eventlet
- gevent
- thread(multithreaded)
- solo(single threaded)
3) Result Stores
- AMQP
- Redis
- Memcached
- SQLAlchemy
- Django ORM
- MongoDB
- File System 등
4) Serialization
- pickle
- json
- yaml
- msgpack 등
5. Features
1) Monitoring
- 모니터링 이벤트 스트림은 워커가 내보내고, 내장 및 외부 도구에서 사용하여 클러스터가 수행하는 작업을 실시간으로 알려준다.
2) Work-flows
- 단순하고 복잡한 워크플로우는 그룹화, 연결, 청크 등을 포함하고, “캔버스”라고 하는 강력한 기본 요소 집합을 사용하여 구성할 수 있다.
3) Time & Rate Limits
- 초/분/시간당 실행할 수 있는 태스크 수 또는 태스크를 실행할 수 있는 시간을 제어할 수 있으며, 특정 워커 또는 각 태스크 유형에 대해 개별적으로 기본값을 설정할 수 있다.
4) Scheduling
- 태스크를 실행할 시간을 초 또는 날짜/시간으로 지정하거나 간단한 간격을 기반으로 반복되는 이벤트에 대한 주기적인 태스크를 사용할 수 있다.
5) Resource Leak Protection
--max-tasks-per-child
옵션은 제어할 수 없는 메모리 또는 파일 설명자와 같은 리소스를 누출하는 사용자 태스크에 사용된다.
6) User Components
- 각 워커 구성 요소는 사용자 지정할 수 있으며, 또한 추가 구성 요소를 사용자가 정의할 수 있다.
- 워커는 워커의 내부를 세밀하게 제어할 수 있는 종속성 그래프인 “bootsteps”를 사용하여 구축된다.
6. Installation
- Python 패키지 인덱스(PyPI) 또는 소스에서 Celery를 설치할 수 있다.
7. Bundles
- Celery 및 특정 기능에 대한 종속성을 설치하는 데 사용할 수 있는 번들 그룹을 정의한다.
- 요구 사항(Requirements)이나
pip
명령에서[]
(대괄호)를 사용하여 지정할 수 있다. - 여러 번들은
,
(콤마)로 구분하여 지정할 수 있다.
- 사용 가능한 번들은 다음과 같다.
1] Serializers
celery[auth]
celery[msgpack]
celery[yaml]
2] Concurrency
celery[eventlet]
celery[gevent]
3] Transports and Backends
celery[librabbitmq]
celery[redis]
celery[sqs]
celery[memcache]
celery[django]
등