Zurück zum Blog Self-Hosting

Braucht Ihre selbst gehostete Anwendung Hintergrund-Worker? Ein praxisnaher Entscheidungsrahmen

Hintergrund-Worker halten lang laufende und geplante Aufgaben aus dem interaktiven Anfragepfad heraus. Nutzen Sie diesen Rahmen, um zu entscheiden, ob Ihre selbst gehostete Anwendung Worker benötigt, welche Abhängigkeiten zu prüfen sind und wann ein Einzelserver-Design weiterhin die vernünftige Wahl ist.

Diagramm mit einer Webanwendung, einem Scheduler, einer Warteschlange, Hintergrund-Workern und einem persistenten Datenspeicher

Hintergrund-Worker schützen die interaktive Nutzung

Eine Webanfrage umfasst die Arbeit, die erfolgt, während eine Person wartet: ein Dashboard öffnen, ein Formular absenden, einen Datensatz speichern oder eine Seite anzeigen. Die Anfrage sollte zügig ein nutzbares Ergebnis zurückgeben. Ein Hintergrund-Worker ist ein separater Prozess, der Arbeit übernimmt, die fortgesetzt werden kann, nachdem diese Antwort bereits gesendet wurde.

Diese Unterscheidung ist wichtig, wenn eine Aktion Arbeit mit unvorhersehbarer oder längerer Dauer auslöst. Das Versenden eines Nachrichtenbatches, das Parsen einer hochgeladenen Datei, das Erstellen eines Berichts oder die Verarbeitung von Medien kann weit über die Nutzerinteraktion hinaus, durch die es ausgelöst wurde, Zeit und Ressourcen beanspruchen. Die Queue-Dokumentation von Laravel nennt das Parsen und Speichern von CSV-Dateien als Beispiel für Arbeit, die in einer normalen Webanfrage zu lange dauern kann und stattdessen im Hintergrund verarbeitet werden sollte.

Betrachten Sie Worker nicht automatisch als Merkmal eines ausgereiften Deployments. Sie bringen zusätzliche Komponenten, betriebliche Abhängigkeiten und Fehlermodi mit sich. Die richtige Frage lautet nicht „Hat diese Anwendung eine Queue?“, sondern „Passt die notwendige Arbeit dieser Anwendung sicher in den Anfragepfad, oder braucht sie eine unabhängige Ausführung und Überwachung?“

  • Halten Sie den Webprozess auf interaktiven Datenverkehr fokussiert.
  • Verlagern Sie Arbeit in den Hintergrund, wenn ein Nutzer das Endergebnis nicht benötigt, bevor er fortfährt.
  • Nutzen Sie die eigene Dokumentation der Anwendung als maßgebliche Quelle dafür, ob Worker, ein Scheduler oder ein Queue-Backend erforderlich sind.
  • Gehen Sie nicht davon aus, dass jede selbst gehostete Anwendung dieselbe Worker-Architektur unterstützt.
Hintergrund-Worker schützen die interaktive Nutzung

Welche Workloads gehören häufig in den Hintergrund?

Framework-Dokumentationen nennen durchgängig E-Mail-Versand, Datenverarbeitung und wiederkehrende Wartung als Anwendungsfälle für Hintergrund-Jobs. In praktischen selbst gehosteten Deployments zeigt sich dasselbe Muster in vielen Geschäfts-, Publishing-, Analyse- und Automatisierungsworkflows.

Entscheidend ist nicht der Name einer Funktion. Entscheidend ist, ob die Arbeit jetzt angenommen und später abgeschlossen werden kann, ohne den Nutzer warten zu lassen – vorausgesetzt, die Anwendung liefert nach Abschluss einen geeigneten Status, eine Benachrichtigung oder ein Ergebnis.

  • Importe und Exporte: Daten parsen, Datensätze validieren, Dateien transformieren und herunterladbare Ausgaben erzeugen.
  • Benachrichtigungen: E-Mail-Versand, Erstellung von Zusammenfassungen und andere nicht sofortige Kommunikation.
  • Geplante Jobs: regelmäßige Bereinigung, abrechnungsbezogene Wartung, von der Anwendung gestartete Backups oder periodische Aktualisierungsaktivitäten.
  • Berichterstellung: datenintensive Berichte zusammenstellen oder wiederkehrende Berichte generieren.
  • Medienverarbeitung: Vorschaubilder, Konvertierungen oder andere Dateitransformationen erstellen, sofern die Anwendung dies unterstützt.
  • Indizierung und suchbezogene Verarbeitung: abgeleitete Indizes aktualisieren, nachdem sich Inhalte oder Datensätze geändert haben.
  • Automatisierung: Arbeit verarbeiten, die durch Formulare, Integrationen oder Workflow-Ereignisse ausgelöst wird.
