Celery 멀티 큐 구성과 워커 분리 전략
Django/DRF 기반 Celery 프로젝트에서 멀티 큐를 구성하고, 워커를 역할별로 분리하여 운영 효율성과 장애 대응력을 높이는 방법을 소개합니다.
Celery 멀티 큐 구성과 워커 분리 전략
Celery로 다양한 Task를 운영하다 보면, 작업의 성격과 우선순위가 달라지는 상황이 생깁니다. 예를 들어:
- 사용자 알림 이메일 전송은 빠르게 처리되어야 함
- 대용량 데이터 분석은 시간이 오래 걸리므로 별도로 실행되어야 함
이럴 때 멀티 큐(Multiple Queues) 구성과 워커 분리(Worker Segmentation) 전략을 도입하면 효율적인 운영이 가능합니다.
1. 큐 설정하기 (settings.py)
1
2
3
4
5
6
7
8
9
10
11
CELERY_TASK_QUEUES = {
"default": {},
"emails": {
"exchange": "emails",
"routing_key": "emails",
},
"heavy": {
"exchange": "heavy",
"routing_key": "heavy",
},
}
2. Task에 큐 지정하기
1
2
3
4
5
6
7
@shared_task(queue="emails")
def send_verification_email(user_id):
...
@shared_task(queue="heavy")
def generate_large_report():
...
queue
파라미터로 작업을 분류할 수 있습니다.
3. 워커 분리 실행 예시
1
2
3
4
5
6
7
8
# 이메일 관련 워커
celery -A config worker -Q emails --loglevel=info
# 무거운 분석 작업 전용 워커
celery -A config worker -Q heavy --concurrency=2 --loglevel=info
# 기본 큐용 워커
celery -A config worker -Q default --loglevel=info
- 서로 다른 큐를 별도 워커로 실행하면, 하나의 작업이 전체 시스템을 점유하는 상황을 막을 수 있습니다.
4. use_case 예시: DRF + Celery 멀티 큐 활용
- 회원가입 → 이메일 인증 →
emails
큐로 발송 - 백오피스에서 정책 통계 리포트 요청 →
heavy
큐로 전달 - 일반 사용자 요청 → 기본
default
큐에서 처리
이렇게 분리하면 각 업무 유형에 맞는 워커에서 작업을 병렬로 처리할 수 있습니다.
5. 큐별로 timeout, retry 정책 분리도 가능
1
2
3
4
5
6
@shared_task(bind=True, queue="heavy", soft_time_limit=300, max_retries=2)
def slow_task(self):
try:
... # 오래 걸리는 작업
except Exception as e:
raise self.retry(exc=e, countdown=60)
- 무거운 작업에만 제한 조건을 별도로 걸어 안정성 확보
This post is licensed under CC BY 4.0 by the author.