
# Δικλείδες ασφαλείας ροών εργασίας

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

Για το ευρύτερο μοντέλο πόρων σχετικά με την αποδοχή εργαζομένων και τα μεταδεδομένα κόστους ανά εργασία, δείτε τη [Διαχείριση πόρων](https://queuety.inline0.dev/el/docs/features/resource-management).

## Ορισμός έκδοσης για μια ροή εργασίας

Χρησιμοποιήστε το `version()` για να προσθέσετε μια ετικέτα έκδοσης σε επίπεδο εφαρμογής σε έναν ορισμό ροής εργασίας:

```php
Queuety::workflow( 'research_run' )
    ->version( 'research.v2' )
    ->then( PlanResearchStep::class )
    ->then( DraftResearchSummaryStep::class )
    ->dispatch();
```

Η έκδοση αποθηκεύεται μαζί με την κατάσταση της ροής εργασίας, είναι διαθέσιμη μέσω του `workflow_status()`, εκτυπώνεται από το `wp queuety workflow status` και περιλαμβάνεται στις εξαγωγές ροών εργασίας.

Το Queuety αποθηκεύει επίσης ένα ντετερμινιστικό `definition_hash` για κάθε εκτέλεση ροής εργασίας. Το hash προκύπτει από τον σειριοποιημένο ορισμό της ροής εργασίας και είναι χρήσιμο όταν χρειάζεται να προσδιορίσετε ακριβώς ποια μορφή ροής εργασίας εκτελεί μια ενεργή εκτέλεση μετά από ανάπτυξη.

## Κάντε την αποστολή idempotent

Χρησιμοποιήστε το `idempotency_key()` όταν οι καλούντες μπορεί να επαναλάβουν το ίδιο αίτημα:

```php
Queuety::workflow( 'research_run' )
    ->idempotency_key( 'brief:42:research' )
    ->then( PlanResearchStep::class )
    ->dispatch( [ 'brief_id' => 42 ] );
```

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

Αυτό είναι ιδιαίτερα χρήσιμο για:

- τελικά σημεία API που ενδέχεται να επαναληφθούν από πελάτες ή πύλες
- καταναλωτές webhook που μπορεί να λάβουν διπλές παραδόσεις
- βήματα σχεδιασμού που πρέπει να δημιουργούν μόνο μία εκτέλεση ενορχήστρωσης ανά εξωτερική οντότητα

Τα κλειδιά idempotency αποθηκεύονται στον πίνακα `queuety_workflow_dispatch_keys`.

## Ορισμός προϋπολογισμών ροής εργασίας

Χρησιμοποιήστε προϋπολογισμούς ροής εργασίας για να αποτυγχάνουν οι εκτελέσεις που υπερβαίνουν τα προγραμματισμένα όρια:

```php
Queuety::workflow( 'research_run' )
    ->max_transitions( 20 )
    ->max_for_each_items( 12 )
    ->max_state_bytes( 32768 )
    ->max_cost_units( 40 )
    ->max_started_workflows( 8 )
    ->then( PlanResearchStep::class )
    ->for_each( 'tasks', ExecuteResearchTask::class, 'results' )
    ->dispatch();
```

### `max_transitions()`

Περιορίζει πόσα βήματα ροής εργασίας μπορούν να ολοκληρωθούν πριν αποτύχει η εκτέλεση. Είναι χρήσιμο για την προστασία ροών εργασίας που διακλαδώνονται δυναμικά ή μπορεί να επιστρέψουν στην ίδια περιοχή μέσω του `_next_step`.

### `max_for_each_items()`

Περιορίζει πόσα στοιχεία που εντοπίζονται κατά την εκτέλεση μπορεί να επεκτείνει ένα βήμα `for_each()`. Είναι χρήσιμο για συστήματα σχεδιασμού/εκτέλεσης, όπου ένας agent μπορεί να εντοπίσει πολύ περισσότερες εργασίες διακλάδωσης από όσες προβλέπονται.

### `max_state_bytes()`

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

### `max_cost_units()`

Περιορίζει τις συνολικές μονάδες κόστους που καταναλώνονται από τα ολοκληρωμένα βήματα. Οι μονάδες κόστους προέρχονται από τα μεταδεδομένα του βήματος ή της εργασίας που επιλύει το Queuety κατά την τοποθέτηση εργασιών στην ουρά. Η συνήθης εργασία χρήστη έχει προεπιλεγμένη τιμή `1`, τα σύμβολα κράτησης θέσης ενορχήστρωσης, όπως οι καθυστερήσεις και οι αναμονές, χρησιμοποιούν `0`, ενώ οι χειριστές μπορούν να ορίσουν υψηλότερη θετική τιμή μέσω του `config()` ή των ιδιοτήτων εργασίας. Μόνο το `cost_units` ενός ορισμού βήματος μπορεί να ορίσει τιμή `0`.

Αυτό είναι χρήσιμο όταν μια ροή εργασίας μπορεί να επιστρέψει στην ίδια περιοχή ή να μετατρέψει κάθε στοιχείο σε εργασία που είναι δαπανηρή με τρόπους που δεν αποτυπώνονται μόνο από τον αριθμό των βημάτων. Ένας σχεδιαστής που επαναλαμβάνει συνεχώς μια δαπανηρή κλήση μοντέλου μπορεί να παραμένει εντός του `max_transitions()` αλλά να υπερβαίνει το προβλεπόμενο όριο κόστους.

### `max_started_workflows()`

Περιορίζει πόσες ροές εργασίας ανώτατου επιπέδου μπορεί να ξεκινήσει μια εκτέλεση μέσω του `start_workflows()` ή του `start_agents()`. Το όριο ελέγχεται πριν από την αποστολή των θυγατρικών ροών εργασίας, ώστε η γονική να αποτυγχάνει χωρίς να δημιουργήσει εν μέρει μια ομάδα που ήδη υπερβαίνει τον προϋπολογισμό.

Όταν ξεπεραστεί ένας προϋπολογισμός, το Queuety αποτυγχάνει αμέσως τη ροή εργασίας αντί να επαναλάβει το βήμα. Μία εξαίρεση: όταν το `Queuety::signal()` ολοκληρώνει μια αναμονή και η επακόλουθη μετάβαση υπερβαίνει έναν προϋπολογισμό, η εξαίρεση μεταδίδεται στον καλούντα του `signal()`, η εισαγωγή του σήματος αναιρείται και η ροή εργασίας συνεχίζει να περιμένει.

## Παρακολούθηση δικλείδων ασφαλείας

Η κατάσταση της ροής εργασίας εμφανίζει:

- `definition_version`
- `definition_hash`
- `idempotency_key`
- `budget`

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

Παράδειγμα:

```php
$state = Queuety::workflow_status( $workflow_id );

$state->definition_version; // 'research.v2'
$state->definition_hash;    // '4c7a...'
$state->idempotency_key;    // 'brief:42:research'
$state->budget;             // [ 'max_transitions' => 20, ... ]
```