Welche Workloads gehören häufig in den Hintergrund?

Nutzen Sie ein Fünf-Komponenten-Modell, bevor Sie über Servergröße sprechen

Ein Worker-Deployment lässt sich leichter beurteilen, wenn seine Zuständigkeiten getrennt werden. Die genauen Namen unterscheiden sich je nach Anwendung, doch fünf Rollen treten immer wieder auf: Webprozess, Scheduler, Queue, Worker und persistenter Datenspeicher.

Der Webprozess verarbeitet Browser- oder API-Datenverkehr. Er kann eine Aufgabe erstellen und eine Referenz darauf in eine Queue legen. Die Queue hält ausstehende Arbeit vor. Ein oder mehrere Worker entnehmen Aufgaben und führen sie aus. Ein Scheduler erstellt Arbeit zu festgelegten Zeitpunkten, während persistenter Speicher die Anwendungsdaten hält und je nach Design auch Queue- oder Job-Informationen enthalten kann.

Geplante Arbeit und Queue-Verarbeitung sind unterschiedlich. Ein Scheduler erstellt Arbeit in Intervallen; ein Worker nimmt fortlaufend verfügbare Arbeit aus einer Queue. Die Kubernetes-Dokumentation beschreibt geplante Jobs als nützlich für Aktionen wie Backups und Berichtserstellung, weist jedoch auch darauf hin, dass vom Scheduling keine genau-einmalige Ausführung angenommen werden sollte. Der eigene Scheduler Ihrer Anwendung hat eigene Semantiken. Prüfen Sie daher, was er garantiert, und gestalten Sie wiederkehrende Arbeit entsprechend.

Docker Compose kann mehrere Dienste aus einer Konfiguration definieren, und Docker empfiehlt, Verantwortlichkeiten zu trennen, statt jede Aufgabe in einen einzelnen Container zu legen. So können Web-, Worker-, Queue- und Datenbankkomponenten unabhängig betrieben werden, wenn die Anwendung dies tatsächlich erfordert.

  • Webprozess: verarbeitet interaktive Anfragen.
  • Scheduler: löst Arbeit nach einem wiederkehrenden Zeitplan aus.
  • Queue: speichert ausstehende Aufgaben oder Aufgabenreferenzen, bis sie verarbeitet werden.
  • Worker: führt Aufgaben aus der Queue außerhalb des Anfragepfads aus.
  • Persistenter Datenspeicher: bewahrt Anwendungsdaten auf und kann Queue-, Job- oder Statusinformationen enthalten.

Fünf Signale, dass Hintergrundarbeit Nutzer bereits beeinträchtigt

Der Bedarf an Workern wird meist durch Symptome sichtbar, nicht durch eine abstrakte Architekturdiskussion. Suchen Sie nach Mustern in normalen und Spitzenzeiten, nicht nach einer einzelnen langsamen Aktion.

Beginnen Sie mit der Anfragedauer. Wenn lange nutzerseitige Anfragen mit Importen, Berichten, Batch-Benachrichtigungen oder anderen aufwendigen Aktionen zusammenfallen, konkurriert Arbeit im Anfragepfad möglicherweise mit interaktivem Datenverkehr. Wenn Traefik-Zugriffsprotokolle verfügbar sind, enthält deren Dauerfeld die gesamte Antwortverarbeitungszeit einschließlich der Zeit des Origin-Servers und ist damit eine nützliche Quelle für Hinweise zur Anfragedauer.

