Inhaltsverzeichnis

  • Die vier Optionen im Kurzprofil
  • KEDA in 60 Sekunden
  • Vergleich speziell für Kubernetes
  • Mini YAML Beispiele
  • Kubernetes Betriebsaspekte, die zählen
  • Code Beispiele für Tasks
  • Ausfallhandling in Kubernetes Clustern
  • Entscheidungsleitfaden
  • FAQ

Über den Autor

Celery ist meiner Meinung nach die unangefochtene Nummer eins für asynchrone Jobs. Allerdings sollte man bei neuen Projekten mit geringeren Anforderungen auch Alternativen wie Django RQ in Betracht ziehen.
Zuletzt geändert:10.09.2025

DjangoKubernetesEntwicklungBetrieb

10.09.2025

Django Tasks auf Kubernetes schlank und skalierbarAlternativen zu Celery für Django auf Kubernetes

Du planst Hintergrundjobs im Cluster und fragst dich, ob es neben Celery 'leichtere' Optionen gibt?

Celery ist mächtig, aber manchmal zu schwergewichtig für einfache Setups. In diesem Artikel schauen wir auf Alternativen wie Django RQ, Dramatiq und Huey, erklären, warum KEDA eine Schlüsselrolle beim Autoscaling spielt und geben dir Mini-YAML-Beispiele für sauberes Deployment mit Probes und Graceful Shutdown.

Celery Alternativen

Die vier Optionen im Kurzprofil

(Mit Links zu Projekten und Repos, damit du weiter eintauchen kannst.)

Celery

Der Klassiker mit großem Ökosystem. Unterstützt Worker und den separaten Scheduler Beat. In großen Setups mit Chains und vielen Integrationen bleibt Celery der Referenzpunkt.

Django RQ

Django-freundliche Integration von RQ auf Redis Basis. Worker starten im Django Kontext. In vielen Fällen genügt das Setzen von DJANGO_SETTINGS_MODULE. Monitoring ist leicht über RQ Dashboard oder Admin-Integrationen.

Dramatiq

Moderne Defaults mit Fokus auf Zuverlässigkeit. Läuft mit Redis oder RabbitMQ. Die Django Integration django_dramatiq bringt das Management Kommando rundramatiq.

Huey

Leichtgewichtig mit eingebautem Scheduler. Saubere Django Integration über das Management Kommando run_huey inklusive Auto-Discovery von tasks.py.


KEDA in 60 Sekunden

KEDA ist der Kubernetes Event Driven Autoscaler.
Er skaliert Deployments und Jobs abhängig von Ereignissen wie Queue-Längen und kann bei Leerlauf bis auf null skalieren. KEDA ergänzt den Horizontal Pod Autoscaler und arbeitet mit ihm zusammen.

Warum ist KEDA so wichtig?

  • Du brauchst kein Polling im Worker.
  • Pods skalieren dynamisch, wenn Jobs in der Queue liegen.
  • Bei Leerlauf kannst du die Worker auf 0 reduzieren und Ressourcen sparen.

Typische Trigger für Django Worker sind Redis Lists sowie RabbitMQ Queues. Beide sind als Scaler verfügbar.


Vergleich speziell für Kubernetes

ToolBrokerKEDA TriggerVorteileNachteileBeste Wahl wenn
CeleryRedis, RabbitMQRedis List oder RabbitMQ QueueSehr ausgereift, viele Integrationen, Worker plus Beat, breite Community. K8s Plus: viele Beispiele für Queue-basiertes Autoscaling.Mehr Betriebsaufwand, zusätzliche Komponenten wie Beat, sorgfältiges Shutdown Handling nötig.Hohe Last, komplexe Chains, vorhandene Celery Erfahrung.
Django RQRedisRedis ListSehr leichter Start, Admin Integration, wenige bewegliche Teile. K8s Plus: Listenlänge als simpler KEDA Trigger.Geringere Feature Tiefe, Redis Pflicht.Web Projekte mit klaren Jobs und schnellem Go Live.
DramatiqRedis, RabbitMQRedis List oder RabbitMQ QueueModerne Defaults, robuste Retries, saubere Django Integration über rundramatiq. K8s Plus: gut kombinierbar mit KEDA je nach Broker.Weniger fertige Django UIs, Einarbeitung ins Actor Modell.Anspruchsvoll aber schlank, Fokus auf Zuverlässigkeit.
HueyRedisRedis ListLeichtgewichtig, Scheduler enthalten, Consumer als Management Kommando. K8s Plus: simpler Prozess und KEDA Kopplung.Kleineres Ökosystem, Monitoring eher minimal.Wenige Worker, viele periodische Aufgaben.

Mini YAML Beispiele

