Dependențe între fluxuri de lucru
Folosiți așteptarea dependențelor dintre fluxurile de lucru când un flux de lucru de nivel superior ar trebui să continue numai după încheierea altor fluxuri de lucru. Astfel, coordonați fluxuri de lucru diferite fără a forța includerea tuturor într-o singură definiție uriașă.
Aceste așteptări se potrivesc în special cu Transferuri asincrone, când un flux de lucru pornește mai întâi fluxuri de lucru copil independente, apoi le așteaptă.
Pentru exemple mai ample de planificator și executant, consultați Orchestrarea agenților.
Queuety oferă trei metode pentru constructor:
wait_for_workflow()pentru un flux de lucruwait_for_workflows()pentru mai multe fluxuri de lucru cu semanticaall,anysauquorumwait_for_workflow_group()când ID-urile fluxurilor de lucru provin dintr-un grup pornit anterior
Așteptarea unui singur flux de lucru
$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();
Când se încheie research_run, editorial_run se reia. Dacă este setat result_key, starea dependenței încheiate este stocată sub acea cheie:
$state['research']; // public state from the completed research workflow
Fără result_key, starea publică a fluxului de lucru dependent este îmbinată în starea de nivel superior a fluxului de lucru aflat în așteptare.
Așteptarea mai multor fluxuri de lucru
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::Allreia fluxul de lucru numai după încheierea tuturor fluxurilor de lucru enumerate.WaitMode::Anyreia fluxul de lucru când se încheie primul flux de lucru enumerat.WaitMode::Quorumreia fluxul de lucru după ce se încheie cu succes numărul necesar de fluxuri de lucru.
Queuety::workflow( 'synthesis_run' )
->wait_for_workflows(
[ $research_id, $editorial_id, $legal_id ],
WaitMode::Quorum,
'dependencies',
quorum: 2,
)
->then( PublishPacketStep::class )
->dispatch();
Cu result_key, așteptările pentru mai multe fluxuri de lucru stochează starea dependențelor încheiate, indexată după ID-ul fluxului de lucru:
[
'42' => [ 'summary' => '...' ],
'43' => [ 'summary' => '...' ],
]
Fără result_key, starea dependențelor încheiate este îmbinată în starea de nivel superior a fluxului de lucru aflat în așteptare, în ordinea dependențelor.
Rezolvarea ID-urilor dependențelor din starea fluxului de lucru
Puteți amâna lista dependențelor până la execuție, citind ID-urile fluxurilor de lucru din starea publică:
Queuety::workflow( 'agent_follow_up' )
->wait_for_workflow( 'parent_workflow_id', 'parent' )
->then( FinalizeAgentRunStep::class )
->dispatch( [ 'parent_workflow_id' => $workflow_id ] );
Pentru mai multe dependențe:
Queuety::workflow( 'aggregator' )
->wait_for_workflows( 'dependency_ids', WaitMode::Any, 'winner' )
->dispatch( [ 'dependency_ids' => [ 12, 18, 22 ] ] );
Așteptarea unui grup de fluxuri de lucru pornit
Dacă un pas start_workflows() sau start_agents() anterior a stocat o cheie de grup durabilă, puteți aștepta direct acel grup, în loc să transmiteți singur ID-urile fluxurilor de lucru prin starea publică.
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();
Ce se întâmplă în timpul așteptării
Când un flux de lucru ajunge la unul dintre acești pași, trece în starea waiting_for_workflows. Niciun worker nu rămâne asociat fluxului de lucru în timp ce acesta așteaptă.
$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']
Dacă o dependență s-a încheiat deja înainte de atingerea pasului de așteptare, fluxul de lucru continuă imediat.
Semantica eșecului
Așteptarea dependențelor dintre fluxurile de lucru este orientată spre succes:
wait_for_workflow()șiWaitMode::Alleșuează dacă vreo dependență necesară eșuează sau este anulată.WaitMode::Anyeșuează numai când toate dependențele ajung într-o stare terminală și niciuna nu s-a încheiat cu succes.WaitMode::Quorumeșuează când fluxurile de lucru active rămase nu mai pot îndeplini cvorumul necesar.
Astfel, așteptarea fluxurilor de lucru este utilă în sistemele de planificare și execuție, în care un flux de lucru poate distribui activitățile, iar altul poate aștepta rezultatele all sau prima ramură reușită care se încheie.