본문으로 건너뛰기

워크플로 종속성

최상위 워크플로가 다른 워크플로의 완료 후에만 계속되어야 할 때 워크플로 종속성 대기를 사용하세요. 모든 작업을 하나의 거대한 워크플로 정의에 넣지 않고도 워크플로 간 조정을 구현할 수 있습니다.

이 대기 기능은 Async Handoffs와 함께 사용하면 특히 유용합니다. 한 워크플로가 먼저 독립적인 하위 워크플로를 시작한 다음 나중에 완료를 기다릴 수 있습니다.

더 자세한 플래너/실행기 예시는 Agent Orchestration을 참조하세요.

Queuety은 세 가지 빌더 메서드를 제공합니다.

  • 워크플로 하나에는 wait_for_workflow()
  • 여러 워크플로에는 wait_for_workflows()을 사용하며, all, any 또는 quorum 의미를 지정합니다.
  • 워크플로 ID가 이전에 시작한 그룹에서 온 경우에는 wait_for_workflow_group()

워크플로 하나 기다리기

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

research_run이 완료되면 editorial_run이 다시 진행됩니다. result_key을 설정하면 완료된 종속성의 상태가 해당 키 아래에 저장됩니다.

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

result_key이 없으면 종속 워크플로의 공개 상태가 대기 중인 워크플로의 최상위 상태에 병합됩니다.

여러 워크플로 기다리기

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은 나열된 모든 워크플로가 완료된 경우에만 다시 진행합니다.
  • WaitMode::Any은 나열된 워크플로 중 첫 번째가 완료되면 다시 진행합니다.
  • WaitMode::Quorum은 필요한 수의 워크플로가 성공적으로 완료되면 다시 진행합니다.
PHP
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를 키로 하여 저장됩니다.

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

result_key이 없으면 완료된 종속성 상태가 종속성 순서에 따라 대기 중인 워크플로의 최상위 상태에 병합됩니다.

워크플로 상태에서 종속성 ID 확인

공개 상태에서 워크플로 ID를 읽어 런타임까지 종속성 목록 결정을 미룰 수 있습니다.

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

여러 종속성의 경우:

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

시작된 워크플로 그룹 기다리기

이전 start_workflows() 또는 start_agents() 단계에서 영구 그룹 키를 저장했다면, 공개 상태를 통해 워크플로 ID를 직접 전달하는 대신 해당 그룹을 바로 기다릴 수 있습니다.

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

대기 중 동작

워크플로가 이러한 단계 중 하나에 도달하면 상태가 waiting_for_workflows로 바뀝니다. 대기 중에는 어떤 작업자도 해당 워크플로에 연결되어 있지 않습니다.

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

대기 단계에 도달하기 전에 종속성이 이미 완료되었다면 워크플로는 즉시 계속 진행합니다.

실패 처리 방식

워크플로 종속성 대기는 성공을 기준으로 작동합니다.

  • wait_for_workflow() 및 WaitMode::All은 필수 종속성 중 하나라도 실패하거나 취소되면 실패합니다.
  • WaitMode::Any는 모든 종속성이 종료 상태에 도달했고 성공적으로 완료된 종속성이 하나도 없을 때만 실패합니다.
  • WaitMode::Quorum은 남은 활성 워크플로만으로 필요한 정족수를 더 이상 충족할 수 없을 때 실패합니다.

따라서 워크플로 대기는 플래너/실행기 시스템에 유용합니다. 한 워크플로가 작업을 분배하고 다른 워크플로가 all 결과나 먼저 완료되는 첫 번째 성공 분기를 기다릴 수 있습니다.