Beispiel A: Celery Worker mit RabbitMQ und KEDA

# Deployment für Celery Worker
apiVersion: apps/v1
kind: Deployment
metadata:
  name: celery-worker
spec:
  selector: { matchLabels: { app: celery } }
  template:
    metadata: { labels: { app: celery } }
    spec:
      terminationGracePeriodSeconds: 60
      containers:
        - name: worker
          image: your-registry/app:latest
          command: ["celery","-A","proj","worker","--loglevel=info"]
          env:
            - name: RABBITMQ_HOST
              valueFrom:
                secretKeyRef: { name: rmq, key: amqp_uri }
---
# ScaledObject für RabbitMQ Queue
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: celery-rabbit
spec:
  scaleTargetRef: { name: celery-worker }
  minReplicaCount: 0
  maxReplicaCount: 20
  triggers:
    - type: rabbitmq
      metadata:
        hostFromEnv: RABBITMQ_HOST
        queueName: celery
        protocol: amqp
        mode: QueueLength
        value: "20"
      authenticationRef:
        name: rmq-auth

Beispiel B: Django RQ Worker plus KEDA Redis List Scaler

# Deployment für RQ Worker
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rq-worker
spec:
  selector: { matchLabels: { app: rq } }
  template:
    metadata: { labels: { app: rq } }
    spec:
      terminationGracePeriodSeconds: 60
      containers:
        - name: worker
          image: your-registry/app:latest
          command: ["bash","-lc","DJANGO_SETTINGS_MODULE=config.settings rq worker default"]
          env:
            - name: REDIS_HOST
              value: "redis:6379"
---
# KEDA ScaledObject mit Redis List Trigger
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: rq-scale
spec:
  scaleTargetRef: { name: rq-worker }
  minReplicaCount: 0
  maxReplicaCount: 10
  triggers:
    - type: redis
      metadata:
        addressFromEnv: REDIS_HOST
        listName: default
        listLength: "20"  # Skalierung ab 20 Jobs

Beispiel C: Dramatiq unter Django mit Redis

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dramatiq-worker
spec:
  selector: { matchLabels: { app: dramatiq } }
  template:
    metadata: { labels: { app: dramatiq } }
    spec:
      terminationGracePeriodSeconds: 60
      containers:
        - name: worker
          image: your-registry/app:latest
          command: ["python","manage.py","rundramatiq","--processes","2","--threads","8"]
          env:
            - name: REDIS_HOST
              value: "redis:6379"
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: dramatiq-scale
spec:
  scaleTargetRef: { name: dramatiq-worker }
  minReplicaCount: 0
  maxReplicaCount: 10
  triggers:
    - type: redis
      metadata:
        addressFromEnv: REDIS_HOST
        listName: default
        listLength: "10"

Beispiel D: Huey Worker mit Redis

apiVersion: apps/v1
kind: Deployment
metadata:
  name: huey-worker
spec:
  selector: { matchLabels: { app: huey } }
  template:
    metadata: { labels: { app: huey } }
    spec:
      terminationGracePeriodSeconds: 60
      containers:
        - name: worker
          image: your-registry/app:latest
          command: ["python","manage.py","run_huey"]
          env:
            - name: REDIS_HOST
              value: "redis:6379"
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: huey-scale
spec:
  scaleTargetRef: { name: huey-worker }
  minReplicaCount: 0
  maxReplicaCount: 5
  triggers:
    - type: redis
      metadata:
        addressFromEnv: REDIS_HOST
        listName: default
        listLength: "5"

Kubernetes Betriebsaspekte, die zählen

Broker deployen

Redis und RabbitMQ bekommst du stabil per Helm Chart oder Operator. Für RabbitMQ gibt es zusätzlich einen offiziellen Cluster Operator.

Probes konfigurieren

Setze Readiness, Liveness und bei längeren Starts eine Startup Probe. Beispiel:

livenessProbe:
  exec: { command: ["pgrep", "rq"] }
  initialDelaySeconds: 20
  periodSeconds: 10

So verhinderst du Deadlocks und Traffic an nicht bereite Pods.

Graceful Shutdown

Nutze terminationGracePeriodSeconds und bei Bedarf einen preStop Hook, damit laufende Tasks sauber zu Ende laufen:

lifecycle:
  preStop:
    exec:
      command: ["bash","-c","kill -TERM 1 && sleep 30"]

Kubernetes beendet Container nach Ablauf der Grace Period in jedem Fall – plane also Puffer.

KEDA Installation

KEDA lässt sich per Helm Chart oder YAML installieren. Danach definierst du ScaledObjects oder ScaledJobs pro Worker.


Code Beispiele für Tasks

Damit du den Unterschied auch im Django Code siehst:

Celery

from celery import shared_task

