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

Αντιστάθμιση ροών εργασίας

Η αντιστάθμιση σάς επιτρέπει να συνδέσετε έναν χειριστή επαναφοράς σε ένα ολοκληρωμένο βήμα ροής εργασίας. Το Queuety αποθηκεύει ένα στιγμιότυπο της δημόσιας κατάστασης όταν ολοκληρώνεται αυτό το βήμα και στη συνέχεια εκτελεί τους χειριστές αντιστάθμισης με αντίστροφη σειρά όταν η ροή εργασίας ακυρωθεί ή, προαιρετικά, όταν αποτύχει.

Η μέθοδος compensate_with()

Καλέστε το compensate_with() αμέσως μετά το βήμα που πρέπει να αναιρέσει:

PHP
use Queuety\Queuety;

Queuety::workflow( 'provision_account' )
    ->then( CreateRemoteUserStep::class )
    ->compensate_with( DeleteRemoteUserCompensation::class )
    ->then( CreateSubscriptionStep::class )
    ->compensate_with( CancelSubscriptionCompensation::class )
    ->then( SendWelcomeEmailStep::class )
    ->dispatch( [ 'user_id' => 42 ] );

Αν η ροή εργασίας ακυρωθεί αργότερα, εκτελείται το Queuety:

  1. CancelSubscriptionCompensation
  2. DeleteRemoteUserCompensation

Χειριστές αντιστάθμισης

Οι χειριστές αντιστάθμισης υλοποιούν το Contracts\Compensation:

PHP
use Queuety\Contracts\Compensation;

final class DeleteRemoteUserCompensation implements Compensation {
    public function handle( array $state ): void {
        remote_api_delete_user( $state['remote_user_id'] );
    }
}

Ο χειριστής λαμβάνει τη δημόσια κατάσταση της ροής εργασίας όπως ήταν αμέσως μετά την ολοκλήρωση του βήματος που αντισταθμίζεται. Τα δεσμευμένα εσωτερικά κλειδιά δεν περιλαμβάνονται.

Ακύρωση έναντι αποτυχίας

Σε ρητή ακύρωση, οι αντισταθμίσεις των ολοκληρωμένων βημάτων εκτελούνται πάντα πριν από τον προαιρετικό χειριστή on_cancel().

Σε περίπτωση αποτυχίας, οι αντισταθμίσεις εκτελούνται μόνο αν το επιλέξετε:

PHP
Queuety::workflow( 'provision_account' )
    ->then( CreateRemoteUserStep::class )
    ->compensate_with( DeleteRemoteUserCompensation::class )
    ->then( CreateSubscriptionStep::class )
    ->compensate_with( CancelSubscriptionCompensation::class )
    ->then( ChargeCardStep::class )
    ->compensate_on_failure()
    ->dispatch( $payload );

Χωρίς το compensate_on_failure(), μια αποτυχημένη ροή εργασίας διατηρεί ανέπαφο το ιστορικό των ολοκληρωμένων βημάτων και μπορεί να επαναληφθεί από το βήμα που απέτυχε.

Με το compensate_on_failure(), οι αντισταθμίσεις των ολοκληρωμένων βημάτων εκτελούνται αφού σημειωθεί η αποτυχία της ροής εργασίας. Έπειτα, το retry_workflow() δημιουργεί εξαίρεση επειδή η ροή εργασίας έχει ήδη υποστεί αντιστάθμιση.

Υποστηριζόμενοι τύποι βημάτων

Μπορείτε να συνδέσετε αντιστάθμιση στα εξής:

  • διαδοχικά βήματα then()
  • ομάδες parallel()
  • βήματα for_each()
  • βήματα run_workflow()
  • βήματα καθυστέρησης delay()
  • βήματα σήματος wait_for_signal()
  • βήματα εξάρτησης ροής εργασίας wait_for_workflow()

Για τα run_workflow() και for_each(), το στιγμιότυπο αντιστάθμισης καταγράφεται όταν ολοκληρωθεί πλήρως η ένθετη εργασία ή η διακλαδωμένη εργασία.

on_cancel() έναντι αντιστάθμισης

Χρησιμοποιήστε το compensate_with() για να αναιρέσετε τις παρενέργειες ολοκληρωμένων βημάτων με αντίστροφη σειρά.

Χρησιμοποιήστε το on_cancel() για έναν χειριστή εκκαθάρισης σε επίπεδο ροής εργασίας, ο οποίος πρέπει να εκτελείται κάθε φορά που η ροή ακυρώνεται ρητά.