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 workflowwait_for_workflows()voor meerdere workflows met de semantiek vanall,anyofquorumwait_for_workflow_group()wanneer de workflow-ID's afkomstig zijn van een eerder gestarte groep
Wachten op één workflow
$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:
$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
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::Allwordt pas hervat wanneer alle vermelde workflows zijn voltooid.WaitMode::Anywordt hervat zodra de eerste vermelde workflow is voltooid.WaitMode::Quorumwordt hervat zodra het vereiste aantal workflows succesvol is voltooid.
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:
[
'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:
Queuety::workflow( 'agent_follow_up' )
->wait_for_workflow( 'parent_workflow_id', 'parent' )
->then( FinalizeAgentRunStep::class )
->dispatch( [ 'parent_workflow_id' => $workflow_id ] );
Voor meerdere afhankelijkheden:
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.
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.
$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()enWaitMode::Allmislukken als een vereiste afhankelijkheid mislukt of wordt geannuleerd.WaitMode::Anymislukt alleen wanneer elke afhankelijkheid een eindstatus heeft bereikt en geen enkele succesvol is voltooid.WaitMode::Quorummislukt 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.