Betrachten Sie anschließend den Lebenszyklus der Aufgabe selbst. Eine Aufgabe kann angenommen, aber verzögert werden, wiederholt fehlschlagen, ohne klare Sichtbarkeit verschwinden oder mit dem Webprozess um verfügbare Rechenleistung und Arbeitsspeicher konkurrieren. Besonders wichtig ist ein Anwachsen der Queue: Laravel weist darauf hin, dass ein plötzlicher Zufluss eine Queue überlasten und zu langen Wartezeiten bis zum Abschluss führen kann.

  • Langsame Anfragen: Nutzer warten spürbar länger, wenn intensive Aktionen laufen.
  • Verzögerte Ergebnisse: E-Mails, Importe, Berichte oder andere Ergebnisse treffen nach der Anforderung später als erwartet ein.
  • Fehlgeschlagene geplante Arbeit: Wiederkehrende Wartung oder Berichte laufen nicht zuverlässig, oder eine doppelte Verarbeitung ist möglich und wird nicht kontrolliert.
  • Queue-Wachstum: Ausstehende Arbeit nimmt zu und kehrt nach einer Lastspitze nicht auf ein normales Niveau zurück.
  • Ressourcenkonkurrenz: Lang laufende Aufgaben beeinträchtigen die Reaktionsfähigkeit der Webanwendung oder anderer erforderlicher Dienste.

Beantworten Sie diese Abhängigkeitsfragen, bevor Sie einen Worker hinzufügen

Ein Worker ist nicht bloß ein weiterer zu startender Prozess. Er muss den von der Anwendung unterstützten Befehl, die Konfiguration, das Queue-Backend und das Lebenszyklusmodell verwenden. Beginnen Sie mit der offiziellen Dokumentation für die genaue von Ihnen betriebene Anwendungsversion. Bestätigen Sie, ob Hintergrundverarbeitung optional ist, für bestimmte Funktionen empfohlen wird oder für Kernfunktionen erforderlich ist.

Identifizieren Sie als Nächstes das Queue-Backend. Queue-Implementierungen unterscheiden sich. Laravel dokumentiert beispielsweise Verbindungen über relationale Datenbanken und Redis sowie weitere Backends. Das Vorhandensein einer Datenbank bedeutet nicht, dass sie automatisch die richtige Queue-Wahl ist; verwenden Sie das Backend, die Zugangsdaten, Persistenz und das Betriebsmodell, die von der Anwendung unterstützt werden.

Die Bereitschaft von Abhängigkeiten ist eine weitere häufige Ursache für Deployment-Fehler. Einen Datenbank- oder Queue-Container vor einem Worker zu starten, beweist nicht, dass die Abhängigkeit bereit ist, Arbeit anzunehmen. Docker Compose unterstützt abhängige Bedingungen auf Basis von Healthchecks, doch die Konfiguration muss diese ausdrücklich verwenden. Testen Sie Neustarts, nicht nur den ersten Start.

Legen Sie abschließend fest, wie Betreiber erkennen, dass ein Job fehlgeschlagen ist. Anwendungsprotokolle allein können unzureichend sein. Die Monitoring-Anleitung von Celery unterscheidet beispielsweise Ereignisse wie empfangen, gestartet, erfolgreich, fehlgeschlagen und erneut versucht. Unabhängig davon, ob Ihre Anwendung genau diese Ereignisse bereitstellt, definieren Sie die gleichwertigen Nachweise, die Sie benötigen, bevor Sie sich bei wichtigen Geschäftsaktivitäten auf Worker verlassen.

  • Welche offiziellen Worker- und Scheduler-Befehle unterstützt die Anwendung?
  • Ist eine Queue erforderlich, und welche Backends und Versionen unterstützt die Anwendung?
  • Wo werden Job-Payloads, Ergebnisse, Fehlerdatensätze und hochgeladene Dateien persistent gespeichert?
  • Wartet der Worker auf eine fehlerfreie Queue und Datenbank statt nur auf einen gestarteten Container?
  • Wie werden Worker nach einem Timeout, Absturz, Deployment oder Serverneustart neu gestartet?
  • Wo kann ein Betreiber ausstehende, laufende, erneut versuchte und fehlgeschlagene Arbeit sehen?
  • Wer darf auf Queue-Zugangsdaten, Worker-Protokolle und Daten fehlgeschlagener Jobs zugreifen?

