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