Preskočiť na obsah

Závislosti workflowov

Čakanie na závislosti workflowu použite vtedy, keď má jeden hlavný workflow pokračovať až po dokončení ostatných workflowov. Umožňuje koordináciu medzi workflowmi bez toho, aby ste všetko museli vložiť do jednej obrovskej definície workflowu.

Takéto čakanie sa výborne dopĺňa s Asynchrónnym odovzdaním, pri ktorom jeden workflow najprv spustí nezávislé podriadené workflowy a počká na ne až neskôr.

Rozsiahlejšie príklady plánovača a vykonávača nájdete v časti Orchestrácia agentov.

Queuety poskytuje tri metódy tvorby:

  • wait_for_workflow() pre jeden workflow
  • wait_for_workflows() pre viacero workflowov so sémantikou all, any alebo quorum
  • wait_for_workflow_group(), keď ID workflowov pochádzajú z predtým spustenej skupiny

Čakanie na jeden workflow

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();

Keď sa research_run dokončí, editorial_run pokračuje. Ak je nastavený result_key, stav dokončenej závislosti sa uloží pod týmto kľúčom:

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

Ak nie je zadaný result_key, verejný stav závislého workflowu sa zlúči s najvyššou úrovňou stavu čakajúceho workflowu.

Čakanie na viacero workflowov

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 pokračuje až po dokončení každého uvedeného workflowu.
  • WaitMode::Any pokračuje po dokončení prvého uvedeného workflowu.
  • WaitMode::Quorum pokračuje po úspešnom dokončení požadovaného počtu workflowov.
PHP
Queuety::workflow( 'synthesis_run' )
    ->wait_for_workflows(
        [ $research_id, $editorial_id, $legal_id ],
        WaitMode::Quorum,
        'dependencies',
        quorum: 2,
    )
    ->then( PublishPacketStep::class )
    ->dispatch();

Pri použití result_key sa stav dokončených závislostí pri čakaní na viacero workflowov ukladá podľа ID workflowu:

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

Ak nie je zadaný result_key, stav dokončených závislostí sa zlúči s najvyššou úrovňou stavu čakajúceho workflowu v poradí závislostí.

Získanie ID závislostí zo stavu workflowu

Zoznam závislostí môžete určiť až počas behu načítaním ID workflowov z verejného stavu:

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

Pri viacerých závislostiach:

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

Čakanie na spustenú skupinu workflowov

Ak predchádzajúci krok start_workflows() alebo start_agents() uložil trvalý kľúč skupiny, môžete čakať priamo na túto skupinu namiesto toho, aby ste ID workflowov sami prenášali cez verejný stav.

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();

Čo sa deje počas čakania

Keď workflow dosiahne jeden z týchto krokov, prejde do stavu waiting_for_workflows. Počas čakania k nemu nezostáva priradený žiadny pracovník.

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']

Ak sa závislý workflow dokončil ešte pred dosiahnutím kroku čakania, workflow pokračuje okamžite.

Správanie pri zlyhaní

Čakanie na závislosti workflowov sa riadi úspešným dokončením:

  • wait_for_workflow() a WaitMode::All zlyhajú, ak niektorá požadovaná závislosť zlyhá alebo sa zruší.
  • WaitMode::Any zlyhá iba vtedy, keď všetky závislosti dosiahnu konečný stav a žiadna sa úspešne nedokončí.
  • WaitMode::Quorum zlyhá, keď zostávajúce aktívne workflowy už nemôžu splniť požadované kvórum.

Vďaka tomu je čakanie na workflowy užitočné v systémoch s plánovačom a vykonávačom, kde jeden workflow môže naplánovať prácu a druhý môže čakať na výsledky all alebo na prvú úspešnú vetvu, ktorá sa dokončí.