Ga naar de inhoud

Workflowafhankelijkheden

Gebruik wachttijden voor workflowafhankelijkheden wanneer één workflow op hoofdniveau pas verder mag gaan nadat andere workflows zijn voltooid. Zo coördineer je verschillende workflows zonder alles in één enorme workflowdefinitie te stoppen.

Deze wachttijden werken bijzonder goed samen met Asynchrone overdrachten, waarbij één workflow eerst onafhankelijke onderliggende workflows start en er later op wacht.

Zie Agentorkestratie voor uitgebreidere voorbeelden van planner en executor.

Queuety biedt drie buildermethoden:

  • wait_for_workflow() voor één workflow
  • wait_for_workflows() voor meerdere workflows met de semantiek van all, any of quorum
  • wait_for_workflow_group() wanneer de workflow-ID's afkomstig zijn van een eerder gestarte groep

Wachten op één 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();

Wanneer research_run is voltooid, wordt editorial_run hervat. Als result_key is ingesteld, wordt de status van de voltooide afhankelijkheid onder die sleutel opgeslagen:

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

Zonder result_key wordt de openbare status van de afhankelijke workflow samengevoegd met de status op hoofdniveau van de wachtende workflow.

Wachten op meerdere workflows

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 wordt pas hervat wanneer alle vermelde workflows zijn voltooid.
  • WaitMode::Any wordt hervat zodra de eerste vermelde workflow is voltooid.
  • WaitMode::Quorum wordt hervat zodra het vereiste aantal workflows succesvol is voltooid.
PHP
Queuety::workflow( 'synthesis_run' )
    ->wait_for_workflows(
        [ $research_id, $editorial_id, $legal_id ],
        WaitMode::Quorum,
        'dependencies',
        quorum: 2,
    )
    ->then( PublishPacketStep::class )
    ->dispatch();

Met result_key wordt de status van voltooide afhankelijkheden bij wachttijden voor meerdere workflows opgeslagen onder de workflow-ID:

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

Zonder result_key wordt de status van voltooide afhankelijkheden in de volgorde van de afhankelijkheden samengevoegd met de status op hoofdniveau van de wachtende workflow.

Afhankelijkheids-ID's uit de workflowstatus ophalen

Je kunt de lijst met afhankelijkheden uitstellen tot runtime door workflow-ID's uit de openbare status te lezen:

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

Voor meerdere afhankelijkheden:

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

Wachten op een gestarte workflowgroep

Als een eerdere stap start_workflows() of start_agents() een duurzame groepssleutel heeft opgeslagen, kun je rechtstreeks op die groep wachten in plaats van workflow-ID's zelf door de openbare status door te geven.

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

Wat gebeurt er tijdens het wachten

Wanneer een workflow een van deze stappen bereikt, krijgt deze de status waiting_for_workflows. Tijdens het wachten blijft er geen worker aan gekoppeld.

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

Als een afhankelijkheid al is voltooid voordat de wachtstap wordt bereikt, gaat de workflow onmiddellijk verder.

Foutsemantiek

Wachttijden voor workflowafhankelijkheden zijn gericht op succes:

  • wait_for_workflow() en WaitMode::All mislukken als een vereiste afhankelijkheid mislukt of wordt geannuleerd.
  • WaitMode::Any mislukt alleen wanneer elke afhankelijkheid een eindstatus heeft bereikt en geen enkele succesvol is voltooid.
  • WaitMode::Quorum mislukt wanneer de resterende actieve workflows niet langer aan het vereiste quorum kunnen voldoen.

Hierdoor zijn wachttijden voor workflows nuttig in planner- en executorsystemen, waarin de ene workflow werk kan verdelen en een andere kan wachten op resultaten all of op de eerste succesvolle vertakking die klaar is.