Celery

Sang Jun Lee·2020년 9월 6일
0

기업 협업 진행중 API를 주기적으로 가져와 업데이트를 해야할 일이 생겨 찾아보게되었다.

Task Queue란?
Task Queue는 스레드 또는 머신에 작업을 분산시키기 위한 메커니즘이다. task라는 하나의 작업 단위를 입력으로 받는다. 전담 워커 프로세스는 새로운 작업을 수행하기 위해 태스크 큐를 지속적으로 모니터링한다.

Celery는 보통 클라이언트와 워커 사이를 중재하는 브로커를 사용하여 메시지를 통해 통신한다. 태스크를 시작하기 위해 클라이언트는 큐에 메시지를 추가하고, 브로커는 워커에게 메시지를 전달한다.

Celery 시스템은 여러 워커와 브로커들로 구성될 수 있고, 고가용성 및 수평적 확장이 가능하다.

Python으로 짜여졌지만 프로토콜 자체는 어느 언어에서든 구현할 수 있다. Node.js 환경을 위한 node-celery, node-celery-ts, PHP 환경을 위한 PHP client가 있다.

무엇이 필요한가?
Celery는 메시지를 주고 받기 위해 메시지 전송이 필요하다. RabbitMQ와 Redis 브로커 전송 기능은 완벽하지만, 로컬 개발환경의 SQLite를 위한 다양한 실험적인 솔루션도 지원된다.

단일 머신, 다중 머신 또는 데이터 센터 간에서도 운용될 수 있다.

우리 Celery는요.
간단하다.

  • 환경설정 파일이 필요없기 때문에 사용 및 유지가 쉽다.
    아래 코드에서 볼 수 있듯이 굉장히 간단하다.

from celery import Celery

app = Celery('hello', broker='amqp://guest@localhost//')

@app.task
def hello():
return 'Hello World'
고가용성 (Highly Available, HA)

  • 워커와 클라이언트는 커넥션이 유실되거나 실패했을 때 자동으로 retry한다. 몇몇 브로커는 Primary/Primary 또는 Primary/Replica의 방법에서 HA를 지원한다.
    빠르다.
  • 단일 Celery 프로세스는 RabbitMQ, librabbitmq 또는 최적화된 설정을 사용하여 밀리세컨드 미만의 왕복 대기 시간을 통해 분당 수백만 건의 태스크를 처리할 수 있다.
    유연하다.
  • Celery의 거의 모든 부분을 자체적으로 확장하거나 사용할 수 있다.
    Custom Pool 구현, serializers, compression schemes, logging, schedulers, consumers, producers, broker transports, 기타 등등
    Celery가 지원하는 건,
    브로커
  • RabbitMQ, Redis
    Amazon SQS 등
    동시성 (Concurrency)
  • prefork (멀티프로세싱)
    Eventlet, gevent
    thread (멀티스레딩)
    solo (단일스레딩)
    결과 스토어 (Result Stores)
  • AMQP, Redis
    Memcached
    SQLAlchemy, Django ORM
    Apache Cassandra, Elasticsearch, Riak
    MongoDB, CouchDB, Couchbase, ArangoDB
    Amazon DynamoDB, Amazon S3
    Microsoft Azure Block Blob, Microsoft Azure Cosmos DB
    파일 시스템
    Serialization
  • pickle, json, yaml, msgpack
    zlib, bzip2 압축
    Cryptographic message signing
    기능
    모니터링
    이벤트 모니터링 스트림은 워커가 생성하며 내장 또는 외부 툴에서 클러스터가 수행 중인 작업을 실시간으로 알려주는데에 사용된다.
    스케줄링
    초 단위 또는 일시로 태스크를 수행할 시간을 정할 수 있다. Crontab을 기반으로 반복되는 이벤트에 대해 주기적인 작업을 수행할 수 있다.
    워크-플로우
    grouping, chaining, chunking 등을 포함하여 canvas라는 파워풀한 집합으로 구성될 수 있다.
    리소스 누수 방지
    --max-tasks-per-child 옵션을 통해 메모리 또는 파일 디스크립터와 같은 리소스를 누수시키는 작업들을 방지할 수 있다.
    시간 & 속도 제한
    초당, 분당, 시간당 얼마나 많은 태스크를 수행할지 설정할 수 있다. 각 태스크 유형 또는 특정 워커에 대해 기본값을 설정할 수 있다.
    사용자 컴포넌트
    각 워커 컴포넌트는 커스터마이징할 수 있고, 추가적으로 컴포넌트를 정의할 수 있다. 워커 내부를 세밀하게 제어할 수 있는 의존성 그래프인 bootsteps를 통해 워커가 빌드된다.
    https://docs.celeryproject.org/en/stable/getting-started/introduction.html
profile
Live now and Dream better tomorrow

0개의 댓글