Arbetsflödesberoenden
Använd väntan på arbetsflödesberoenden när ett överordnat arbetsflöde ska fortsätta först när andra arbetsflöden har slutförts. Då kan du samordna flera arbetsflöden utan att tvinga in allt i en enda stor arbetsflödesdefinition.
Sådan väntan fungerar särskilt bra med Överlämningar asynkront, där ett arbetsflöde först startar fristående underordnade arbetsflöden och sedan väntar på dem.
För fler exempel på planerare och exekverare, se Agentorkestrering.
Queuety tillhandahåller tre byggarmetoder:
wait_for_workflow()för ett arbetsflödewait_for_workflows()för flera arbetsflöden med semantikenall,anyellerquorumwait_for_workflow_group()när arbetsflödes-ID:na kommer från en grupp som startats tidigare
Vänta på ett arbetsflöde
$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 slutförs återupptas editorial_run. Om result_key anges lagras det slutförda beroendets tillstånd under den nyckeln:
$state['research']; // public state from the completed research workflow
Utan result_key sammanfogas beroendearbetsflödets publika tillstånd med det väntande arbetsflödets tillstånd på toppnivå.
Vänta på flera arbetsflöden
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återupptas först när alla angivna arbetsflöden har slutförts.WaitMode::Anyåterupptas när det första angivna arbetsflödet slutförs.WaitMode::Quorumåterupptas när ett erforderligt antal arbetsflöden har slutförts utan fel.
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 lagrar väntan på flera arbetsflöden de slutförda beroendenas tillstånd med arbetsflödes-ID som nyckel:
[
'42' => [ 'summary' => '...' ],
'43' => [ 'summary' => '...' ],
]
Utan result_key sammanfogas de slutförda beroendenas tillstånd med det väntande arbetsflödets tillstånd på toppnivå i beroendeordning.
Hämta beroende-ID:n från arbetsflödestillståndet
Du kan skjuta upp listan över beroenden till körning genom att läsa arbetsflödes-ID:n från det publika tillståndet:
Queuety::workflow( 'agent_follow_up' )
->wait_for_workflow( 'parent_workflow_id', 'parent' )
->then( FinalizeAgentRunStep::class )
->dispatch( [ 'parent_workflow_id' => $workflow_id ] );
För flera beroenden:
Queuety::workflow( 'aggregator' )
->wait_for_workflows( 'dependency_ids', WaitMode::Any, 'winner' )
->dispatch( [ 'dependency_ids' => [ 12, 18, 22 ] ] );
Vänta på en startad arbetsflödesgrupp
Om ett tidigare steg av typen start_workflows() eller start_agents() lagrade en beständig gruppnyckel kan du vänta direkt på gruppen i stället för att själv föra arbetsflödes-ID:n genom det publika tillståndet.
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();
Vad som händer medan arbetsflödet väntar
När ett arbetsflöde når ett av de här stegen ändras dess status till waiting_for_workflows. Ingen arbetare är knuten till det medan det väntar.
$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']
Om ett beroende redan har slutförts innan väntesteget nås fortsätter arbetsflödet omedelbart.
Felhantering
Väntan på arbetsflödesberoenden är inriktad på lyckade resultat:
wait_for_workflow()ochWaitMode::Allmisslyckas om något obligatoriskt beroende misslyckas eller avbryts.WaitMode::Anymisslyckas bara när alla beroenden har nått ett sluttillstånd och inget har slutförts utan fel.WaitMode::Quorummisslyckas när de återstående aktiva arbetsflödena inte längre kan uppfylla det erforderliga kvorumet.
Därför är väntan på arbetsflöden användbar i system med planerare och exekverare, där ett arbetsflöde kan skapa arbete och ett annat kan vänta på resultat från all eller på den första lyckade grenen som blir klar.