Dépendances entre flux de travail
Utilisez les attentes de dépendance entre flux lorsqu’un flux de premier niveau ne doit continuer qu’après la fin d’autres flux. Vous pouvez ainsi coordonner plusieurs flux sans tout regrouper dans une seule définition gigantesque.
Ces attentes se combinent particulièrement bien avec les transferts asynchrones : un flux démarre d’abord des flux enfants indépendants, puis les attend plus tard.
Pour des exemples plus complets de planificateur et d’exécuteur, consultez Orchestration d’agents.
Queuety fournit trois méthodes de générateur :
wait_for_workflow()pour un flux de travailwait_for_workflows()pour plusieurs flux avec une sémantiqueall,anyouquorumwait_for_workflow_group()lorsque les identifiants de flux proviennent d’un groupe démarré précédemment
Attendre un flux de travail
$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();
Lorsque research_run se termine, editorial_run reprend. Si result_key est défini, l’état de la dépendance terminée est enregistré sous cette clé :
$state['research']; // public state from the completed research workflow
Sans result_key, l’état public du flux de dépendance est fusionné dans l’état de premier niveau du flux en attente.
Attendre plusieurs flux de travail
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::Allreprend uniquement lorsque tous les flux répertoriés sont terminés.WaitMode::Anyreprend dès que le premier flux répertorié se termine.WaitMode::Quorumreprend dès qu’un nombre requis de flux est terminé avec succès.
Queuety::workflow( 'synthesis_run' )
->wait_for_workflows(
[ $research_id, $editorial_id, $legal_id ],
WaitMode::Quorum,
'dependencies',
quorum: 2,
)
->then( PublishPacketStep::class )
->dispatch();
Avec result_key, les attentes portant sur plusieurs flux enregistrent l’état des dépendances terminées sous forme de paires identifiant de flux et état :
[
'42' => [ 'summary' => '...' ],
'43' => [ 'summary' => '...' ],
]
Sans result_key, l’état des dépendances terminées est fusionné dans l’état de premier niveau du flux en attente, selon l’ordre des dépendances.
Résoudre les identifiants des dépendances à partir de l’état du flux
Vous pouvez reporter la liste des dépendances jusqu’à l’exécution en lisant les identifiants des flux dans l’état public :
Queuety::workflow( 'agent_follow_up' )
->wait_for_workflow( 'parent_workflow_id', 'parent' )
->then( FinalizeAgentRunStep::class )
->dispatch( [ 'parent_workflow_id' => $workflow_id ] );
Pour plusieurs dépendances :
Queuety::workflow( 'aggregator' )
->wait_for_workflows( 'dependency_ids', WaitMode::Any, 'winner' )
->dispatch( [ 'dependency_ids' => [ 12, 18, 22 ] ] );
Attendre un groupe de flux déjà démarré
Si une étape start_workflows() ou start_agents() précédente a enregistré une clé de groupe durable, vous pouvez attendre directement ce groupe au lieu de faire transiter vous-même les identifiants des flux dans l’état public.
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();
Fonctionnement de l’attente
Lorsqu’un flux de travail atteint l’une de ces étapes, il passe au statut waiting_for_workflows. Aucun worker ne lui reste attaché pendant l’attente.
$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']
Si une dépendance est déjà terminée lorsque l’étape d’attente est atteinte, le flux continue immédiatement.
Sémantique des échecs
Les attentes de dépendance entre flux de travail privilégient la réussite :
wait_for_workflow()etWaitMode::Alléchouent si une dépendance requise échoue ou est annulée.WaitMode::Anyéchoue uniquement lorsque toutes les dépendances ont atteint un état terminal et qu’aucune n’a réussi.WaitMode::Quoruméchoue lorsque les flux encore actifs ne peuvent plus satisfaire le quorum requis.
Les attentes entre flux sont donc utiles dans les systèmes de planificateur et d’exécuteur : un flux peut répartir le travail et un autre attendre les résultats de all ou la première branche terminée avec succès.