워크플로 종속성
최상위 워크플로가 다른 워크플로의 완료 후에만 계속되어야 할 때 워크플로 종속성 대기를 사용하세요. 모든 작업을 하나의 거대한 워크플로 정의에 넣지 않고도 워크플로 간 조정을 구현할 수 있습니다.
이 대기 기능은 Async Handoffs와 함께 사용하면 특히 유용합니다. 한 워크플로가 먼저 독립적인 하위 워크플로를 시작한 다음 나중에 완료를 기다릴 수 있습니다.
더 자세한 플래너/실행기 예시는 Agent Orchestration을 참조하세요.
Queuety은 세 가지 빌더 메서드를 제공합니다.
- 워크플로 하나에는
wait_for_workflow() - 여러 워크플로에는
wait_for_workflows()을 사용하며,all,any또는quorum의미를 지정합니다. - 워크플로 ID가 이전에 시작한 그룹에서 온 경우에는
wait_for_workflow_group()
워크플로 하나 기다리기
$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();
research_run이 완료되면 editorial_run이 다시 진행됩니다. result_key을 설정하면 완료된 종속성의 상태가 해당 키 아래에 저장됩니다.
$state['research']; // public state from the completed research workflow
result_key이 없으면 종속 워크플로의 공개 상태가 대기 중인 워크플로의 최상위 상태에 병합됩니다.
여러 워크플로 기다리기
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은 나열된 모든 워크플로가 완료된 경우에만 다시 진행합니다.WaitMode::Any은 나열된 워크플로 중 첫 번째가 완료되면 다시 진행합니다.WaitMode::Quorum은 필요한 수의 워크플로가 성공적으로 완료되면 다시 진행합니다.
Queuety::workflow( 'synthesis_run' )
->wait_for_workflows(
[ $research_id, $editorial_id, $legal_id ],
WaitMode::Quorum,
'dependencies',
quorum: 2,
)
->then( PublishPacketStep::class )
->dispatch();
result_key을 사용하면 여러 워크플로 대기에서 완료된 종속성 상태가 워크플로 ID를 키로 하여 저장됩니다.
[
'42' => [ 'summary' => '...' ],
'43' => [ 'summary' => '...' ],
]
result_key이 없으면 완료된 종속성 상태가 종속성 순서에 따라 대기 중인 워크플로의 최상위 상태에 병합됩니다.
워크플로 상태에서 종속성 ID 확인
공개 상태에서 워크플로 ID를 읽어 런타임까지 종속성 목록 결정을 미룰 수 있습니다.
Queuety::workflow( 'agent_follow_up' )
->wait_for_workflow( 'parent_workflow_id', 'parent' )
->then( FinalizeAgentRunStep::class )
->dispatch( [ 'parent_workflow_id' => $workflow_id ] );
여러 종속성의 경우:
Queuety::workflow( 'aggregator' )
->wait_for_workflows( 'dependency_ids', WaitMode::Any, 'winner' )
->dispatch( [ 'dependency_ids' => [ 12, 18, 22 ] ] );
시작된 워크플로 그룹 기다리기
이전 start_workflows() 또는 start_agents() 단계에서 영구 그룹 키를 저장했다면, 공개 상태를 통해 워크플로 ID를 직접 전달하는 대신 해당 그룹을 바로 기다릴 수 있습니다.
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();
대기 중 동작
워크플로가 이러한 단계 중 하나에 도달하면 상태가 waiting_for_workflows로 바뀝니다. 대기 중에는 어떤 작업자도 해당 워크플로에 연결되어 있지 않습니다.
$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']
대기 단계에 도달하기 전에 종속성이 이미 완료되었다면 워크플로는 즉시 계속 진행합니다.
실패 처리 방식
워크플로 종속성 대기는 성공을 기준으로 작동합니다.
wait_for_workflow()및WaitMode::All은 필수 종속성 중 하나라도 실패하거나 취소되면 실패합니다.WaitMode::Any는 모든 종속성이 종료 상태에 도달했고 성공적으로 완료된 종속성이 하나도 없을 때만 실패합니다.WaitMode::Quorum은 남은 활성 워크플로만으로 필요한 정족수를 더 이상 충족할 수 없을 때 실패합니다.
따라서 워크플로 대기는 플래너/실행기 시스템에 유용합니다. 한 워크플로가 작업을 분배하고 다른 워크플로가 all 결과나 먼저 완료되는 첫 번째 성공 분기를 기다릴 수 있습니다.