Darbo eigų priklausomybės
Naudokite laukimą pagal darbo eigos priklausomybes, kai viena aukščiausio lygmens darbo eiga turėtų tęstis tik užbaigus kitas darbo eigas. Taip koordinuojamos skirtingos darbo eigos, nesujungiant visko į vieną milžinišką darbo eigos aprašą.
Šie laukimo žingsniai ypač dera su asinchroniniais perdavimais: viena darbo eiga pirmiausia paleidžia nepriklausomas antrines darbo eigas, o vėliau jų laukia.
Išsamesnių planuotojo ir vykdytojo pavyzdžių rasite čia: Agentų orkestravimas.
Queuety pateikia tris kūrimo grandinės metodus:
wait_for_workflow()– vienai darbo eigaiwait_for_workflows()– kelioms darbo eigoms, naudojantall,anyarbaquorumsemantikąwait_for_workflow_group()– kai darbo eigos ID gaunami iš anksčiau paleistos grupės
Laukimas, kol bus užbaigta viena darbo eiga
$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();
Užbaigus research_run, tęsiama editorial_run. Nustačius result_key, užbaigtos priklausomybės būsena saugoma nurodytu raktu:
$state['research']; // public state from the completed research workflow
Nenurodžius result_key, priklausomos darbo eigos vieša būsena sujungiama su laukiančios darbo eigos aukščiausio lygmens būsena.
Laukimas, kol bus užbaigtos kelios darbo eigos
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::Alltęsia darbą tik užbaigus visas išvardytas darbo eigas.WaitMode::Anytęsia darbą užbaigus pirmajai išvardytai darbo eigai.WaitMode::Quorumtęsia darbą, kai sėkmingai užbaigiamas reikiamas darbo eigų skaičius.
Queuety::workflow( 'synthesis_run' )
->wait_for_workflows(
[ $research_id, $editorial_id, $legal_id ],
WaitMode::Quorum,
'dependencies',
quorum: 2,
)
->then( PublishPacketStep::class )
->dispatch();
Naudojant result_key, laukiant kelių darbo eigų užbaigtų priklausomybių būsenos saugomos pagal darbo eigos ID:
[
'42' => [ 'summary' => '...' ],
'43' => [ 'summary' => '...' ],
]
Nenurodžius result_key, užbaigtų priklausomybių būsenos sujungiamos su laukiančios darbo eigos aukščiausio lygmens būsena priklausomybių tvarka.
Priklausomybių ID gavimas iš darbo eigos būsenos
Priklausomybių sąrašą galima sudaryti vykdymo metu, nuskaitant darbo eigos ID iš viešos būsenos:
Queuety::workflow( 'agent_follow_up' )
->wait_for_workflow( 'parent_workflow_id', 'parent' )
->then( FinalizeAgentRunStep::class )
->dispatch( [ 'parent_workflow_id' => $workflow_id ] );
Kelioms priklausomybėms:
Queuety::workflow( 'aggregator' )
->wait_for_workflows( 'dependency_ids', WaitMode::Any, 'winner' )
->dispatch( [ 'dependency_ids' => [ 12, 18, 22 ] ] );
Laukimas, kol bus užbaigta paleistų darbo eigų grupė
Jei ankstesnis start_workflows() arba start_agents() žingsnis išsaugojo patvarų grupės raktą, galite laukti tiesiogiai šios grupės ir neperduoti darbo eigų ID per viešą būseną.
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 vyksta laukiant
Pasiekusi vieną iš šių žingsnių, darbo eiga pereina į waiting_for_workflows būseną. Laukimo metu joks darbuotojas jai nepriskiriamas.
$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']
Jei priklausomybė užbaigta dar prieš pasiekiant laukimo žingsnį, darbo eiga tęsiama iš karto.
Nesėkmės semantika
Laukimas pagal darbo eigos priklausomybes orientuotas į sėkmę:
wait_for_workflow()irWaitMode::Allnepavyksta, jei kuri nors būtina priklausomybė nepavyksta arba atšaukiama.WaitMode::Anynepavyksta tik tada, kai visos priklausomybės pasiekia galutinę būseną ir nė viena neužbaigiama sėkmingai.WaitMode::Quorumnepavyksta, kai likusios aktyvios darbo eigos nebegali pasiekti reikiamo kvorumo.
Dėl to darbo eigų laukimas naudingas planuotojo ir vykdytojo sistemose: viena darbo eiga gali parengti kiekvieną užduotį, o kita laukti all rezultatų arba pirmosios sėkmingai pasibaigusios šakos.