[python] Celery로 대량의 이메일 발송을 처리하는 방법은 어떻게 되는가?

서론

이메일 발송은 많은 웹 애플리케이션에서 중요한 기능 중 하나입니다. 때로는 수천 개 이상의 이메일을 동시에 발송해야 할 수도 있습니다. 그러나 많은 양의 이메일을 동기적으로 처리하려고 하면 성능 문제가 발생할 수 있습니다. 이런 경우에 Celery를 사용하여 이메일 발송을 비동기적으로 처리할 수 있습니다.

Celery란?

Celery는 Python으로 작성된 분산 작업 큐 시스템입니다. 이를 사용하면 일련의 작업을 백그라운드에서 비동기적으로 실행할 수 있으며, 대량의 이메일 발송과 같이 시간이 오래 걸리는 작업을 효율적으로 처리할 수 있습니다.

Celery 설정하기

먼저, Celery를 설치해야 합니다. 다음 명령을 사용하여 Celery를 설치합니다:

pip install celery

Celery를 설정하기 위해 프로젝트 디렉토리에 celery.py라는 파일을 생성합니다. 다음은 celery.py 파일의 내용입니다:

from celery import Celery

app = Celery('myapp',
             broker='amqp://guest@localhost//',
             backend='rpc://',
             include=['myapp.tasks'])

app.conf.update(
    result_expires=3600,
)

if __name__ == '__main__':
    app.start()

broker는 RabbitMQ와 같은 메시지 브로커의 URL을 지정합니다. backend은 Celery 작업의 결과를 저장하는 데 사용되는 URL입니다. include는 Celery 작업이 위치한 모듈을 지정합니다.

이메일 발송 작업 정의하기

이제 이메일 발송 작업을 정의해야 합니다. myapp 디렉토리에 tasks.py라는 파일을 생성하고 다음 내용을 추가합니다:

from celery import shared_task
from django.core.mail import send_mail

@shared_task
def send_bulk_emails(subject, message, recipient_list):
    from_email = 'noreply@example.com'
    send_mail(subject, message, from_email, recipient_list)

send_bulk_emails 함수는 이메일의 제목, 내용 및 수신자 목록을 인수로 받아 이메일을 발송하는 작업입니다.

이메일 발송 작업 실행하기

이제 Celery를 실행하고 이메일 발송 작업을 실행할 준비가 되었습니다. 다음 명령을 사용하여 Celery를 실행합니다:

celery -A myapp worker --loglevel=info

-A 옵션은 Celery 애플리케이션의 이름을 지정하고, --loglevel 옵션은 로그의 상세도를 지정합니다.

이메일 발송 작업을 실행하기 위해 다음 코드를 사용할 수 있습니다:

from myapp.tasks import send_bulk_emails

# 이메일 발송 작업을 비동기적으로 실행
send_bulk_emails.delay('Hello', 'This is a test email', ['user1@example.com', 'user2@example.com'])

delay 메서드를 호출하여 작업을 예약할 수 있습니다. 이메일이 성공적으로 발송되면 Celery 로그에서 해당 작업에 대한 정보를 확인할 수 있습니다.

마무리

Celery를 사용하여 대량의 이메일을 비동기적으로 발송하는 방법을 알아보았습니다. 이를 통해 웹 애플리케이션의 성능을 향상시키고, 사용자들에게 빠른 응답을 제공할 수 있습니다. Celery에는 다양한 기능과 설정 옵션이 있으므로, 공식 문서를 참조하여 더 자세한 정보를 얻을 수 있습니다.

참고 자료