
# Töövoo kaitsepiirded

Agendipõhised töövood on paindlikud, kuid nendega on ka lihtsam luua duplikaatkäivitusi või lasta planeerijal genereerida kavandatust rohkem tööd. Queuety pakub töövootasemel lihtsaid kaitsepiirdeid, mis aitavad paindlikkust säilitada ja samal ajal kontrolli all hoida.

Töötajate lubamise ja tööpõhise kulu metaandmete üldisema ressursimudeli kohta vaadake [Ressursside haldamine](https://queuety.inline0.dev/et/docs/features/resource-management).

## Töövoo definitsiooni versioonimine

Kasutage `version()`, et lisada töövoo definitsioonile rakenduse tasemel versioonisilt:

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

Versioon salvestatakse koos töövoo olekuga, see on nähtav `workflow_status()` kaudu, trükitakse käsuga `wp queuety workflow status` ja lisatakse töövoo ekspordi hulka.

Queuety salvestab iga töövoo käivituse kohta ka deterministliku `definition_hash`. Räsi tuletatakse serialiseeritud töövoo definitsioonist; sellest on abi, kui peate pärast juurutamist täpselt tuvastama, millist töövoo kuju pooleliolev käivitus täidab.

## Muutke käivitamine korduskindlaks

Kasutage `idempotency_key()`, kui kutsujad võivad sama päringut korrata:

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

Kui töövoog käivitatakse uuesti juba kasutatud võtmega, tagastab Queuety algse töövoo ID, selle asemel et luua duplikaatkäivitus. Võtmed on kõigi töövoonimede puhul globaalsed, seega lisage võtmesse töövoo nimi, kui eri töövood võivad sama võtit kasutada.

See on eriti kasulik järgmistes olukordades:

- API lõpp-punktid, mida kliendid või lüüsid võivad uuesti pärida
- veebihaagi tarbijad, kes võivad saada korduvaid edastusi
- planeerimissammud, mis peaksid looma iga välise üksuse kohta ainult ühe orkestreerimiskäivituse

Korduskindluse võtmed salvestatakse tabelisse `queuety_workflow_dispatch_keys`.

## Töövoo eelarvete seadmine

Kasutage töövoo eelarveid käivituste nurjamiseks, kui need ületavad kavandatud piiri:

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

Piirab, mitu töövoo sammu võib enne käivituse nurjumist lõpetada. Sellest on abi töövoogude puhul, mis hargnevad dünaamiliselt või võivad sama piirkonda `_next_step` kaudu uuesti läbida.

### `max_for_each_items()`

Piirab, mitu käitusajal tuvastatud üksust võib üks `for_each()` samm laiendada. Sellest on abi planeerija ja täitja süsteemides, kus agent võib avastada kavandatust palju rohkem harutöid.

### `max_state_bytes()`

Piirab avaliku töövoo oleku kodeeritud suurust. See aitab vältida pikaajaliste töövoogude kasvamist suurteks andmehulkadeks, mida on aeglane uurida, eksportida või uuesti proovida.

### `max_cost_units()`

Piirab lõpetatud sammude tarbitud kuluühikute koguarvu. Kuluühikud pärinevad sammu või töö metaandmetest, mille Queuety töö käivitamisel määrab. Tavalise kasutajatöö vaikeväärtus on `1`, orkestreerimise kohatäited, näiteks viivitused ja ootamised, kasutavad väärtust `0` ning käitlejad saavad määrata suurema positiivse väärtuse atribuudi `config()` või töö omaduste kaudu. Väärtuse `0` saab määrata ainult sammu definitsioonis oleva `cost_units`.

Sellest on abi, kui töövoog võib sama piirkonda uuesti läbida või laiendada igaühe jaoks tööks, mille kulu ei kajastu ainult sammude arvus. Planeerija, mis käivitab kallist mudelikutset korduvalt, võib jääda `max_transitions()` piiresse, kuid siiski ületada kavandatud kulupiiri.

### `max_started_workflows()`

Piirab, mitu tipptaseme töövoogu võib käivitus alustada käsuga `start_workflows()` või `start_agents()`. Piiri kontrollitakse enne alamvoogude käivitamist, seega vanemtöövoog nurjub, loomata osaliselt rühma, mis eelarvet juba ületab.

Eelarve ületamisel nurjab Queuety töövoo kohe, selle asemel et sammu uuesti proovida. Üks erand: kui `Queuety::signal()` lõpetab ootamise ja sellest tulenev üleminek ületab eelarvet, visatakse erand käsu `signal()` kutsujale, signaali lisamine tühistatakse ja töövoog jääb ootama.

## Kaitsepiirete jälgimine

Töövoo olek näitab järgmist:

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

`budget` koormus sisaldab seadistatud piiranguid ja praegust kasutust, sealhulgas avaliku oleku suurust baitides.

Näide:

```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, ... ]
```
