Liigu sisu juurde

Töövoogude sõltuvused

Kasuta töövoogude sõltuvuste ootamist, kui üks tipptaseme töövoog peaks jätkuma alles pärast teiste töövoogude lõpulejõudmist. Nii saad töövooge koordineerida, surumata kogu loogikat ühte hiiglaslikku töövoomääratlusse.

Need ootamised sobivad eriti hästi kokku asünkroonsete üleandmistega, kus üks töövoog käivitab esmalt sõltumatud alam töövood ja ootab neid hiljem.

Täielikumaid planeerija ja täitja näiteid leiad jaotisest Agentide orkestreerimine.

Queuety pakub kolme koostajameetodit:

  • wait_for_workflow() ühe töövoo jaoks
  • wait_for_workflows() mitme töövoo jaoks semantikaga all, any või quorum
  • wait_for_workflow_group(), kui töövoogude ID-d pärinevad varem käivitatud rühmast

Oota üht töövoogu

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();

Kui research_run lõpetab, jätkab editorial_run tööd. Kui määratud on result_key, talletatakse lõpetatud sõltuvuse olek selle võtme alla:

PHP
$state['research']; // public state from the completed research workflow

Ilma result_key-ta liidetakse sõltuvustöövoo avalik olek ootava töövoo tipptaseme olekusse.

Oota mitut töövoogu

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 jätkab tööd alles siis, kui kõik loetletud töövood on lõpule jõudnud.
  • WaitMode::Any jätkab tööd esimese loetletud töövoo lõpule jõudmisel.
  • WaitMode::Quorum jätkab tööd, kui nõutud arv töövooge on edukalt lõpule jõudnud.
PHP
Queuety::workflow( 'synthesis_run' )
    ->wait_for_workflows(
        [ $research_id, $editorial_id, $legal_id ],
        WaitMode::Quorum,
        'dependencies',
        quorum: 2,
    )
    ->then( PublishPacketStep::class )
    ->dispatch();

Kui määratud on result_key, salvestavad mitme töövoo ootamised lõpetatud sõltuvuste oleku töövoo ID järgi:

PHP
[
    '42' => [ 'summary' => '...' ],
    '43' => [ 'summary' => '...' ],
]

Ilma result_key-ta liidetakse lõpetatud sõltuvuste olek sõltuvuste järjekorras ootava töövoo tipptaseme olekusse.

Sõltuvuste ID-de määramine töövoo oleku põhjal

Sõltuvuste loendi saab edasi lükata käitusajani, lugedes töövoo avalikust olekust töövoogude ID-d:

PHP
Queuety::workflow( 'agent_follow_up' )
    ->wait_for_workflow( 'parent_workflow_id', 'parent' )
    ->then( FinalizeAgentRunStep::class )
    ->dispatch( [ 'parent_workflow_id' => $workflow_id ] );

Mitme sõltuvuse korral:

PHP
Queuety::workflow( 'aggregator' )
    ->wait_for_workflows( 'dependency_ids', WaitMode::Any, 'winner' )
    ->dispatch( [ 'dependency_ids' => [ 12, 18, 22 ] ] );

Oota käivitatud töövoogude rühma

Kui eelmine samm start_workflows() või start_agents() salvestas püsiva rühma võtme, saad ise töövoogude ID-sid avaliku oleku kaudu edastamata otse selle rühma ootama jääda.

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();

Mis ootamise ajal juhtub

Kui töövoog jõuab ühe sellise sammuni, muutub selle olekuks waiting_for_workflows. Ootamise ajal ei jää ükski töötaja sellega seotuks.

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']

Kui sõltuvus on enne ootamissammuni jõudmist juba lõpule jõudnud, jätkub töövoog kohe.

Tõrgete käsitlemine

Töövoogude sõltuvuste ootamine eeldab edukat lõpulejõudmist:

  • wait_for_workflow() ja WaitMode::All nurjuvad, kui mõni nõutud sõltuvus nurjub või tühistatakse.
  • WaitMode::Any nurjub ainult siis, kui kõik sõltuvused on jõudnud lõppolekusse ja ükski neist pole edukalt lõpule jõudnud.
  • WaitMode::Quorum nurjub, kui allesjäänud aktiivsed töövood ei suuda enam nõutud kvoorumit täita.

Seetõttu sobivad töövoogude ootamised planeerija ja täitja süsteemidesse, kus üks töövoog saab tööd koordineerida ja teine oodata all tulemusi või esimest edukat haru, mis lõpule jõuab.