İçeriğe geç

İş Akışı Bağımlılıkları

Üst düzey bir iş akışının yalnızca diğer iş akışları tamamlandıktan sonra devam etmesi gerektiğinde, iş akışı bağımlılığı beklemelerini kullanın. Böylece her şeyi tek bir dev iş akışı tanımına sıkıştırmadan iş akışları arasında eşgüdüm sağlayabilirsiniz.

Bu beklemeler özellikle Eşzamansız Devretmeler ile iyi çalışır; bu düzende bir iş akışı önce bağımsız alt iş akışlarını başlatır, ardından onları bekler.

Daha kapsamlı planlayıcı/yürütücü örnekleri için bkz. Aracı Düzenleme.

Queuety üç oluşturucu yöntemi sunar:

  • wait_for_workflow() tek bir iş akışı için
  • wait_for_workflows(), all, any veya quorum anlamlarıyla birden çok iş akışı için
  • İş akışı kimlikleri daha önce başlatılmış bir gruptan geldiğinde wait_for_workflow_group()

Tek bir iş akışını bekleme

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 tamamlandığında editorial_run devam eder. result_key ayarlanmışsa tamamlanan bağımlılığın durumu bu anahtar altında saklanır:

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

result_key olmadan, bağımlı iş akışının genel durumu bekleyen iş akışının üst düzey durumuyla birleştirilir.

Birden çok iş akışını bekleme

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 yalnızca listelenen tüm iş akışları tamamlandığında devam eder.
  • WaitMode::Any listelenen ilk iş akışı tamamlandığında devam eder.
  • WaitMode::Quorum gerekli sayıda iş akışı başarıyla tamamlandığında devam eder.
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 ile birden çok iş akışını beklerken tamamlanan bağımlılıkların durumu, iş akışı kimliğine göre anahtarlanarak saklanır:

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

result_key olmadan, tamamlanan bağımlılıkların durumu bağımlılık sırasına göre bekleyen iş akışının üst düzey durumuyla birleştirilir.

Bağımlılık kimliklerini iş akışı durumundan çözümleme

Bağımlılık listesini çalışma zamanına kadar erteleyip iş akışı kimliklerini genel durumdan okuyabilirsiniz:

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

Birden çok bağımlılık için:

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

Başlatılmış bir iş akışı grubunu bekleme

Önceki bir start_workflows() veya start_agents() adımı kalıcı bir grup anahtarı sakladıysa, iş akışı kimliklerini genel durum üzerinden kendiniz taşımak yerine doğrudan bu grubu bekleyebilirsiniz.

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

Bekleme sırasında ne olur

Bir iş akışı bu adımlardan birine ulaştığında durumu waiting_for_workflows olur. Beklediği sırada hiçbir çalışan ona bağlı kalmaz.

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

Bir bağımlılık, bekleme adımına ulaşılmadan önce tamamlanmışsa iş akışı hemen devam eder.

Hata semantiği

İş akışı bağımlılığı beklemeleri başarı odaklıdır:

  • wait_for_workflow() ve WaitMode::All, gerekli bağımlılıklardan herhangi biri başarısız olur veya iptal edilirse başarısız olur.
  • WaitMode::Any yalnızca her bağımlılık terminal duruma ulaştığında ve hiçbiri başarıyla tamamlanmadığında başarısız olur.
  • WaitMode::Quorum, etkin kalan iş akışları gerekli yeter sayıyı artık karşılayamayacak durumdaysa başarısız olur.

Bu sayede iş akışı beklemeleri, bir iş akışının her bir iş için görev dağıtabildiği ve diğerinin all sonuçlarını ya da tamamlanan ilk başarılı dalı bekleyebildiği planlayıcı/yürütücü sistemlerinde kullanışlıdır.