Pereiti prie turinio

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 eigai
  • wait_for_workflows() – kelioms darbo eigoms, naudojant all, any arba quorum semantiką
  • wait_for_workflow_group() – kai darbo eigos ID gaunami iš anksčiau paleistos grupės

Laukimas, kol bus užbaigta viena darbo eiga

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

Užbaigus research_run, tęsiama editorial_run. Nustačius result_key, užbaigtos priklausomybės būsena saugoma nurodytu raktu:

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

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 tęsia darbą tik užbaigus visas išvardytas darbo eigas.
  • WaitMode::Any tęsia darbą užbaigus pirmajai išvardytai darbo eigai.
  • WaitMode::Quorum tęsia darbą, kai sėkmingai užbaigiamas reikiamas darbo eigų skaičius.
PHP
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:

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

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

Kelioms priklausomybėms:

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

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 vyksta laukiant

Pasiekusi vieną iš šių žingsnių, darbo eiga pereina į waiting_for_workflows būseną. Laukimo metu joks darbuotojas jai nepriskiriamas.

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

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() ir WaitMode::All nepavyksta, jei kuri nors būtina priklausomybė nepavyksta arba atšaukiama.
  • WaitMode::Any nepavyksta tik tada, kai visos priklausomybės pasiekia galutinę būseną ir nė viena neužbaigiama sėkmingai.
  • WaitMode::Quorum nepavyksta, 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.