Dependensi Alur Kerja
Gunakan penantian dependensi alur kerja saat satu alur kerja tingkat atas hanya boleh berlanjut setelah alur kerja lain selesai. Ini memungkinkan koordinasi lintas alur kerja tanpa memaksakan semuanya ke dalam satu definisi alur kerja yang sangat besar.
Penantian ini sangat cocok dipadukan dengan Serah Terima Asinkron, saat satu alur kerja terlebih dahulu memulai alur kerja anak yang independen, lalu menunggunya kemudian.
Untuk contoh planner/executor yang lebih lengkap, lihat Orkestrasi Agen.
Queuety menyediakan tiga metode pembuat:
wait_for_workflow()untuk satu alur kerjawait_for_workflows()untuk beberapa alur kerja dengan semantikall,any, atauquorumwait_for_workflow_group()saat ID alur kerja berasal dari grup yang dimulai sebelumnya
Menunggu satu alur kerja
$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();
Saat research_run selesai, editorial_run dilanjutkan. Jika result_key ditetapkan, status dependensi yang selesai disimpan di bawah kunci tersebut:
$state['research']; // public state from the completed research workflow
Tanpa result_key, status publik alur kerja dependensi digabungkan ke status tingkat atas alur kerja yang menunggu.
Menunggu beberapa alur kerja
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::Allhanya dilanjutkan setelah semua alur kerja yang tercantum selesai.WaitMode::Anydilanjutkan saat alur kerja pertama yang tercantum selesai.WaitMode::Quorumdilanjutkan setelah sejumlah alur kerja yang diwajibkan berhasil diselesaikan.
Queuety::workflow( 'synthesis_run' )
->wait_for_workflows(
[ $research_id, $editorial_id, $legal_id ],
WaitMode::Quorum,
'dependencies',
quorum: 2,
)
->then( PublishPacketStep::class )
->dispatch();
Dengan result_key, penantian beberapa alur kerja menyimpan status dependensi yang telah selesai berdasarkan ID alur kerja:
[
'42' => [ 'summary' => '...' ],
'43' => [ 'summary' => '...' ],
]
Tanpa result_key, status dependensi yang selesai digabungkan ke status tingkat atas alur kerja yang menunggu sesuai urutan dependensi.
Menentukan ID dependensi dari status alur kerja
Anda dapat menunda penetapan daftar dependensi hingga waktu berjalan dengan membaca ID alur kerja dari status publik:
Queuety::workflow( 'agent_follow_up' )
->wait_for_workflow( 'parent_workflow_id', 'parent' )
->then( FinalizeAgentRunStep::class )
->dispatch( [ 'parent_workflow_id' => $workflow_id ] );
Untuk beberapa dependensi:
Queuety::workflow( 'aggregator' )
->wait_for_workflows( 'dependency_ids', WaitMode::Any, 'winner' )
->dispatch( [ 'dependency_ids' => [ 12, 18, 22 ] ] );
Menunggu grup alur kerja yang telah dimulai
Jika langkah start_workflows() atau start_agents() sebelumnya menyimpan kunci grup persisten, Anda dapat langsung menunggu grup tersebut alih-alih mengalirkan ID alur kerja melalui status publik sendiri.
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();
Yang terjadi selama menunggu
Saat alur kerja mencapai salah satu langkah ini, statusnya berubah menjadi waiting_for_workflows. Tidak ada worker yang tetap terhubung selama alur kerja menunggu.
$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']
Jika suatu dependensi sudah selesai sebelum langkah penantian tercapai, alur kerja langsung berlanjut.
Semantik kegagalan
Penantian dependensi alur kerja berorientasi pada keberhasilan:
wait_for_workflow()danWaitMode::Allgagal jika dependensi wajib mana pun gagal atau dibatalkan.WaitMode::Anygagal hanya jika semua dependensi mencapai status terminal dan tidak ada yang berhasil diselesaikan.WaitMode::Quorumgagal jika alur kerja aktif yang tersisa tidak lagi dapat memenuhi kuorum yang diwajibkan.
Ini membuat penantian alur kerja berguna untuk sistem planner/executor, ketika satu alur kerja dapat menghasilkan pekerjaan untuk alur kerja lain, lalu menunggu hasil all atau cabang pertama yang berhasil selesai.