@shared_task
def send_email(user_id):
    # klassische Celery Task
    ...

Django RQ

import django_rq

def send_email(user_id):
    ...

# Task in die Queue legen
queue = django_rq.get_queue('default')
queue.enqueue(send_email, user.id)

Dramatiq

import dramatiq

@dramatiq.actor
def send_email(user_id):
    ...

# Task dispatchen
send_email.send(user.id)

Huey

from huey.contrib.djhuey import task

@task()
def send_email(user_id):
    ...

# Task aufrufen
send_email(user.id)

Ausfallhandling in Kubernetes Clustern

Früher oder später passiert’s: Ein Worker geht down oder der Broker fällt aus. Damit deine Tasks trotzdem sauber weiterlaufen, brauchst du etwas Absicherung. So kannst du vorgehen:

Wenn ein Worker abstürzt

Kubernetes stellt deine Pods automatisch mit restartPolicy: Always wieder her. Wichtig ist jedoch, dass Jobs erst dann aus der Queue entfernt werden, wenn sie wirklich verarbeitet sind. Andernfalls gehen Tasks verloren.

Alle vier Tools (Celery, RQ, Dramatiq, Huey) unterstützen eingebaute Retries. Diese solltest du aktiv einsetzen.

Ein Beispiel für ein RQ‑Worker‑Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rq‑worker
spec:
  replicas: 2
  selector: { matchLabels: { app: rq } }
  template:
    metadata: { labels: { app: rq } }
    spec:
      restartPolicy: Always
      containers:
        - name: worker
          image: your‑registry/app:latest
          command: ["rq","worker","default"]

Wenn ein Pod abstürzt, startet Kubernetes ihn einfach neu. Die offenen Jobs bleiben in Redis liegen und werden vom nächsten Worker übernommen.


Wenn der Broker ausfällt

Ohne Redis oder RabbitMQ läuft nichts. Deshalb solltest du diese Komponenten hochverfügbar betreiben.

Redis als StatefulSet

Ein Deployment allein reicht nicht aus, wenn Daten dauerhaft gespeichert werden müssen. Ein StatefulSet sorgt dafür, dass Redis‑Pods stabile Namen und ein eigenes Volume haben. Damit bleibt die Queue auch nach Neustarts bestehen.

Kurz gesagt: StatefulSets geben Pods eine feste Identität und persistenten Speicher.

RabbitMQ mit replizierten Queues

RabbitMQ‑Queues sind normalerweise an einen Node gebunden. Fällt dieser Node oder Pod aus, ist die Queue verschwunden. Mit Quorum Queues, also replizierten und ausfallsicheren Queues auf Basis des Raft‑Protokolls, bist du sicherer aufgestellt. Der RabbitMQ Kubernetes Operator erleichtert dir den Aufbau eines hochverfügbaren Clusters.

Der Vorteil ist klar: Wenn ein Pod ausfällt, übernimmt ein anderer, ohne dass deine Worker davon viel mitbekommen.


Kubernetes‑Tools, die du nicht vergessen solltest

  • PodDisruptionBudget (PDB): sorgt dafür, dass bei Updates nicht zu viele Pods gleichzeitig ausfallen.
  • Readiness Probes: stellen sicher, dass nur gesunde Pods Jobs bearbeiten.
  • Graceful Shutdown: gibt deinen Workern Zeit, um Tasks bei SIGTERM zu Ende zu bringen.
  • Backoff und Retries: ermöglichen es Workern, automatisch wieder zu verbinden, wenn der Broker kurzzeitig nicht erreichbar ist.

Mit diesem Setup bist du für die häufigsten Fehlerquellen im Cluster gut vorbereitet, egal ob Worker oder Broker einmal ausfallen.

Entscheidungsleitfaden

  • Einfach und schnell mit Redis: Django RQ oder Huey. Kopple über den KEDA Redis List Scaler.
  • Robust mit flexibler Broker Wahl: Dramatiq. Nimm Redis oder RabbitMQ und binde KEDA entsprechend an.
  • Großes Setup mit vorhandenem Know-how: Celery mit ScaledObjects je Queue und optional Beat oder django-celery-beat für Periodics.

Migrationen sind möglich: Viele Task-Definitionen lassen sich mit geringem Aufwand portieren, auch wenn Retry/ACK-Mechanismen unterschiedlich umgesetzt sind.


FAQ

1. Was ist KEDA und wofür nutze ich es?

KEDA skaliert Workloads anhand externer Ereignisse wie Queue Länge und ermöglicht Scale to Zero. Es ergänzt den Horizontal Pod Autoscaler.

2. Kann ich alle vier Tools mit KEDA autoscalen?

Ja. Über den Redis Lists Scaler oder den RabbitMQ Queue Scaler, je nach Broker.

