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 workflowwait_for_workflows()pre viacero workflowov so sémantikouall,anyaleboquorumwait_for_workflow_group(), keď ID workflowov pochádzajú z predtým spustenej skupiny
Čakanie na jeden workflow
$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:
$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
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::Allpokračuje až po dokončení každého uvedeného workflowu.WaitMode::Anypokračuje po dokončení prvého uvedeného workflowu.WaitMode::Quorumpokračuje po úspešnom dokončení požadovaného počtu workflowov.
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:
[
'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:
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:
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.
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.
$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()aWaitMode::Allzlyhajú, ak niektorá požadovaná závislosť zlyhá alebo sa zruší.WaitMode::Anyzlyhá iba vtedy, keď všetky závislosti dosiahnu konečný stav a žiadna sa úspešne nedokončí.WaitMode::Quorumzlyhá, 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čí.