Django-Q는 Django 환경에서 멀티 프로세싱을 지원하는 강력한 분산 작업 큐 라이브러리입니다. 복잡한 비동기 작업이나 주기적으로 실행해야 하는 스케줄링 태스크를 처리할 때 유용하며, 다양한 메시지 브로커와 원활하게 통합됩니다. 이 가이드에서는 Django-Q의 설치 방법과 주요 메시지 브로커별 설정 구성에 대해 자세히 설명합니다.
Django-Q의 주요 특징
- 간편한 통합: Django의 설정 파일(settings.py)에서 직접 구동 환경을 관리할 수 있습니다.
- 다양한 브로커 지원: Redis, MongoDB는 물론 Amazon SQS, IronMQ 등 여러 메시지 브로커를 선택할 수 있습니다.
- 강력한 스케줄링: 단순 비동기 처리를 넘어 특정 시간에 작업을 실행하거나 반복 주기를 설정하는 기능이 내장되어 있습니다.
- 작업 모니터링: Django 관리자 페이지를 통해 작업의 성공, 실패 여부 및 상태를 직관적으로 확인할 수 있습니다.
기본 설치 및 초기 설정
먼저 pip를 사용하여 Django-Q 패키지를 설치합니다.
pip install django-q
설치가 완료되면 Django 프로젝트의 settings.py 파일 내 INSTALLED_APPS 항목에 django_q를 추가합니다.
# settings.py
INSTALLED_APPS = [
# ... 기존 앱들
'django_q',
]
이후 데이터베이스 스키마를 반영하기 위해 마이그레이션을 실행합니다.
python manage.py migrate
메시지 브로커 구성 가이드
사용 환경에 따라 적합한 메시지 브로커를 선택하여 Q_CLUSTER 설정을 구성할 수 있습니다.
1. Redis 브로커 설정 (권장)
Redis는 높은 성능과 안정성으로 인해 Django-Q에서 가장 선호되는 브로커입니다. 먼저 Redis 클라이언트를 설치해야 합니다.
pip install redis
# settings.py
Q_CLUSTER = {
'name': 'project_task_cluster',
'workers': 8,
'recycle': 500,
'timeout': 100,
'retry': 150,
'broker': 'django_q.brokers.redis_broker.Redis',
'redis': {
'host': '127.0.0.1',
'port': 6379,
'db': 0,
'password': None,
}
}
2. MongoDB 브로커 설정
NoSQL 데이터베이스인 MongoDB를 브로커로 사용하여 영속성 있는 메시지 큐를 운영할 수 있습니다.
pip install pymongo
# settings.py
Q_CLUSTER = {
'name': 'mongodb_backend_cluster',
'workers': 4,
'timeout': 60,
'broker': 'django_q.brokers.mongo.Mongo',
'mongo': {
'host': 'localhost',
'port': 27017,
'db': 'task_queue_db',
'collection': 'scheduled_tasks',
}
}
3. Django ORM 브로커 설정
별도의 외부 브로커 서버를 운영하기 어려운 소규모 프로젝트라면 Django의 기본 데이터베이스를 큐로 사용할 수 있습니다.
# settings.py
Q_CLUSTER = {
'name': 'orm_internal_cluster',
'workers': 2,
'orm': 'default',
'broker': 'django_q.brokers.orm.ORM',
}
클러스터 실행 및 상태 확인
모든 설정이 완료되었다면 다음 명령어를 통해 백그라운드 작업을 처리할 클러스터를 가동합니다.
python manage.py qcluster
실행 중인 클러스터의 통계 정보나 상태를 확인하려면 아래 명령어를 사용합니다.
python manage.py qinfo
운영 시 고려 사항
시스템 최적화를 위해 다음 사항을 점검하는 것이 좋습니다.
- 워커(Worker) 수 조정: 서버의 CPU 코어 수와 작업 부하에 맞춰 워커 프로세스 개수를 최적화하세요.
- 제한 시간 설정: 작업이 무한 루프에 빠지는 것을 방지하기 위해
timeout값을 적절히 지정해야 합니다. - 메모리 관리: 장기간 실행되는 워커의 메모리 누수를 방지하려면
recycle옵션을 활용하여 주기적으로 프로세스를 재시작하십시오.