Εξαρτήσεις ροών εργασίας
Χρησιμοποιήστε αναμονές εξαρτήσεων ροών εργασίας όταν μια ροή εργασίας ανώτατου επιπέδου πρέπει να συνεχιστεί μόνο αφού ολοκληρωθούν άλλες ροές εργασίας. Έτσι συντονίζετε διαφορετικές ροές εργασίας χωρίς να χρειάζεται να τα εντάξετε όλα σε έναν τεράστιο ορισμό ροής εργασίας.
Αυτές οι αναμονές συνδυάζονται ιδιαίτερα καλά με τις Ασύγχρονες παραδόσεις, όπου μια ροή εργασίας ξεκινά πρώτα ανεξάρτητες θυγατρικές ροές και έπειτα περιμένει να ολοκληρωθούν.
Για πιο ολοκληρωμένα παραδείγματα σχεδιαστή/εκτελεστή, δείτε τον Ενορχηστρωτή παραγόντων.
Το Queuety παρέχει τρεις μεθόδους δημιουργίας:
wait_for_workflow()για μία ροή εργασίαςwait_for_workflows()για πολλές ροές εργασίας με σημασιολογίαall,anyήquorumwait_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, οι αναμονές πολλών ροών εργασίας αποθηκεύουν την κατάσταση των ολοκληρωμένων εξαρτήσεων με κλειδί το αναγνωριστικό της ροής εργασίας:
[
'42' => [ 'summary' => '...' ],
'43' => [ 'summary' => '...' ],
]
Χωρίς result_key, η κατάσταση των ολοκληρωμένων εξαρτήσεων συγχωνεύεται με την κατάσταση ανώτατου επιπέδου της ροής εργασίας που περιμένει, με τη σειρά των εξαρτήσεων.
Επίλυση αναγνωριστικών εξαρτήσεων από την κατάσταση ροής εργασίας
Μπορείτε να αναβάλετε τον καθορισμό της λίστας εξαρτήσεων μέχρι την εκτέλεση, διαβάζοντας τα αναγνωριστικά ροών εργασίας από τη δημόσια κατάσταση:
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() αποθήκευσε ένα διατηρήσιμο κλειδί ομάδας, μπορείτε να περιμένετε απευθείας για αυτή την ομάδα αντί να μεταφέρετε μόνοι σας τα αναγνωριστικά ροών εργασίας μέσω της δημόσιας κατάστασης.
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 ή τον πρώτο επιτυχή κλάδο που ολοκληρώνεται.