Ga naar de inhoud

Tijdreizen in workflows

Met Queuety kun je een workflow terugzetten naar een eerdere stap en de uitvoering vanaf dat punt hervatten. Dit is handig wanneer een stap onjuiste output heeft opgeleverd, wanneer je het opnieuw wilt proberen met een andere configuratie of wanneer je corrupte gegevens wilt herstellen zonder de hele workflow opnieuw te starten.

Terugzetten is afhankelijk van het Workflow Event Log. Het gebeurtenislogboek moet state_after-gegevens voor de doelstap bevatten.

Een workflow terugzetten

PHP API

Roep Queuety::rewind_workflow() aan met de workflow-ID en de index van de stap waarnaar je wilt terugzetten:

PHP
use Queuety\Queuety;

// Rewind workflow 42 to step 1.
// The state is restored to the snapshot taken after step 1 completed,
// and step 2 is enqueued for re-execution.
Queuety::rewind_workflow( $workflow_id, to_step: 1 );

De parameter to_step is de index vanaf nul van de stap waarvan de voltooide status moet worden hersteld. De uitvoering wordt hervat vanaf de volgende stap (to_step + 1).

CLI

Shell
wp queuety workflow rewind <id> <step>
Optie Beschrijving
<id> Workflow-ID (vereist)
<step> Stapindex om naar terug te zetten, vanaf 0 geteld (vereist)
Shell
wp queuety workflow rewind 42 1

Werking

Wanneer je een workflow terugzet naar stap N:

  1. Het gebeurtenislogboek wordt doorzocht op de waarde state_after die is vastgelegd nadat stap N was voltooid
  2. Als er geen snapshot bestaat, wordt een RuntimeException gegenereerd
  3. De workflowregel wordt vergrendeld
  4. De workflowstatus wordt vervangen door de snapshot, waarbij alle gereserveerde sleutels (_steps, _queue, _priority, enz.) uit de huidige workflowregel behouden blijven
  5. current_step wordt ingesteld op N + 1 en status wordt ingesteld op running
  6. Alle velden error_message en failed_at worden gewist
  7. De stap op index N + 1 wordt in de wachtrij geplaatst voor verwerking
  8. Er wordt een workflow_rewound-loggebeurtenis vastgelegd

De worker verwerkt vervolgens de stap die in de wachtrij is geplaatst en de workflow gaat vanaf dat punt verder zoals gebruikelijk.

Vereisten

Voor terugzetten zijn state_after-gegevens in het gebeurtenislogboek nodig. Het gebeurtenislogboek legt deze automatisch vast voor elke step_completed-gebeurtenis. Als het gebeurtenislogboek is opgeschoond (via WorkflowEventLog::prune()) en de status voor de doelstap niet meer bestaat, mislukt het terugzetten.

Zorg ervoor dat de bewaartermijn van je gebeurtenislogboek lang genoeg is voor de periode waarnaar je mogelijk wilt terugzetten.

Toepassingen

Een foutieve staphandler herstellen

Als een staphandler een fout bevatte waardoor onjuiste output werd geproduceerd, kun je de fix implementeren en de workflow terugzetten:

PHP
// Step 2 (CallLLMHandler) produced garbled output due to a prompt bug.
// After fixing CallLLMHandler, rewind to step 1 so step 2 runs again
// with the corrected handler.
Queuety::rewind_workflow( $workflow_id, to_step: 1 );

Opnieuw proberen met een andere configuratie

Als een stap door externe factoren is mislukt (API-limiet, onjuiste inloggegevens), herstel je de configuratie en zet je de workflow terug om de stap opnieuw uit te voeren:

PHP
// Step 3 failed because the API key was expired.
// After updating the key, rewind to step 2 so step 3 retries.
Queuety::rewind_workflow( $workflow_id, to_step: 2 );

Onjuiste gegevens herstellen

Als een eerdere stap onjuiste gegevens aan de status heeft toegevoegd, zet je de workflow terug naar een snapshot waarvan je weet dat die goed is:

PHP
// Step 0 fetched correct data, but step 1 corrupted it.
// Rewind to step 0 to restore the good state and re-run step 1.
Queuety::rewind_workflow( $workflow_id, to_step: 0 );

Vergelijking met opnieuw proberen

Aspect retry_workflow() rewind_workflow()
Hervat vanaf De mislukte stap Elke eerdere stap
Status Huidige workflowstatus Hersteld uit het gebeurtenislogboek state_after
Vereist Workflow heeft de status failed Snapshot van de doelstap in het gebeurtenislogboek
Status na afloop running running
Loggebeurtenis geen workflow_rewound