Μετάβαση στο περιεχόμενο

Εξαρτήσεις ροών εργασίας

Χρησιμοποιήστε αναμονές εξαρτήσεων ροών εργασίας όταν μια ροή εργασίας ανώτατου επιπέδου πρέπει να συνεχιστεί μόνο αφού ολοκληρωθούν άλλες ροές εργασίας. Έτσι συντονίζετε διαφορετικές ροές εργασίας χωρίς να χρειάζεται να τα εντάξετε όλα σε έναν τεράστιο ορισμό ροής εργασίας.

Αυτές οι αναμονές συνδυάζονται ιδιαίτερα καλά με τις Ασύγχρονες παραδόσεις, όπου μια ροή εργασίας ξεκινά πρώτα ανεξάρτητες θυγατρικές ροές και έπειτα περιμένει να ολοκληρωθούν.

Για πιο ολοκληρωμένα παραδείγματα σχεδιαστή/εκτελεστή, δείτε τον Ενορχηστρωτή παραγόντων.

Το Queuety παρέχει τρεις μεθόδους δημιουργίας:

  • wait_for_workflow() για μία ροή εργασίας
  • wait_for_workflows() για πολλές ροές εργασίας με σημασιολογία all, any ή quorum
  • 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, οι αναμονές πολλών ροών εργασίας αποθηκεύουν την κατάσταση των ολοκληρωμένων εξαρτήσεων με κλειδί το αναγνωριστικό της ροής εργασίας:

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

Χωρίς result_key, η κατάσταση των ολοκληρωμένων εξαρτήσεων συγχωνεύεται με την κατάσταση ανώτατου επιπέδου της ροής εργασίας που περιμένει, με τη σειρά των εξαρτήσεων.

Επίλυση αναγνωριστικών εξαρτήσεων από την κατάσταση ροής εργασίας

Μπορείτε να αναβάλετε τον καθορισμό της λίστας εξαρτήσεων μέχρι την εκτέλεση, διαβάζοντας τα αναγνωριστικά ροών εργασίας από τη δημόσια κατάσταση:

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() αποθήκευσε ένα διατηρήσιμο κλειδί ομάδας, μπορείτε να περιμένετε απευθείας για αυτή την ομάδα αντί να μεταφέρετε μόνοι σας τα αναγνωριστικά ροών εργασίας μέσω της δημόσιας κατάστασης.

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 ή τον πρώτο επιτυχή κλάδο που ολοκληρώνεται.