3. Wie wähle ich den passenden Broker?

Redis ist schnell bereitgestellt und genügt oft für Web Projekte. RabbitMQ lohnt sich bei komplexem Routing oder bestehender AMQP Erfahrung.

4. Brauche ich für Celery einen separaten Scheduler?

Für periodische Aufgaben nutzt Celery den Scheduler Beat. Mit django-celery-beat kannst du Zeitpläne im Django Admin pflegen.

5. Wie starte ich Dramatiq in Django sauber?

Über python manage.py rundramatiq aus django_dramatiq. Das Kommando ist für die Django Integration gedacht.

6. Gibt es Dashboards für Django RQ?

Ja. Es gibt rq-dashboard als Standalone sowie Integrationen für den Django Admin.


Hast du noch Fragen oder eine Meinung? Mit deinem GitHub Account kannst Du es uns wissen lassen...


Was unsere Kunden über uns sagen

/img/homepage/testimonial_bg.svg
Ofa Bamberg GmbHRainer Kliewe
Ludwig-Maximilians-Universität MünchenProf. Dr. Mario Haim
Deutsches MuseumGeorg Hohmann
Fonds Finanz Maklerservice GmbHNorbert Porazik
Technische Universität HamburgSören Schütt-Sayed
  • Ofa Bamberg GmbH
    Ofa Bamberg GmbH
    B2B Online-Shop | B2C Website | Hosting | Betreuung | Security
    Rainer Kliewe
    © Ofa Bamberg GmbH
    Blueshoe betreut uns und unsere Webapplikationen seit vielen Jahren. Vom Online-Shop bis hin zu großen Teilen unseres Web-Umfelds hat sich das Unternehmen stets kompetent, verlässlich und vorausschauend gezeigt. Wir sind sehr zufrieden mit Blueshoe als Partner.
    Rainer KlieweGeschäftsführer
  • Ludwig-Maximilians-Universität München
    Ludwig-Maximilians-Universität München
    Plattformentwicklung | Hosting | Betreuung | APIs | Website
    Prof. Dr. Mario Haim
    Blueshoe hat unsere Forschungsdatenplattform Munich Media Monitoring (M3) entwickelt und uns hervorragend dabei beraten. Das Team hat unsere Anforderungen genau verstanden und sich aktiv in die Ausgestaltung der Software und der Betriebsumgebung eingebracht. Wir sind froh, dass auch Wartung und weiterführender Support in Blueshoes Händen liegen.
    Prof. Dr. Mario HaimLehrstuhlinhaber, Institut für Kommunikationswissenschaft und Medienforschung
  • Deutsches Museum
    Deutsches Museum
    Digitalisierung | Beratung | Datenbank-Optimierung | GraphQL | CMS
    Georg Hohmann
    Foto: Anne Göttlicher
    Im Rahmen eines komplexen Digitalisierungsprojekts für unsere Exponate-Datenbank war Blueshoe ein äußerst verlässlicher Partner. Sie haben uns nicht nur während des gesamten Projekts hervorragend beraten, sondern unsere Anforderungen perfekt umgesetzt. Dank ihrer Arbeit ist unsere Datenbank nun ein bedeutender Mehrwert für die weltweite wissenschaftliche Forschung.
    Georg HohmannLeiter Deutsches Museum Digital
  • Fonds Finanz Maklerservice GmbH
    Fonds Finanz Maklerservice GmbH
    Plattformentwicklung | Prozess-Systeme | Hosting | Betreuung | Zertifikate | Website
    Norbert Porazik
    © Fonds Finanz Maklerservice GmbH
    Blueshoe ist unsere verlängerte Werkbank für Entwicklung, Wartung und Support unserer Weiterbildungs- und Zertifizierungsplattformen. Das Team hat sich gründlich in unsere Abläufe eingearbeitet, und wir freuen uns, Blueshoe als zuverlässigen Partner an unserer Seite zu haben.
    Norbert PorazikGründer und Geschäftsführer
  • Technische Universität Hamburg
    Technische Universität Hamburg
    Plattformentwicklung | Beratung | Prozess-Systeme | Hosting | Website
    Sören Schütt-Sayed
    Seit 2019 unterstützt uns die Blueshoe GmbH tatkräftig bei der Entwicklung und Weiterentwicklung des "Digital Learning Lab" und der "Digital Learning Tools". Dank ihrer Beratung konnten wir von Anfang an auf eine zukunftssichere, moderne technische Struktur setzen. Die Zusammenarbeit ist reibungslos, und wir fühlen uns rundum gut betreut. Und davon profitieren dann auch die Lehrkräfte in Hamburg.
    Sören Schütt-SayedOberingenieur