이번에 한창 개발중인 프로젝트에서
백그라운드로 작업을 수행해야하는 기능이 있어 celery를 이용하게 되었습니다.
간단하게 celery에 대해 정리도 해보고, 비동기 작업에 대해서 공부도 할 겸 글을 작성하게 되었습니다.
Celery는 Python 동시성 프로그래밍에서 가장 많이 사용하는 방법 중 하나이며, 분산 메시지 전달을 기반으로 동작하는 비동기 작업 큐(Asynchronous Task/Job Queue)입니다.
비동기 작업은 즉각적인 결과(응답)를 제공하기 어려운 작업을 수행할 때 활용할 수 있습니다.
예를 들어 대용량 작업을 동시에 처리하거나 사용자 요청(HTTP)에 무거운 연산이 포함되는 경우를 들 수 있습니다.보통 비동기 작업을 요청하고 나면, 즉시 응답을 받지 않아도 계속 다른 일을 수행할 수 있기 때문에 동시 작업이 가능합니다.
하지만 작업마다 소요되는 시간도 다르고, 실행 환경도 달라 중복 작업이 발생하지 않아야 하며 작업이 누락되지 않도록 하는 것도 매우 중요합니다.
이는 Python Framework 라고도 하지만 보통 Worker라고 불립니다.
Worker는 웹 서비스에서 백단의 작업을 처리하는 별도의 프레임이며, 사용자에게 즉각적인 반응을 보여줄 필요가 없는 작업들로 인해 사용자가 느끼는 Delay를 최소하화기 위해 사용됩니다.
장고로 API 서버를 개발하면서 사용자 요청과 관련없이 매우 무거운 외부 API호출이나 쿼리를 실행해야하는 기능이 있는데,
이런 무거운 작업들은 Celery Task
로 정의해서 Broker(RabbitMQ)
와 Consumer(Celery Worker)
를 이용해 비동기적
으로 처리함으로써 유저에게 가능한 한 빠른 응답을 제공해줄 수 있을 것입니다.
Message Broker(메시지 브로커)
는 Publisher(송신자)
로부터 전달받은 메시지를 Subscriber(수신자)
로 전달해주는 중간 역할이며 응용 소프트웨어 간에 메시지를 교환할 수 있게 합니다. 이 때 메시지가 적재되는 공간을 Message Queue(메세지 큐)라고 합니다.
메시지 브로커는 송신자가 보낸 메시지를 메시지 큐에 적재하고 이를 수신자가 받아서 사용하는 구조를 띄며, 이러한 구조를 Pulibsh/Subscribe(pub/sub) Pattern이라고 하며, Producer/Consumer Pattern 라고도 합니다.
메시지 브로커로는 대표적으로 Redis, RabbitMQ 등이 있습니다.
celery는 작업을 브로커에게 전달하면 워커가 작업을 처리하는 구조입니다. 그렇기 때문에 celery를 사용하기 위해서는 작업 요청을 받을 브로커가 필요합니다. 여기서 브로커
란 요청한 작업을 담아두는 큐이고 담아둔 요청을 여러 개의 worker에게 적절히 분배합니다
다음 그림은 Celery의 동작 구조입니다.
Django에서 발생한 요청을 Broker(RabbitMQ)에서 받아 Celery를 이용하여 분산 처리를 진행합니다.
Celery에서는 작업이 완료되는 (특정 이벤트)에 DB Task를 수행합니다.
다음 글에서는 직접 Celery를 설치하고 이용해보겠습니다.
[Reference]
도움됐습니다!