오래 걸리는 작업은 비동기 처리 방식을 사용해 사용자가 해당 작업을 기다리지 않고 다른 작업을 진행할 수 있도록 하면 좋다. 사용자 측면에서 속도 개선을 유도할 수 있다.
Celery 는 Python 으로 작성된 분산 메시지 전달을 기반으로 한 비동기 작업 큐로, Worker 의 한 종류다.
별도로 실행 중인 Worker Process가 Broker로부터 Message를 전달 받아 작업을 대신 수행해 주는 라이브러리다.
요청을 받은 뷰에서는 Broker에게 해당 작업 실행을 위임하고 각 작업을 구분할 수 있는 Task ID 를 발급받게 된다. 해당 작업은 Broker가 놀고있는 Worker에게 넘겨서 Worker가 비동기로 수행하도록 한다.
Django 서버에서 Task를 Message Borker를 통해 전달을 하면 하나 이상의 Celery Worker가 Message Broker Queue에 있는 Task를 받아서 이를 처리한다.
Celery
를 사용하기 위해서는 Message Broker가 필요한데 대표적으로 Redis와 RabbitMQ가 있다.
디스크에 상주하는 인메모리 데이터베이스 / 컴퓨터 메모리를 이용한(in-memory) Cache 서버
Key-Value를 이용해 Celery가 처리할 작업을 Celery에 보낸 후 Cache 에서 해당 Key를 제거하는 방식으로 작동한다.
메시지 브로커이다.
응용 프로그램(applications)에게 메시지를 주고 받을 수 있으며, 메시지가 수신될 때까지 안전하게 있을 수 있도록 하는 공용 플래폼(common platform)을 제공한다.
전에 플레이리스 공유 서비스의 크롤링 기능을 Celery + RabbitMQ를 사용해서 만들었다. 지금 공부를 하고 보니 Redis로 하는 것이 더 효율적이었을 것 같다. 그 이유는 크롤링 기능이 복잡하지 않고, 속도가 중요한 기능이였고 지속성이 중요하지 않기 때문이다.