Planen Sie für Wiederholungen, Duplikate und Teilausfälle

Wiederholungsversuche sind bei vielen vorübergehenden Fehlern notwendig, können einen kleinen Fehler jedoch in wiederholten Schaden verwandeln, wenn das Aufgabenverhalten nicht verstanden wird. Celery empfiehlt, dass Aufgabenfunktionen idealerweise idempotent sein sollten, da eine Nachricht nach einem Worker-Ausfall erneut zugestellt werden kann. Einfach gesagt: Die zweimalige Ausführung derselben Aufgabe sollte kein unvertretbares doppeltes Ergebnis erzeugen.

Stellen Sie konkrete Fragen. Was passiert bei einer erneuten Zustellung, wenn ein Worker nach dem Versand einer E-Mail, aber vor dem Speichern des Abschlusses abstürzt? Werden bei einem wiederholten Import Datensätze dupliziert? Gibt es bei einer zahlungsbezogenen oder externen Aktion einen Idempotenzschlüssel auf Anwendungsebene oder eine andere Schutzmaßnahme? Die Antworten bestimmen, ob automatische Wiederholungsversuche angemessen sind.

Auch der Zeitpunkt der Bestätigung verändert das Fehlermodell. Verschiedene Queue-Systeme können eine Nachricht vor oder nach der Ausführung bestätigen; die Auswirkungen müssen in der relevanten Anwendungs- oder Framework-Dokumentation geprüft werden. Übernehmen Sie keine Einstellungen für Wiederholungen oder Bestätigungen aus einer nicht verwandten Anwendung.

Nutzen Sie begrenzte Wiederherstellung. Laravel dokumentiert Steuerungen wie maximale Versuchszahlen, Zeitpunkte bis zum erneuten Versuch, maximale unbehandelte Ausnahmen und Backoff-Verzögerungen. Das Prinzip lässt sich verallgemeinern: Setzen Sie Grenzen, fügen Sie bei Bedarf Verzögerungen hinzu, protokollieren Sie fehlgeschlagene Arbeit und geben Sie einer Person oder einem dokumentierten Verfahren einen Weg, sie zu prüfen und zu lösen.

  • Bestätigen Sie, ob Aufgaben sicher wiederholt werden können.
  • Legen Sie eine maximale Anzahl von Versuchen und, sofern unterstützt, eine bewusste Wiederholungsverzögerung oder einen Backoff fest.
  • Verhindern Sie, dass wiederholte Versuche doppelte E-Mails, Datensätze, Dateien oder externe Aktionen erzeugen.
  • Bewahren Sie genügend Job-Kontext auf, um einen Fehler untersuchen zu können, ohne unnötige sensible Daten offenzulegen.
  • Definieren Sie, wann fehlgeschlagene Aufgaben manuell erneut versucht, korrigiert, verworfen oder eskaliert werden.

Schätzen Sie Kapazität anhand der Arbeit, nicht anhand einer einzelnen Serverkennzahl

CPU- und Arbeitsspeicherwerte sind wichtig, beantworten die Kapazitätsfrage aber nicht allein. Ein hilfreiches Ausgangsmodell kombiniert vier Beobachtungen: wie viele Aufgaben eintreffen, wie lange sie dauern, wie viele gleichzeitig laufen können und wann Spitzen auftreten.

Wenn Aufgaben über einen längeren Zeitraum schneller eintreffen, als Worker sie abschließen können, wächst der Rückstau. Wenn Arbeit in kurzen Spitzen eintrifft, kann ein System im Durchschnitt ausreichend sein und Nutzer dennoch nach einer Kampagne, einem Import oder einer geplanten Berichtsperiode warten lassen. Messen Sie die gewöhnliche Last getrennt von der größten erwarteten Lastspitze.

Parallelität ist ein Kapazitätshebel, kein universelles Heilmittel. Mehr gleichzeitig arbeitende Worker können einen Rückstau reduzieren, erhöhen aber auch die gleichzeitige Belastung für Queue, Datenbank, externe Dienste und den Server. Eine Aufgabe, die durch Datenbankarbeit, eine Remote-API oder große Dateien begrenzt wird, verbessert sich möglicherweise nicht proportional mit zusätzlichen Worker-Prozessen.

