Statusbereinigung
Im Verlauf eines Workflows über viele Schritte kann der angesammelte Status stark anwachsen. Die Statusbereinigung entfernt automatisch alte Schrittausgaben, damit der Status JSON begrenzt bleibt und wichtige Daten erhalten bleiben.
Statusbereinigung aktivieren
Rufe prune_state_after() auf dem Workflow-Builder auf. Das Argument gibt an, wie viele der letzten Schritte ihre Ausgabe behalten sollen:
use Queuety\Queuety;
Queuety::workflow( 'long_pipeline' )
->then( StepA::class )
->then( StepB::class )
->then( StepC::class )
->then( StepD::class )
->then( StepE::class )
->prune_state_after( 2 )
->dispatch( [ 'input' => $data ] );
Mit prune_state_after( 2 ) werden nach Abschluss von Schritt D die Ausgaben der Schritte A und B aus dem Status entfernt. Die beiden letzten Schritte C und D bleiben erhalten.
Funktionsweise der Bereinigung
Wenn die Statusbereinigung aktiviert ist, erfasst Queuety in einem reservierten Array _step_outputs, welche Schlüssel jeder Schritt zum Status hinzufügt. Nach dem Wechsel zu einem neuen Schritt werden alle Schlüssel entfernt, die von Schritten eingeführt wurden, deren Alter den Schwellenwert überschreitet.
Zum Beispiel mit prune_state_after( 2 ):
After step 0 (StepA): state has keys from StepA + initial payload
After step 1 (StepB): state has keys from StepA + StepB + initial payload
After step 2 (StepC): state has keys from StepA + StepB + StepC + initial payload
-> prune: StepA output removed (only 2 most recent kept)
After step 3 (StepD): state has keys from StepB + StepC + StepD + initial payload
-> prune: StepB output removed
Was erhalten bleibt
Queuety bereinigt niemals reservierte Schlüssel, die mit _ beginnen, etwa _steps, _queue, _priority, _max_attempts, _on_cancel, _prune_state_after und _step_outputs. An dispatch() übergebene anfängliche Payload-Schlüssel bleiben ebenfalls erhalten, da sie von Anfang an nicht als Schrittausgaben erfasst werden. Außerdem behält Queuety entsprechend dem konfigurierten Schwellenwert die Ausgaben der N letzten Schritte bei.
Wann du ihn verwenden solltest
Die Statusbereinigung ist hilfreich bei Workflows mit vielen Schritten, wenn jeder Schritt Daten erzeugt, die spätere Schritte nicht benötigen. Typische Beispiele sind lange Pipelines, in denen jeder Schritt nur die Ausgabe des vorherigen oder vorletzten Schritts benötigt, ETL-Workflows mit umfangreichen Zwischendaten sowie rekursive oder wiederholte Workflows, die sonst immer mehr ähnliche Statusdaten ansammeln würden. Bei wenigen Schritten oder wenn spätere Schritte von frühen Ausgaben abhängen, brauchst du die Bereinigung wahrscheinlich nicht.
Standardverhalten
Die Statusbereinigung ist standardmäßig deaktiviert. Die Methode prune_state_after() akzeptiert ein ganzzahliges Argument. Ohne Argument wird standardmäßig 2 verwendet:
->prune_state_after() // keeps the 2 most recent step outputs
->prune_state_after( 5 ) // keeps the 5 most recent step outputs