Přejít k obsahu

Závislosti workflow

Čekání na závislá workflow použijte, pokud má jedno workflow nejvyšší úrovně pokračovat až po dokončení ostatních workflow. Získáte tak koordinaci mezi workflow, aniž byste museli vše sloučit do jediné rozsáhlé definice.

Tato čekání se obzvlášť dobře kombinují s Asynchronním předáním, kdy jedno workflow nejprve spustí nezávislá podřízená workflow a později na ně čeká.

Podrobnější příklady plánování a vykonávání najdete v části Orchestrace agentů.

Queuety nabízí tři metody builderu:

  • wait_for_workflow() pro jedno workflow
  • wait_for_workflows() pro několik workflow se sémantikou all, any nebo quorum
  • wait_for_workflow_group(), pokud ID workflow pocházejí z dříve spuštěné skupiny

Čekání na jedno workflow

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

Po dokončení research_run bude editorial_run pokračovat. Pokud je nastaveno result_key, stav dokončeného závislého workflow se uloží pod tento klíč:

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

Pokud není zadáno result_key, veřejný stav závislého workflow se sloučí do stavu čekajícího workflow na nejvyšší úrovni.

Čekání na několik workflow

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 pokračuje až po dokončení všech uvedených workflow.
  • WaitMode::Any pokračuje po dokončení prvního uvedeného workflow.
  • WaitMode::Quorum pokračuje po úspěšném dokončení požadovaného počtu workflow.
PHP
Queuety::workflow( 'synthesis_run' )
    ->wait_for_workflows(
        [ $research_id, $editorial_id, $legal_id ],
        WaitMode::Quorum,
        'dependencies',
        quorum: 2,
    )
    ->then( PublishPacketStep::class )
    ->dispatch();

Při použití result_key ukládají čekání na více workflow stav dokončených závislostí pod klíčem tvořeným ID workflow:

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

Bez result_key se stav dokončených závislostí sloučí do nejvyšší úrovně stavu čekajícího workflow v pořadí závislostí.

Načtení ID závislostí ze stavu workflow

Seznam závislostí můžete sestavit až za běhu načtením ID workflow z veřejného stavu:

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

Pro několik závislostí:

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

Čekání na spuštěnou skupinu workflow

Pokud předchozí krok start_workflows() nebo start_agents() uložil trvalý klíč skupiny, můžete čekat přímo na tuto skupinu místo toho, abyste ID workflow předávali přes veřejný stav.

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

Co se děje během čekání

Když workflow dosáhne jednoho z těchto kroků, přejde do stavu waiting_for_workflows. Během čekání u něj nezůstává žádný worker.

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

Pokud závislost skončila ještě před dosažením čekacího kroku, workflow okamžitě pokračuje.

Chování při selhání

Čekání na závislosti workflow se řídí úspěchem:

  • wait_for_workflow() a WaitMode::All selžou, pokud kterákoli povinná závislost selže nebo je zrušena.
  • WaitMode::Any selže pouze tehdy, když všechny závislosti dosáhnou konečného stavu a žádná nebyla úspěšně dokončena.
  • WaitMode::Quorum selže, když zbývající aktivní workflow už nemohou splnit požadované kvórum.

Díky tomu se čekání na workflow hodí pro systémy plánovače a vykonavatele, kde jedno workflow může rozdělovat práci a jiné čekat na výsledky all nebo na dokončení první úspěšné větve.