Celery를 이용한 배치 작업 처리

개요

배치 작업은 대용량 데이터 처리와 정기적인 반복 작업에 주로 사용되는데, 이러한 작업들을 효율적으로 처리하기 위해서는 병렬 처리와 스케줄링이 필요하다. Celery는 분산 작업 큐 서비스로 알려져 있으며, 배치 작업 처리에 자주 사용된다. 이번 블로그 포스트에서는 Celery를 이용하여 배치 작업을 처리하는 방법에 대해 알아보겠다.

Celery란?

Celery는 파이썬 기반의 분산 작업 큐 서비스로, 비동기 작업 처리에 특화되어 있다. Celery는 작업자(worker)와 작업을 전담하는 큐(broker) 사이의 통신을 관리하며, 스케줄링, 동시성 제어, 실패 처리 등 다양한 기능을 제공한다. 이러한 특징들로 인해, Celery는 대규모 분산 시스템에서 배치 작업 처리에 많이 사용된다.

Celery 설정하기

Celery를 시작하기 위해 다음과 같이 필요한 설정을 정의해야 한다.

# settings.py

BROKER_URL = 'amqp://guest:guest@localhost:5672//'
CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TIMEZONE = 'Asia/Seoul'

위의 설정 파일에서 BROKER_URL은 Celery가 사용할 큐의 URL을 지정하는 것이고, CELERY_RESULT_BACKEND은 작업 결과를 저장할 백엔드를 지정한다. 그리고 CELERY_TASK_SERIALIZER, CELERY_RESULT_SERIALIZER은 작업과 결과의 시리얼라이저(Serializer)를 설정한다.

배치 작업 정의하기

Celery에서는 작업을 함수 형태로 정의하며, @task 데코레이터를 이용하여 Celery 작업으로 등록한다. 예를 들어, 다음은 1부터 n까지의 합을 계산하는 작업을 정의하는 코드이다.

# tasks.py

from celery import Celery

app = Celery('tasks', broker='amqp://guest:guest@localhost:5672//')

@app.task
def calculate_sum(n):
    return sum(range(1, n+1))

위의 코드에서 Celery 객체를 생성하고 @task 데코레이터를 이용하여 calculate_sum 함수를 Celery 작업으로 등록한다.

작업 실행하기

Celery에서 작업은 apply_async 함수를 이용하여 실행된다. 다음은 작업을 실행하는 간단한 예제 코드이다.

# main.py

from tasks import calculate_sum

result = calculate_sum.delay(100)
print(result.get())

위의 코드에서 calculate_sum 작업을 실행하고, 작업 결과를 출력한다. delay 함수를 이용하여 작업을 실행하고, get 함수를 이용하여 작업 결과를 가져온다.

스케줄링하기

Celery를 이용하여 작업을 스케줄링할 수도 있다. 이를 위해서는 추가적인 설정이 필요하다. 다음은 주기적으로 작업을 실행하는 스케줄링 설정의 예시이다.

# settings.py

CELERYBEAT_SCHEDULE = {
    'run_task_every_minute': {
        'task': 'tasks.calculate_sum',
        'schedule': timedelta(minutes=1),
        'args': (100,),
    },
}

위의 설정에서 CELERYBEAT_SCHEDULE은 스케줄링할 작업들을 정의하는 딕셔너리이다. 각 작업은 task, schedule, args 등의 속성을 가지며, 주기적으로 실행되는 시간을 설정할 수 있다.

마무리

이번 포스트에서는 Celery를 이용하여 배치 작업을 처리하는 방법에 대해 알아보았다. Celery는 분산 작업 처리와 스케줄링을 간편하게 해주는 강력한 도구이며, 대규모 데이터 처리나 정기적인 반복 작업에 효과적으로 사용될 수 있다. Celery를 활용하여 작업 처리의 효율성을 높여보세요!