Zum Hauptinhalt springen
Version: 2.0

Ausführungsgarantien und Idempotenz

Durable Workflow v2 trennt Workflow-Replay und Aktivitätsausführung:

  • Workflow-Code wird anhand der festgeschriebenen Historie erneut durchlaufen und muss deterministisch sein.
  • Aktivitätscode führt Nebenwirkungen aus und wird mindestens einmal ausgeführt.
  • Die dauerhafte Historie speichert festgeschriebene Workflow- und Aktivitätsergebnisse für dieselbe dauerhafte Kennung genau einmal, auch wenn der Transport Arbeit mehrfach zugestellt hat.

Diese Garantien erlauben die Fortsetzung nach Worker-Neustarts, abgelaufenen Leases, erneuter Queue-Zustellung und schrittweisen Bereitstellungen.

Replay und Wiederholungsversuche​

Workflow-Aufgaben rekonstruieren den Zustand aus der festgeschriebenen Historie und entscheiden anschließend über den nächsten Schritt. Replay durchläuft den Workflow-Code erneut. Es führt aber keine bereits gespeicherten Aktivitäten, Signale oder Nebenwirkungen erneut aus.

Darum muss Workflow-Code deterministisch bleiben. Verwenden Sie geeignete Hilfsfunktionen wie Workflow::now(), sideEffect(...), Abfragen, Updates, Aktivitätsergebnisse, Memos und Suchattribute, wenn Sie die Grenze zur dauerhaften Speicherung überschreiten müssen.

Aktivitäten werden mindestens einmal ausgeführt​

Aktivitäten führen externe Nebenwirkungen aus. Für sie gilt:

  • Ein Aktivitätsversuch kann mehrfach beansprucht werden.
  • Nach Ablauf einer Lease kann die Aufgabe an einen anderen Worker zugestellt werden.
  • Ein Worker kann die externe Arbeit abschließen, seine Lease verlieren und das Ergebnis verspätet melden.
  • Ein Wiederholungsversuch plant einen neuen dauerhaften Versuch derselben logischen Aktivitätsausführung.

Mehrfache Ausführung gehört damit zum normalen Verhalten. Der Anwendungsautor muss den Aktivitätskörper oder das angesprochene externe System so gestalten, dass Wiederholungen sicher sind.

Die Aktivitäts-Einschränkungen zeigen geeignete Entwurfsmuster. Fehler und Wiederherstellung beschreibt das Verhalten aus Sicht des Betriebs.

Was genau einmal gespeichert wird​

Durable Workflow verspricht nicht, dass ein Worker-Prozess Arbeit mit Nebenwirkungen nur einmal erhält. Festgeschriebene dauerhafte Fakten sind jedoch maßgeblich und werden für dieselbe dauerhafte Kennung nicht doppelt gespeichert.

In der Praxis bedeutet das:

  • Eine festgeschriebene Workflow-Entscheidung wird für ihre dauerhafte Befehls- oder Schrittkennung einmal in der typisierten Historie gespeichert.
  • Das festgeschriebene abschließende Ergebnis eines Aktivitätsversuchs wird für seine activity_attempt_id einmal gespeichert.
  • Replay liest diese Fakten und rekonstruiert daraus den Workflow-Zustand, ohne externe Arbeit erneut auszuführen.

Das zentrale Modell lautet:

  • Transport und Worker arbeiten mindestens einmal.
  • Die festgeschriebene dauerhafte Historie enthält jeden Fakt pro dauerhafter Kennung genau einmal.

Abgelaufene Leases und erneute Zustellung​

Der Ablauf einer Lease gehört zur normalen Wiederherstellung in verteilten Systemen:

  • Eine beanspruchte Aufgabe hat einen Lease-Eigentümer und einen Ablaufzeitpunkt.
  • Läuft die Lease ab, bevor der Worker Fortschritt oder Abschluss meldet, kann die Aufgabe erneut zugestellt werden.
  • Ein anderer Worker kann dieselbe logische Arbeit beanspruchen.

Erneute Zustellung bedeutet, dass die Engine mit Unsicherheit im Worker oder Transport umgeht. Bereits festgeschriebene Ergebnisse bleiben erhalten.

