Laravel-Entwicklung4 Min. Lesezeit

Laravel-Modernisierung: Queues, Idempotenz und sichere Migration

Modernisieren Sie eine gewachsene PHP-Anwendung schrittweise – mit transaktionalen Schreibvorgängen, wiederholungssicheren Jobs und einem geprobten Rollback-Plan.

Eine Anwendungstransaktion, die eine Queue und unabhängige Worker speist

Die kurze Antwort

Migrieren Sie eine fachliche Funktion nach der anderen. Schützen Sie Datenbank-Invarianten mit Transaktionen und Constraints, machen Sie Queue-Jobs wiederholungssicher und prüfen Sie Zustellung und Rollback, bevor Sie die nächste Route umziehen.

Wählen Sie einen Ausschnitt, der klein genug zum Prüfen ist

Eine schrittweise Migration kann den Umfang jedes Releases verkleinern, ist aber nicht risikofrei. Beginnen Sie mit einem abgegrenzten Ablauf, dessen Eingaben, Ausgaben und Zuständigkeiten klar sind. Erfassen Sie das Altdatenmodell, externe Seiteneffekte und Reporting-Abhängigkeiten, bevor Sie Traffic verlagern.

Halten Sie Fehlerrate, Antwortlatenz, Queue-Alter und geschäftliche Ergebnisse wie abgeschlossene Bestellungen als Ausgangswerte fest. Leiten Sie einen kontrollierten Teil der Anfragen an die neue Implementierung und behalten Sie einen klaren Weg zurück. Migrieren Sie Speicher, Framework, Zahlungen und Benutzeroberfläche nicht gleichzeitig, es sei denn, die Abhängigkeiten erzwingen es.

Halten Sie den kritischen Schreibvorgang transaktional

Prüfen Sie Berechtigungen und Eingaben und speichern Sie dann den kleinsten gültigen Zustandsübergang innerhalb einer Datenbanktransaktion. Nutzen Sie Unique-Constraints für Invarianten, etwa genau eine externe Referenz pro Bestellung. Zeilensperren oder bedingte Updates können gleichzeitige Übergänge schützen, wenn sie richtig eingesetzt werden.

Ein Redis-Lock kann Arbeit koordinieren, doch ein abgelaufener Lease, ein Absturz oder ein falsch abgegrenzter Schlüssel können Überschneidungen zulassen. Er ersetzt keine Datenbank-Constraints. Dokumentieren Sie, welches System für welche Invariante verantwortlich ist, und testen Sie sie mit gleichzeitigen Anfragen.

Dispatchen Sie erst, wenn die Daten committet sind

Ein Worker kann laufen, bevor die auslösende Transaktion committet ist. Laravel bietet Dispatch nach dem Commit, damit Jobs keine unbestätigten oder zurückgerollten Datensätze lesen. In einer Laravel-12-Anwendung sieht ein Grundmuster so aus:

DB::transaction(function () use ($validated) {
    $order = Order::create($validated);
    ProcessOrder::dispatch($order->id)->afterCommit();
});

Das Beispiel ist bewusst unvollständig: Autorisierung, Umgang mit doppelten Anfragen und fachliche Validierung gehören drumherum. Dispatch nach dem Commit schließt außerdem nicht das Fehlerfenster zwischen Datenbank-Commit und Übergabe an eine externe Queue. Für Abläufe, die eine dauerhafte Zustellung brauchen, sollten Sie ein Transactional Outbox und einen Publisher mit Wiederholungen in Betracht ziehen.

Entwerfen Sie Jobs für „mindestens einmal“-Ausführung

Gehen Sie davon aus, dass ein Job mehr als einmal laufen kann. Speichern Sie einen Idempotenzschlüssel, protokollieren Sie abgeschlossene Operationen und nutzen Sie den Idempotenzmechanismus des externen Anbieters, sofern vorhanden. Markieren Sie einen Job nicht als erledigt, bevor der externe Effekt erfolgreich war. Gleichen Sie unklare Ergebnisse ab, statt eine Abbuchung oder einen Versand blind zu wiederholen.

  • Legen Sie Timeouts, Wiederholungslimits und Backoff passend zur Operation fest.
  • Halten Sie das Worker-Timeout kürzer als das Retry-Intervall der Queue, mit Puffer für das Herunterfahren, um überlappende Versuche zu verringern.
  • Überwachen Sie fehlgeschlagene Jobs und das Queue-Alter; eine HTTP-202-Antwort bedeutet „angenommen“, nicht „erledigt“.
  • Starten Sie langlaufende Worker bei Releases neu, damit sie den richtigen Code laden.

