Preskoči na vsebino

Odvisnosti potekov dela

Čakanje na odvisnost poteka dela uporabite, kadar naj se vrhnji potek dela nadaljuje šele po zaključku drugih potekov dela. Tako usklajujete različne poteke dela, ne da bi vse prisilno združili v eno velikansko definicijo poteka dela.

Takšna čakanja se še posebej dobro dopolnjujejo s asinhronimi predajami, pri katerih en potek dela najprej zažene neodvisne podrejene poteke dela in nato pozneje počaka nanje.

Za podrobnejše primere načrtovalnika in izvajalnika glejte orkestracijo agentov.

Queuety ponuja tri metode gradnika:

  • wait_for_workflow() za en potek dela
  • wait_for_workflows() za več potekov dela s semantiko all, any ali quorum
  • wait_for_workflow_group(), kadar ID-ji potekov dela izvirajo iz predhodno zagnane skupine

Čakanje na en potek dela

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

Ko se research_run zaključi, se editorial_run nadaljuje. Če je nastavljeno result_key, se stanje zaključene odvisnosti shrani pod tem ključem:

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

Če ni nastavljenega result_key, se javno stanje odvisnega poteka dela združi z vrhnjim stanjem čakajočega poteka dela.

Čakanje na več potekov dela

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 nadaljuje samo, ko so zaključeni vsi navedeni poteki dela.
  • WaitMode::Any nadaljuje, ko se zaključi prvi navedeni potek dela.
  • WaitMode::Quorum nadaljuje, ko se uspešno zaključi zahtevano število potekov dela.
PHP
Queuety::workflow( 'synthesis_run' )
    ->wait_for_workflows(
        [ $research_id, $editorial_id, $legal_id ],
        WaitMode::Quorum,
        'dependencies',
        quorum: 2,
    )
    ->then( PublishPacketStep::class )
    ->dispatch();

Z result_key se stanja zaključenih odvisnosti pri čakanju na več potekov dela shranijo pod ključi z ID-ji potekov dela:

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

Če ni nastavljenega result_key, se stanje zaključenih odvisnosti združi z vrhnjim stanjem čakajočega poteka dela v vrstnem redu odvisnosti.

Razreševanje ID-jev odvisnosti iz stanja poteka dela

Seznam odvisnosti lahko določite šele med izvajanjem, tako da iz javnega stanja preberete ID-je potekov dela:

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

Za več odvisnosti:

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

Čakanje na zagnano skupino potekov dela

Če je predhodni korak start_workflows() ali start_agents() shranil trajni ključ skupine, lahko počakate neposredno na to skupino, namesto da sami prenašate ID-je potekov dela prek javnega stanja.

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

Kaj se zgodi med čakanjem

Ko potek dela doseže enega od teh korakov, preide v stanje waiting_for_workflows. Med čakanjem nanj ni vezan noben delavec.

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

Če se odvisnost zaključi, preden je dosežen korak čakanja, se potek dela takoj nadaljuje.

Semantika napak

Čakanja na odvisnosti potekov dela so usmerjena v uspeh:

  • wait_for_workflow() in WaitMode::All spodletita, če katera koli zahtevana odvisnost spodleti ali je preklicana.
  • WaitMode::Any spodleti samo, ko vse odvisnosti dosežejo končno stanje in se nobena ne zaključi uspešno.
  • WaitMode::Quorum spodleti, ko preostali aktivni poteki dela ne morejo več doseči zahtevanega kvoruma.

Zato so čakanja na poteke dela uporabna v sistemih z načrtovalnikom in izvajalnikom, kjer lahko en potek dela poskrbi za delo, drugi pa počaka na rezultate all ali na prvo uspešno vejo, ki se zaključi.