Rehberler Uzun Okuma Async

Agir isleri arka plana nasil alirsiniz?

Task tanimlama, retry politikasi ve worker olceklendirme.

7 Şubat 2026 20 dk okuma
Paylaş
X in

Giris

Web istekleri kisa omurlu olmalidir; kullaniciya PDF uretmek, binlerce e-posta gondermek veya dis API'leri cagirmak request timeout'una yol acar. Celery, Django'dan bagimsiz worker process'lerde asenkron gorev calistirmanizi saglar. Redis veya RabbitMQ broker olarak mesaj kuyrugunu yonetir.

Bu rehberde Celery'yi Django projesine baglama, task tanimlama, periyodik gorevler ve uretimde izleme konularini ele aliyoruz.

Mimari: Broker, Backend ve Worker

Django uygulamasi task'i kuyruga yollar (apply_async / delay). Broker mesaji tutar. Worker mesaji alir ve task fonksiyonunu calistirir. Result backend (Redis/DB) opsiyonel olarak sonuc saklar.

  • Broker: Redis (hizli) veya RabbitMQ (guvenilir)
  • Worker: celery -A proj worker -l info
  • Beat: zamanlanmis gorev zamanlayicisi
  • Flower: worker monitoring arayuzu

Django Entegrasyonu

celery.py dosyasi Celery app instance'i olusturur ve Django settings'i yukler. __init__.py icinde proj.celery import edilerek Django baslarken Celery de yuklenir.

# proj/celery.py
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
app = Celery('proj')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

# settings.py
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/1'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'

Task Tanimlama ve Kullanim

@shared_task decorator ile task'lar app'lere dagitilir. bind=True ile self.retry() kullanilir. Idempotent task tasarimi onemlidir: ayni gorev iki kez calissa veri bozulmamali.

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

@shared_task(bind=True, max_retries=3, default_retry_delay=60)
def send_welcome_email(self, user_id):
    from accounts.models import User
    user = User.objects.get(pk=user_id)
    try:
        send_mail(
            'Hos geldiniz',
            f'Merhaba {user.username}',
            'noreply@example.com',
            [user.email],
        )
    except Exception as exc:
        raise self.retry(exc=exc)
View icinde agir is yapmayin; delay() ile kuyruga birakin ve kullaniciya hemen 202/redirect donun.

Periyodik Gorevler (Celery Beat)

django-celery-beat ile zamanlama veritabaninda tutulur ve admin'den yonetilebilir. Crontab ve interval schedule desteklenir.

# settings.py
INSTALLED_APPS += ['django_celery_beat']

CELERY_BEAT_SCHEDULE = {
    'cleanup-sessions': {
        'task': 'core.tasks.cleanup_expired_sessions',
        'schedule': crontab(hour=3, minute=0),
    },
}

Hata Yonetimi ve Retry

autoretry_for, retry_backoff ve retry_jitter transient hatalarda exponential backoff saglar. Dead letter queue veya failed task admin paneli operasyonel gorunurluk icin gereklidir.

  • max_retries ile sonsuz donguyu engelleyin
  • Task timeout: soft_time_limit ve time_limit
  • Chord ve group ile paralel is akislari
@shared_task(
    autoretry_for=(RequestException,),
    retry_backoff=True,
    retry_jitter=True,
    max_retries=5,
)
def fetch_external_api(url):
    return requests.get(url, timeout=10).json()

Uretim ve Olceklendirme

Worker sayisini CPU ve I/O profiline gore ayarlayin (-c concurrency). Ayri kuyruklar (high_priority, default) ile kritik gorevleri izole edin. Supervisor veya systemd ile worker sureclerini yonetin.

  1. Redis persistence ve memory limit yapilandir
  2. Flower veya Prometheus exporter ile metrik
  3. Task idempotency ve transaction.on_commit pattern
  4. Staging'de beat + worker birlikte test

Sonuc

Celery, Django uygulamalarinin kullanici deneyimini bozmadan arka planda is yukunu tasimasini saglar. Dogru retry, izleme ve idempotent tasarim ile uretimde guvenilir bir task altyapisi kurulur.

  • transaction.on_commit(lambda: task.delay()) ile yarim kayit riskini azaltin
  • Buyuk payload yerine ID gonderin
  • Celery 5+ JSON serializer guvenligi icin tercih edin