Proben Sie Ausfälle und Rollback

Testen Sie einen doppelten Webhook, einen Worker-Absturz nach einem externen Aufruf, einen Deadlock in der Datenbank, einen Queue-Ausfall und ein fehlgeschlagenes Deployment. Prüfen Sie die entstandenen Datensätze und Seiteneffekte, nicht nur die HTTP-Antwort. Ergänzen Sie einen Abgleich für Arbeit, die angenommen, aber nie abgeschlossen wurde.

Nutzen Sie abwärtskompatible Schemaänderungen, solange beide Anwendungen aktiv sind. Definieren Sie die Rollback-Bedingungen vor dem Release und prüfen Sie, ob die alte Anwendung die von der neuen geschriebenen Daten lesen kann. Behalten Sie für jeden Datensatz eine einzige Quelle der Wahrheit, bis die Synchronisierung ausdrücklich entworfen ist.

Häufige Fragen

Wann sollte Arbeit synchron bleiben?

Wenn der Aufrufer sofort ein verbindliches Ergebnis braucht und die Arbeit kurz genug ist, um das Antwortzeitbudget einzuhalten. Queues sind nützlich für aufschiebbare Arbeit; sie bringen eigene Verantwortlichkeiten für Zustellung, Sichtbarkeit und Wiederherstellung mit.

Garantiert Dispatch nach dem Commit, dass ein Job die Queue erreicht?

Nein. Er verhindert, dass ein Job vor dem Commit seiner Transaktion ausgelöst wird, doch zwischen Commit und Übergabe an eine externe Queue kann weiterhin ein Fehler auftreten. Wenn Sie dauerhafte Zustellung brauchen, prüfen Sie ein Transactional Outbox mit einem Publisher mit Wiederholungen und Abgleich.

Wie verhindere ich, dass Wiederholungen doppelte Zahlungen oder Bestellungen erzeugen?

Nutzen Sie dauerhafte Idempotenzschlüssel, Datenbank-Constraints und den Idempotenzmechanismus des externen Anbieters, sofern vorhanden. Protokollieren Sie Ergebnisse und gleichen Sie unklare Antworten ab. Ein kurzlebiger Lock allein deckt nicht jeden Absturz und jedes Retry-Fenster ab.

Was erleichtert das Zurückrollen einer schrittweisen Migration?

Einen abgegrenzten Ablauf umziehen, einen klaren Routing-Weg zur bisherigen Implementierung behalten und abwärtskompatible Schemaänderungen nutzen. Testen Sie, ob die alte Anwendung die von der neuen erstellten Datensätze lesen kann. Legen Sie vor dem Release Rollback-Auslöser anhand von Fehlern und geschäftlichen Ergebnissen fest.

Quellen und weiterführende Literatur

Weiterlesen

Vergleichen Sie Rendering-Strategien oder sprechen wir über eine Laravel-Migration.

Paul Edward

Geschrieben von Paul Edward

Senior Full-Stack-Webentwickler für PHP, Laravel, WordPress und KI-gestützte Websysteme.

Mehr über Paul

Leave a Reply

Your email address will not be published. Required fields are marked *

Kurze Prüfung wird geladen… (benötigt JavaScript)

Projekt-Briefing Schritt 1 von 2 · Die Arbeit

Was möchten Sie bauen lassen?

Ein Absatz reicht völlig für den Anfang. Wenn der Auftrag nicht zu mir passt, sage ich es und nenne Ihnen jemanden, der besser passt.

Die Arbeit

Wählen Sie alles, was zutrifft.

Plattform

„Keine Ahnung“ ist eine völlig gute Antwort.

Was möchten Sie bauen, und was muss es für die Menschen leisten, die es nutzen? Schreiben Sie es so, wie Sie es laut sagen würden.

0 / 1200

Zwei Schritte. Unter einer Minute.