Celery

marco x brown·2020년 3월 7일
4
post-thumbnail

참여 중인 프로젝트에서 스케줄링을 위해 Celery를 사용한다. 옆 프로젝트에서 사용한다기에 어깨 너머로 얼핏 얼핏 듣긴 했는데 도저히 뭔지, 어떻게 쓰는지 몰랐다. 이번 기회에 사용법을 익혀보고자 한다.

마찬가지로 공식 문서를 번역하면서 작성하므로 의역/오역이 상당히 많을 수 있다. 😞😞😞

Task Queue란?

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

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

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

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

무엇이 필요한가?

Celery는 메시지를 주고 받기 위해 메시지 전송이 필요하다. RabbitMQRedis 브로커 전송 기능은 완벽하지만, 로컬 개발환경의 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
개발자로 크는 중

0개의 댓글