Bei Anzeichen doppelter Ausführung prüfen Sie zwei Fragen getrennt:

  1. Wurde die externe Nebenwirkung mehrfach ausgeführt?
  2. Wurde mehr als ein Ergebnis für dieselbe dauerhafte Kennung festgeschrieben?

Die erste Frage erfordert idempotenten Aktivitätscode. Die zweite betrifft den Vertrag der Engine.

Standardkennungen für Idempotenz​

Diese stabilen Kennungen eignen sich zur Duplikaterkennung:

KennungBedeutungTypische Verwendung
workflow_instance_idEine öffentliche Workflow-InstanzDoppelte Starts erkennen und fachliche Instanz identifizieren
workflow_run_idEin bestimmter dauerhafter LaufEinen Lauf für Abfragen, Export oder Diagnosen auswählen
workflow_command_idEin externer zustandsändernder BefehlWiederholte Client-Anfragen deduplizieren
activity_execution_idEine logische Aktivitätsausführung über Versuche hinwegStandard-Idempotenzschlüssel für externe Nebenwirkungen
activity_attempt_idEin konkreter AktivitätsversuchEinzelne Versuche mit einem entfernten System korrelieren
schedule_idEine ZeitplandefinitionZuständigkeit und Auslöser eines Zeitplans deduplizieren
Nachrichtenstrom-idempotencyKeyEine wiederholt gesendete logische NachrichtDoppelte Nachrichtenaufnahme bei Sender-Wiederholungen verhindern

Verwenden Sie für externe Operationen standardmäßig activity_execution_id. Nutzen Sie activity_attempt_id nur, wenn das Ziel jeden Wiederholungsversuch unterscheiden muss.

use Workflow\V2\Activity;

final class ChargeCard extends Activity
{
public function handle(array $payload): string
{
return app(PaymentGateway::class)->charge(
$payload,
idempotencyKey: $this->activityId(),
attemptCorrelation: $this->attemptId(),
);
}
}

Was die Anwendung idempotent machen muss​

Workflow-Replay selbst müssen Sie nicht idempotent machen. Das Framework rekonstruiert den Zustand aus der festgeschriebenen Historie.

Externe Nebenwirkungen müssen dagegen sicher wiederholbar sein, darunter:

  • Zahlungs- und Abrechnungsaufrufe
  • E-Mails, Textnachrichten und Webhooks
  • Schreibzugriffe auf andere Datenbanken oder Dienste
  • Dateierstellung und Uploads
  • jeder Befehl, der Zustand außerhalb der Workflow-Historie erzeugt oder verändert

Häufige Ansätze:

  • Übergeben Sie der entfernten API einen Idempotenzschlüssel.
  • Schreiben Sie in eine deterministische Zielressource, etwa einen bekannten Objektschlüssel.
  • Verwenden Sie einen Upsert oder eine Transaktion mit einer dauerhaften Kennung als Schlüssel.
  • Gestalten Sie die Operation so, dass ein zweiter Aufruf nichts mehr verändert.

Hinweise für den Betrieb​

Bei der Diagnose eines Laufs in Waterline, der CLI oder Server-Protokollen:

  • Erwarten Sie nach dem Ablauf einer Lease eine mögliche mehrfache Aktivitätsausführung, bis das dauerhafte Ergebnis des Versuchs etwas anderes zeigt.
  • Behandeln Sie verspätete Abschluss- oder Fehlerberichte als Rennen, das die Engine entscheidet. Daraus folgt nicht, dass die externe Nebenwirkung ausgeblieben ist.
  • Behandeln Sie Workflow-Replay als Wiederherstellung.
  • Untersuchen Sie fehlende kompatible Worker, festhängende Leases und wiederholte Reparaturen. Solche Hinweise sind kein Grund, Nebenwirkungen in den Workflow-Code zu verschieben.

Unterscheiden Sie Unsicherheit im Transport und dauerhaftes Ergebnis. Durable Workflow macht beides sichtbar, damit Sie den tatsächlichen Zustand beurteilen können.