Beginnen Sie zurückhaltend, ermitteln Sie normale Queue-Tiefe und Abschlusszeit und testen Sie dann eine repräsentative Spitze. Ändern Sie jeweils nur eine Variable: Aufgabenbündelung, Parallelität, Zeitplanung oder Worker-Zuweisung. Beziehen Sie interaktive Antwortzeiten in die Bewertung ein; ein Worker-Design ist nicht erfolgreich, wenn es die Queue leert, indem es die Webanwendung beeinträchtigt.

  • Ankunftsrate: Wie viele Jobs werden pro Minute, Stunde oder Tag erstellt?
  • Aufgabendauer: Wie lange dauert jede Aufgabe bei typischen und maximalen Datengrößen?
  • Parallelität: Wie viele Aufgaben können sicher parallel ausgeführt werden?
  • Spitzenzeiten: Wann verursachen Kampagnen, Importe, Berichte oder geplante Arbeit Lastspitzen?
  • Erwartung an den Abschluss: Wie schnell benötigt das Unternehmen das Ergebnis, nachdem eine Aufgabe übermittelt wurde?
  • Gemeinsam genutzte Abhängigkeiten: Überlasten zusätzliche Worker die Datenbank, Queue, Speicherung oder einen externen Dienst?

Schaffen Sie betriebliche Schutzmechanismen für Worker-Dienste

Worker benötigen eigene betriebliche Sichtbarkeit, da ihr Ausfall weniger offensichtlich sein kann als ein Webausfall. Trennen Sie Worker- und Scheduler-Protokolle, sofern das Deployment-Modell dies zulässt, von Webanfrage-Protokollen. Das hilft, einen nutzerseitigen Fehler von einem Fehler bei der Aufgabenverarbeitung zu unterscheiden, und erleichtert es, einen Job über seinen gesamten Lebenszyklus hinweg zu verfolgen.

Warnmeldungen sollten geschäftliche Auswirkungen widerspiegeln. Überwachen Sie fehlgeschlagene Jobs, Queue-Wachstum, ungewöhnlich alte ausstehende Arbeit und die Verfügbarkeit von Workern. Laravel weist darauf hin, dass Produktions-Worker nach Ereignissen wie Timeouts stoppen können, und empfiehlt Prozessüberwachung oder einen gleichwertigen Mechanismus, um Beendigungen zu erkennen und Worker neu zu starten. Der genaue Überwachungsmechanismus hängt vom Deployment ab, doch ein nicht überwachter Worker ist eine vorhersehbare Schwachstelle.

Backups erfordern dieselbe Sorgfalt wie alle anderen Anwendungsdaten. Bestimmen Sie, wo jobbezogener Status gespeichert ist: in der Anwendungsdatenbank, einem Queue-Backend, einem Docker-Volume, einem Dateispeicher oder an mehr als einem dieser Orte. Docker dokumentiert Volumes als geeignet für Backup-, Wiederherstellungs- und Migrationsworkflows, doch die Backup-Abdeckung sollte anhand des tatsächlichen Datenpfads überprüft werden. Ein Backup-Plan, der wichtige Job- oder hochgeladene Dateidaten auslässt, ermöglicht möglicherweise keine sinnvolle Wiederherstellung.

Zugriffskontrollen gehören ebenfalls zur Zuverlässigkeit. Queue-Zugangsdaten, Protokolle und Payloads fehlgeschlagener Jobs können betriebliche oder sensible Informationen enthalten. Beschränken Sie den Zugriff, dokumentieren Sie Zuständigkeiten und stellen Sie sicher, dass die Datenaufbewahrung Ihren Governance-Anforderungen entspricht.

  • Halten Sie Web-, Worker- und Scheduler-Protokolle unterscheidbar.
  • Alarmieren Sie bei Worker-Beendigungen, fehlgeschlagenen Jobs, ungewöhnlicher Queue-Tiefe und übermäßigem Alter ausstehender Jobs.
  • Nutzen Sie begrenzte Wiederholungsversuche und bewahren Sie Nachweise fehlgeschlagener Aufgaben zur Untersuchung auf.
  • Überprüfen Sie Backup- und Wiederherstellungsabdeckung für Datenbanken, Volumes, hochgeladene Dateien und jobbezogenen Status.
  • Beschränken Sie den Zugriff auf Aufgabendaten, Queue-Zugangsdaten und Betriebsprotokolle.
  • Testen Sie einen Neustart und ein Wiederherstellungsverfahren, statt anzunehmen, dass die Konfiguration ausreicht.

