Darbplūsmu atkarības
Izmantojiet darbplūsmu atkarību gaidīšanu, ja vienai augstākā līmeņa darbplūsmai jāturpinās tikai pēc citu darbplūsmu pabeigšanas. Tas ļauj koordinēt vairākas darbplūsmas, neapvienojot visu vienā milzīgā darbplūsmas definīcijā.
Šāda gaidīšana īpaši labi sader ar Asinhroniem nodošanas procesiem, kad viena darbplūsma vispirms sāk neatkarīgas pakārtotās darbplūsmas un vēlāk tās sagaida.
Pilnīgākus plānotāja un izpildītāja piemērus skatiet sadaļā Aģentu orķestrēšana.
Queuety nodrošina trīs veidotāja metodes:
wait_for_workflow()vienai darbplūsmaiwait_for_workflows()vairākām darbplūsmām arall,anyvaiquorumsemantikuwait_for_workflow_group(), ja darbplūsmu ID tiek iegūti no iepriekš sāktas grupas
Gaidīt vienu darbplūsmu
$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();
Kad research_run ir pabeigta, editorial_run atsāk darbību. Ja ir iestatīts result_key, pabeigtās atkarīgās darbplūsmas stāvoklis tiek saglabāts ar šo atslēgu:
$state['research']; // public state from the completed research workflow
Ja nav norādīts result_key, atkarīgās darbplūsmas publiskais stāvoklis tiek apvienots ar gaidošās darbplūsmas augstākā līmeņa stāvokli.
Gaidīt vairākas darbplūsmas
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::Allatsāk darbību tikai tad, kad visas norādītās darbplūsmas ir pabeigtas.WaitMode::Anyatsāk darbību, kad pabeigta pirmā no norādītajām darbplūsmām.WaitMode::Quorumatsāk darbību, kad nepieciešamais darbplūsmu skaits ir veiksmīgi pabeigts.
Queuety::workflow( 'synthesis_run' )
->wait_for_workflows(
[ $research_id, $editorial_id, $legal_id ],
WaitMode::Quorum,
'dependencies',
quorum: 2,
)
->then( PublishPacketStep::class )
->dispatch();
Ar result_key vairāku darbplūsmu gaidīšanas gadījumā pabeigto atkarīgo darbplūsmu stāvoklis tiek saglabāts, izmantojot darbplūsmas ID kā atslēgas:
[
'42' => [ 'summary' => '...' ],
'43' => [ 'summary' => '...' ],
]
Ja nav norādīts result_key, pabeigto atkarīgo darbplūsmu stāvoklis atkarību secībā tiek apvienots ar gaidošās darbplūsmas augstākā līmeņa stāvokli.
Atkarību ID iegūšana no darbplūsmas stāvokļa
Atkarību sarakstu varat atlikt līdz izpildlaikam, iegūstot darbplūsmu ID no publiskā stāvokļa:
Queuety::workflow( 'agent_follow_up' )
->wait_for_workflow( 'parent_workflow_id', 'parent' )
->then( FinalizeAgentRunStep::class )
->dispatch( [ 'parent_workflow_id' => $workflow_id ] );
Vairākām atkarībām:
Queuety::workflow( 'aggregator' )
->wait_for_workflows( 'dependency_ids', WaitMode::Any, 'winner' )
->dispatch( [ 'dependency_ids' => [ 12, 18, 22 ] ] );
Gaidīt sāktu darbplūsmu grupu
Ja iepriekšējā start_workflows() vai start_agents() solī tika saglabāta noturīga grupas atslēga, varat gaidīt tieši šo grupu, nevis pašiem nodot darbplūsmu ID, izmantojot publisko stāvokli.
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();
Kas notiek gaidīšanas laikā
Kad darbplūsma sasniedz kādu no šiem soļiem, tās statuss tiek mainīts uz waiting_for_workflows. Gaidīšanas laikā neviens darbinieks tai nav piesaistīts.
$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']
Ja atkarīgā darbplūsma ir pabeigta, pirms tiek sasniegts gaidīšanas solis, darbplūsma turpinās nekavējoties.
Kļūmju apstrādes semantika
Darbplūsmu atkarību gaidīšanas ir orientētas uz veiksmīgu izpildi:
wait_for_workflow()unWaitMode::Allcietīs neveiksmi, ja kāda nepieciešamā atkarīgā darbplūsma cietīs neveiksmi vai tiks atcelta.WaitMode::Anycietīs neveiksmi tikai tad, kad visas atkarīgās darbplūsmas būs sasniegušas galīgo statusu un neviena nebūs veiksmīgi pabeigta.WaitMode::Quorumcietīs neveiksmi, ja atlikušās aktīvās darbplūsmas vairs nespēs sasniegt nepieciešamo kvorumu.
Tāpēc darbplūsmu gaidīšana noder plānotāja un izpildītāja sistēmās, kur viena darbplūsma var pieprasīt darbu, bet cita var gaidīt all rezultātus vai pirmo veiksmīgo pabeigto zaru.