Siirry sisältöön

Työnkulkujen riippuvuudet

Käytä työnkulkujen riippuvuusodotuksia, kun ylätason työnkulun tulisi jatkua vasta muiden työnkulkujen valmistuttua. Näin voit koordinoida työnkulkuja pakottamatta kaikkea yhteen suureen työnkulun määritelmään.

Nämä odotukset sopivat erityisen hyvin yhteen Async Handoffs-toiminnon kanssa, jossa yksi työnkulku käynnistää ensin itsenäiset alityönkulut ja odottaa niitä myöhemmin.

Katso kattavammat suunnittelija/suorittaja-esimerkit kohdasta Agent Orchestration.

Queuety tarjoaa kolme rakentajametodia:

  • wait_for_workflow() yhdelle työnkululle
  • wait_for_workflows() useille työnkuluille, joiden all-, any- tai quorum-semantiikkaa käytetään
  • wait_for_workflow_group(), kun työnkulkujen tunnukset saadaan aiemmin käynnistetystä ryhmästä

Odota yhtä työnkulkua

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

Kun research_run valmistuu, editorial_run jatkaa. Kun result_key on asetettu, valmistuneen riippuvuuden tila tallennetaan kyseisen avaimen alle:

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

Ilman result_key-arvoa riippuvuustyönkulun julkinen tila yhdistetään odottavan työnkulun ylimmän tason tilaan.

Odota useita työnkulkuja

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 jatkaa vasta, kun kaikki luetellut työnkulut ovat valmistuneet.
  • WaitMode::Any jatkaa, kun ensimmäinen luetelluista työnkuluista valmistuu.
  • WaitMode::Quorum jatkaa, kun vaadittu määrä työnkulkuja on valmistunut onnistuneesti.
PHP
Queuety::workflow( 'synthesis_run' )
    ->wait_for_workflows(
        [ $research_id, $editorial_id, $legal_id ],
        WaitMode::Quorum,
        'dependencies',
        quorum: 2,
    )
    ->then( PublishPacketStep::class )
    ->dispatch();

Kun result_key on käytössä, usean työnkulun odotuksissa valmistuneiden riippuvuuksien tila tallennetaan työnkulun tunnuksen mukaan:

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

Ilman result_key-arvoa valmistuneiden riippuvuuksien tila yhdistetään odottavan työnkulun ylimmän tason tilaan riippuvuusjärjestyksessä.

Riippuvuustunnusten ratkaiseminen työnkulun tilasta

Voit lykätä riippuvuusluettelon muodostamista suoritusaikaan lukemalla työnkulkujen tunnukset julkisesta tilasta:

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

Useita riippuvuuksia varten:

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

Odota käynnistettyä työnkulkuryhmää

Jos aiempi start_workflows()- tai start_agents()-vaihe tallensi pysyvän ryhmäavaimen, voit odottaa suoraan kyseistä ryhmää sen sijaan, että välittäisit työnkulkujen tunnukset itse julkisen tilan kautta.

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

Mitä odotuksen aikana tapahtuu

Kun työnkulku saavuttaa jonkin näistä vaiheista, sen tilaksi tulee waiting_for_workflows. Mikään työntekijä ei pysy siihen liitettynä odotuksen aikana.

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

Jos riippuvuus on jo valmistunut ennen odotusvaiheen saavuttamista, työnkulku jatkuu heti.

Virhetilanteiden semantiikka

Työnkulun riippuvuusodotukset painottavat onnistumista:

  • wait_for_workflow() ja WaitMode::All epäonnistuvat, jos jokin vaadittu riippuvuus epäonnistuu tai peruutetaan.
  • WaitMode::Any epäonnistuu vain, kun kaikki riippuvuudet ovat päättyneet eikä yksikään valmistunut onnistuneesti.
  • WaitMode::Quorum epäonnistuu, kun jäljellä olevat aktiiviset työnkulut eivät enää voi saavuttaa vaadittua päätösvaltaisuutta.

Näin työnkulkujen odotukset soveltuvat suunnittelija/suorittaja-järjestelmiin, joissa yksi työnkulku voi luoda kunkin työn ja toinen odottaa all-tuloksia tai ensimmäistä valmistuvaa onnistunutta haaraa.