Celery를 사용한 실시간 채팅 앱 개발

실시간 통신이 중요한 채팅 애플리케이션을 개발할 때, Celery는 매우 유용한 도구입니다. Celery는 분산 메시지 전달 시스템인 RabbitMQ나 Redis와 함께 사용되며, 메시지 큐를 통해 비동기 작업을 처리할 수 있습니다.

이 포스트에서는 Celery를 사용하여 실시간 채팅 앱을 개발하는 방법을 알아보겠습니다.

1. 프로젝트 설정

먼저, Django 프로젝트를 생성합니다.

django-admin startproject chat_app
cd chat_app

Celery와 관련된 패키지를 설치합니다.

pip install celery django-celery-results django-celery-beat

settings.py 파일에 다음과 같이 Celery 설정을 추가합니다.

# settings.py

...

# Celery settings
CELERY_BROKER_URL = 'amqp://guest:guest@localhost:5672//'  # RabbitMQ 사용 시
CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite'  # 결과를 SQLite 데이터베이스에 저장

CELERY_BEAT_SCHEDULE = {
    'send_notifications': {
        'task': 'chat.tasks.send_notifications',
        'schedule': 10  # 10초마다 실행
    },
}

INSTALLED_APPS = [
    ...

    # Celery apps
    'django_celery_results',
    'django_celery_beat',
]

...

# Celery
from datetime import timedelta

# Celery settings
CELERYBEAT_SCHEDULE = {
    'send_notifications': {
        'task': 'chat.tasks.send_notifications',
        'schedule': timedelta(seconds=10),  # 10초마다 실행
    },
}

CELERY_TIMEZONE = 'UTC'

2. Celery 태스크 작성

Celery 태스크는 tasks.py 파일에 작성됩니다.

# chat/tasks.py

from celery import shared_task

@shared_task
def send_notifications():
    # 실시간 알림 전송 로직 작성
    pass

3. redis-server 실행

Redis를 사용하여 메시지 큐를 설정합니다. Redis 서버를 실행합니다.

redis-server

4. Celery 워커 실행

Celery 워커를 실행합니다.

celery -A chat_app worker -l info

5. 비동기 작업 예약

실시간 채팅 앱에서는 알림을 위한 비동기 작업을 예약해야 합니다. Django의 post_save 신호를 사용하여 메시지 저장 시 Celery 태스크를 예약하는 예제를 살펴보겠습니다.

from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver

from chat.tasks import send_notifications

class Message(models.Model):
    text = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)

@receiver(post_save, sender=Message)
def schedule_notifications(sender, instance, **kwargs):
    send_notifications.apply_async(args=[instance.id], eta=instance.created_at + timedelta(seconds=5))

결론

Celery를 사용하면 실시간 채팅 앱과 같은 효율적인 비동기 작업을 개발할 수 있습니다. Celery를 통해 메시지 큐 및 워커를 설정하고, 태스크를 예약하여 실시간 알림을 처리할 수 있습니다. 이를 통해 사용자 경험을 향상시키고, 성능을 향상시킬 수 있습니다.

#python #django #celery