Pāriet uz saturu

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ūsmai
  • wait_for_workflows() vairākām darbplūsmām ar all, any vai quorum semantiku
  • wait_for_workflow_group(), ja darbplūsmu ID tiek iegūti no iepriekš sāktas grupas

Gaidīt vienu darbplūsmu

PHP
$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:

PHP
$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

PHP
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 atsāk darbību tikai tad, kad visas norādītās darbplūsmas ir pabeigtas.
  • WaitMode::Any atsāk darbību, kad pabeigta pirmā no norādītajām darbplūsmām.
  • WaitMode::Quorum atsāk darbību, kad nepieciešamais darbplūsmu skaits ir veiksmīgi pabeigts.
PHP
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:

PHP
[
    '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:

PHP
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:

PHP
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.

PHP
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.

PHP
$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() un WaitMode::All cietīs neveiksmi, ja kāda nepieciešamā atkarīgā darbplūsma cietīs neveiksmi vai tiks atcelta.
  • WaitMode::Any cietī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::Quorum cietī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.