Závislosti workflow
Čekání na závislá workflow použijte, pokud má jedno workflow nejvyšší úrovně pokračovat až po dokončení ostatních workflow. Získáte tak koordinaci mezi workflow, aniž byste museli vše sloučit do jediné rozsáhlé definice.
Tato čekání se obzvlášť dobře kombinují s Asynchronním předáním, kdy jedno workflow nejprve spustí nezávislá podřízená workflow a později na ně čeká.
Podrobnější příklady plánování a vykonávání najdete v části Orchestrace agentů.
Queuety nabízí tři metody builderu:
wait_for_workflow()pro jedno workflowwait_for_workflows()pro několik workflow se sémantikouall,anyneboquorumwait_for_workflow_group(), pokud ID workflow pocházejí z dříve spuštěné skupiny
Čekání na jedno 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();
Po dokončení research_run bude editorial_run pokračovat. Pokud je nastaveno result_key, stav dokončeného závislého workflow se uloží pod tento klíč:
$state['research']; // public state from the completed research workflow
Pokud není zadáno result_key, veřejný stav závislého workflow se sloučí do stavu čekajícího workflow na nejvyšší úrovni.
Čekání na několik workflow
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í všech uvedených workflow.WaitMode::Anypokračuje po dokončení prvního uvedeného workflow.WaitMode::Quorumpokračuje po úspěšném dokončení požadovaného počtu workflow.
Queuety::workflow( 'synthesis_run' )
->wait_for_workflows(
[ $research_id, $editorial_id, $legal_id ],
WaitMode::Quorum,
'dependencies',
quorum: 2,
)
->then( PublishPacketStep::class )
->dispatch();
Při použití result_key ukládají čekání na více workflow stav dokončených závislostí pod klíčem tvořeným ID workflow:
[
'42' => [ 'summary' => '...' ],
'43' => [ 'summary' => '...' ],
]
Bez result_key se stav dokončených závislostí sloučí do nejvyšší úrovně stavu čekajícího workflow v pořadí závislostí.
Načtení ID závislostí ze stavu workflow
Seznam závislostí můžete sestavit až za běhu načtením ID workflow z veřejného stavu:
Queuety::workflow( 'agent_follow_up' )
->wait_for_workflow( 'parent_workflow_id', 'parent' )
->then( FinalizeAgentRunStep::class )
->dispatch( [ 'parent_workflow_id' => $workflow_id ] );
Pro několik závislostí:
Queuety::workflow( 'aggregator' )
->wait_for_workflows( 'dependency_ids', WaitMode::Any, 'winner' )
->dispatch( [ 'dependency_ids' => [ 12, 18, 22 ] ] );
Čekání na spuštěnou skupinu workflow
Pokud předchozí krok start_workflows() nebo start_agents() uložil trvalý klíč skupiny, můžete čekat přímo na tuto skupinu místo toho, abyste ID workflow předávali přes veřejný 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();
Co se děje během čekání
Když workflow dosáhne jednoho z těchto kroků, přejde do stavu waiting_for_workflows. Během čekání u něj nezůstává žádný worker.
$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']
Pokud závislost skončila ještě před dosažením čekacího kroku, workflow okamžitě pokračuje.
Chování při selhání
Čekání na závislosti workflow se řídí úspěchem:
wait_for_workflow()aWaitMode::Allselžou, pokud kterákoli povinná závislost selže nebo je zrušena.WaitMode::Anyselže pouze tehdy, když všechny závislosti dosáhnou konečného stavu a žádná nebyla úspěšně dokončena.WaitMode::Quorumselže, když zbývající aktivní workflow už nemohou splnit požadované kvórum.
Díky tomu se čekání na workflow hodí pro systémy plánovače a vykonavatele, kde jedno workflow může rozdělovat práci a jiné čekat na výsledky all nebo na dokončení první úspěšné větve.