리셋 되지 말자

celery 분리 구성 [1] 본문

프로젝트

celery 분리 구성 [1]

kyeongjun-dev 2021. 12. 15. 11:51

django server와 celery server를 분리하기위해 고민하고 고생했던걸 기록했습니다. 틀릴 수도 있습니다. 아니 틀릴 확률이 매우 높습니다.

 

Django 프로젝트에서의 celery 구조

현재 사용하고 있는 django 프로젝트 구조는 아래와 같다. 현재 csapi라는 app이 등록된 상태이다.

django/
├── config
│   ├── asgi.py
│   ├── celery.py        
│   ├── __init__.py      
│   ├── settings.py      
│   ├── urls.py
│   └── wsgi.py
├── csapi
│   ├── admin.py
│   ├── apps.py   
│   ├── forms.py
│   ├── models.py        
│   ├── tasks.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── Dockerfile
├── manage.py
└── templates
    └── csapi
        ├── image_show.html
        ├── main.html
        └── upload.html

 

여기서 celery 관련 파일만 추려보면 아래와 같다.

django/
├── config
│   ├── celery.py        
│   ├── __init__.py      
│   ├── settings.py      
├── csapi      
│   ├── tasks.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── requirements.txt

 

settings를 이용한 Celery 설정

보통은 아래와 같이 broker에 관련된 정보들을 settings.py에 입력하고 celery.py에서 settings.py에 설정한 내용을 가져오는 식으로 많이 사용한다. __init.py__는 django가 실행될 때 celery를 로드하게 된다.

- settings.py

# celery setting
BROKER_URL = os.environ['BROKER_URL']
BROKER_USER = os.environ['BROKER_USER']
BROKER_PASSWORD = os.environ['BROKER_PASSWORD']

 

- celery.py

import os
from celery import Celery
from django.conf import settings

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')

BROKER_URL = os.environ['BROKER_URL']
BROKER_USER = os.environ['BROKER_USER']
BROKER_PASSWORD = os.environ['BROKER_PASSWD']

app = Celery('config')
app.config_from_object('django.conf:settings', namespace='CELERY')

# app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
app.autodiscover_tasks()

 

- __init__.py

from .celery import app as celery_app

__all__ = ('celery_app',)

 

settings를 사용하지 않는 Celery 설정

settings.py에 broker정보를 입력하지 않고 그냥 celery.py에 설정했다. autodiscover_tasks() 는 django에 등록된 app에 있는 task를 자동으로 수집한다. 수집하는 방식은 공식문서에서 찾아보면 <app이름>.tasks.py 에 등록된 task를 수집한다고 언급되어 있다. 현재 csapi app이 등록된 상태이므로, csapi.tasks.py 에 등록된 task를 자동으로 수집한다.

- celery.py

import os
from celery import Celery
from django.conf import settings

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')

BROKER_URL = os.environ['BROKER_URL']
BROKER_USER = os.environ['BROKER_USER']
BROKER_PASSWORD = os.environ['BROKER_PASSWD']

app = Celery('config', backend='rpc://', broker=f'amqp://{BROKER_USER}:{BROKER_PASSWORD}@{BROKER_URL}:5672//')

# app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
app.autodiscover_tasks()

 

 

task와 shared_task 차이

현재 csapi/tasks.py 파일 내용은 아래와 같이 shared_task 데코레이터를 사용하여 task를 선언했다.

- csapi/tasks.py

from celery import shared_task

@shared_task
def test_task():
    print('connect test task')
    return 'test'

 

이를 task로 변경하면 아래와 같다.

from ..config.celery import app

@app.task
def test_task():
    print('connect test task')
    return 'test'

 

이처럼 shared task는 app 인스턴스를 import 하지 않아도 task를 만들어서 사용할 수 있게 해준다.

Comments