Gå til indhold

Afhængigheder mellem arbejdsgange

Brug ventepunkter for afhængigheder mellem arbejdsgange, når én overordnet arbejdsgang først skal fortsætte, efter andre arbejdsgange er afsluttet. Det giver koordinering på tværs af arbejdsgange uden at tvinge alt ind i én enorm arbejdsgangsdefinition.

Disse ventepunkter fungerer særligt godt sammen med Async Handoffs, hvor én arbejdsgang først starter uafhængige underordnede arbejdsgange og derefter venter på dem.

Se Agent Orchestration for mere udførlige eksempler på planlægger og udfører.

Queuety indeholder tre builder-metoder:

  • wait_for_workflow() til én arbejdsgang
  • wait_for_workflows() til flere arbejdsgange med semantik af typen all, any eller quorum
  • wait_for_workflow_group() når arbejdsgangs-ID'erne kommer fra en tidligere startet gruppe

Vent på én arbejdsgang

PHP
$research_id = Queuety::workflow( 'research_run' )
    ->then( PlanResearchStep::class )
    ->for_each( 'tasks', ExecuteResearchTask::class, 'results' )
    ->dispatch( [ 'brief_id' => 42 ] );

$editorial_id = Queuety::workflow( 'editorial_run' )
    ->wait_for_workflow( $research_id, 'research' )
    ->then( DraftBriefStep::class )
    ->dispatch();

Når research_run afsluttes, genoptages editorial_run. Når result_key er angivet, gemmes den afsluttede afhængighedstilstand under den nøgle:

PHP
$state['research']; // public state from the completed research workflow

Uden en result_key flettes afhængighedsarbejdsgangens offentlige tilstand ind i den ventende arbejdsgangs tilstand på øverste niveau.

Vent på flere arbejdsgange

PHP
use Queuety\Enums\WaitMode;

Queuety::workflow( 'synthesis_run' )
    ->wait_for_workflows(
        [ $research_id, $editorial_id, $legal_id ],
        WaitMode::All,
        'dependencies'
    )
    ->then( PublishPacketStep::class )
    ->dispatch();
  • WaitMode::All genoptages først, når alle anførte workflows er fuldført.
  • WaitMode::Any genoptages, når det første anførte workflow er fuldført.
  • WaitMode::Quorum genoptages, når det krævede antal workflows er fuldført uden fejl.
PHP
Queuety::workflow( 'synthesis_run' )
    ->wait_for_workflows(
        [ $research_id, $editorial_id, $legal_id ],
        WaitMode::Quorum,
        'dependencies',
        quorum: 2,
    )
    ->then( PublishPacketStep::class )
    ->dispatch();

Med result_key gemmes afsluttede afhængigheder ved ventetid på flere workflows med workflow-ID som nøgle:

PHP
[
    '42' => [ 'summary' => '...' ],
    '43' => [ 'summary' => '...' ],
]

Uden result_key flettes tilstanden for afsluttede afhængigheder ind i det ventende workflows topniveau i afhængighedernes rækkefølge.

Find afhængigheds-ID'er fra workflowtilstanden

Du kan vente med at angive afhængighedslisten til kørselstidspunktet ved at hente workflow-ID'er fra den offentlige tilstand:

PHP
Queuety::workflow( 'agent_follow_up' )
    ->wait_for_workflow( 'parent_workflow_id', 'parent' )
    ->then( FinalizeAgentRunStep::class )
    ->dispatch( [ 'parent_workflow_id' => $workflow_id ] );

For flere afhængigheder:

PHP
Queuety::workflow( 'aggregator' )
    ->wait_for_workflows( 'dependency_ids', WaitMode::Any, 'winner' )
    ->dispatch( [ 'dependency_ids' => [ 12, 18, 22 ] ] );

Vent på en startet workflowgruppe

Hvis et tidligere trin start_workflows() eller start_agents() gemte en permanent gruppenøgle, kan du vente direkte på gruppen i stedet for selv at føre workflow-ID'er gennem den offentlige tilstand.

PHP
Queuety::workflow( 'brief_research' )
    ->then( PlanTopicsStep::class )
    ->start_agents( 'agent_tasks', $agent_run, group_key: 'researchers' )
    ->wait_for_agent_group( 'researchers', WaitMode::Quorum, 2, 'agent_results' )
    ->then( SynthesizeBriefStep::class )
    ->dispatch();

Hvad sker der, mens workflowet venter

Når et workflow når et af disse trin, sættes det i status waiting_for_workflows. Ingen worker er knyttet til det, mens det venter.

PHP
$state = Queuety::workflow_status( $workflow_id );
echo $state->status->value; // 'waiting_for_workflows'
echo $state->wait_type;     // 'workflow'
print_r( $state->waiting_for ); // ['42', '43']

Hvis en afhængighed allerede er fuldført, før ventetrinnet nås, fortsætter workflowet med det samme.

Håndtering af fejl

Ventetrin for workflowafhængigheder er baseret på succes:

  • wait_for_workflow() og WaitMode::All fejler, hvis en påkrævet afhængighed fejler eller annulleres.
  • WaitMode::Any fejler kun, når alle afhængigheder har nået en terminal tilstand, og ingen er fuldført uden fejl.
  • WaitMode::Quorum fejler, når de resterende aktive workflows ikke længere kan opfylde det krævede quorum.

Det gør ventetrin nyttige i planner/executor-systemer, hvor et workflow kan udføre arbejde, mens et andet venter på resultater fra all eller på den første succesfulde gren, der afsluttes.