Häufige Fragen

Benötigt jede selbst gehostete Anwendung Hintergrund-Worker?

Nein. Eine einfache Anwendung mit kurzen Anfragen, Aufgaben mit geringem Volumen und keinen erforderlichen asynchronen oder geplanten Funktionen kann mit einem einzelnen Anwendungsprozess gut funktionieren. Fügen Sie Worker hinzu, wenn die Anwendungsdokumentation sie als erforderlich nennt oder wenn lang laufende, geplante oder stoßweise anfallende Arbeit Reaktionsfähigkeit oder Zuverlässigkeit beeinträchtigt.

Was ist der Unterschied zwischen einem Scheduler und einem Hintergrund-Worker?

Ein Scheduler erstellt oder löst Arbeit zu festgelegten Zeiten aus. Ein Worker entnimmt Arbeit aus einer Queue und führt sie aus. Manche Anwendungen verwenden beides, andere eines von beidem oder keines. Prüfen Sie die offizielle Dokumentation der Anwendung, statt von einer Standardarchitektur auszugehen.

Kann eine Datenbank als Queue-Backend verwendet werden?

Einige Anwendungen unterstützen relationale Datenbanken als Queue-Backend; Laravel ist ein dokumentiertes Beispiel. Ob dies geeignet ist, hängt davon ab, was die konkrete Anwendung unterstützt, und von den betrieblichen Anforderungen ihres Workloads. Bestätigen Sie die Auswirkungen dieser Implementierung auf Persistenz, Backups, Monitoring und Leistung.

Warum kann eine Aufgabe zweimal ausgeführt werden?

Ein Worker kann ausfallen, nachdem er einen Teil oder die gesamte Arbeit erledigt hat, während die Queue die Nachricht später abhängig von ihrem Bestätigungsverhalten erneut zustellen kann. Deshalb sollten Aufgaben idealerweise idempotent sein: Eine wiederholte Ausführung sollte kein unvertretbares doppeltes Ergebnis verursachen.

Woran erkenne ich, ob ein Worker-Rückstau ein Problem ist?

Beobachten Sie, ob ausstehende Arbeit während einer Spitze zunimmt und innerhalb der für Ihr Unternehmen erforderlichen Abschlusszeit auf ein normales Niveau zurückkehrt. Eine Queue, die weiter wächst oder Aufgaben länger ausstehend lässt, als Nutzer und Betrieb akzeptieren können, muss untersucht werden.

Kann Airbip eine Anwendung hosten, die Worker-Dienste verwendet?

Airbip verwaltet die Bereitstellung von Anwendungen aus seinem öffentlichen Katalog als Docker-Workloads auf Airbip-Cloud-Servern. Routing und TLS werden über Traefik und Let’s Encrypt abgewickelt; außerdem gibt es Service-Lifecycle-Management sowie konfigurierbare tägliche, wöchentliche und monatliche Backups. Anforderungen an Worker und Scheduler sind anwendungsspezifisch. Prüfen Sie daher die dokumentierte Architektur der Anwendung und das verfügbare Deployment-Modell, bevor Sie einen Tarif oder eine Konfiguration wählen. Aktuelle Tarife und kommerzielle Bedingungen finden Sie auf der Live-Website von Airbip.

Quellen und weiterführende Literatur

  1. Laravel Queue Documentation — Laravel
  2. Active Job Basics — Ruby on Rails
  3. Tasks — Celery
  4. Monitoring and Management Guide — Celery
  5. CronJob — Kubernetes
  6. How Compose Works — Docker
  7. Control Startup and Shutdown Order in Compose — Docker
  8. Volumes — Docker
  9. Logs and Access Logs — Traefik Labs