
# Munkafolyamat-korlátok

Az ügynökszerű munkafolyamatok rugalmasak, de könnyebb velük duplikált futásokat létrehozni, vagy hagyni, hogy egy tervező a szándékoltnál több munkát állítson elő. A Queuety könnyű súlyú korlátokat biztosít munkafolyamat-szinten, így a rugalmasság megőrzése mellett is kézben tarthatja a folyamatot.

A dolgozók felvételét és a feladatonkénti költségmetaadatokat érintő tágabb erőforrásmodellről a [Erőforrás-kezelés](https://queuety.inline0.dev/hu/docs/features/resource-management) oldalon olvashat.

## Munkafolyamat-definíció verziózása

A `version()` segítségével alkalmazásszintű verziócímkét rendelhet egy munkafolyamat-definícióhoz:

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

A verzió a munkafolyamat állapotával együtt tárolódik, a `workflow_status()` segítségével érhető el, a `wp queuety workflow status` megjeleníti, és a munkafolyamat-exportok is tartalmazzák.

A Queuety minden munkafolyamat-futáshoz determinisztikus `definition_hash` értéket is tárol. A hash a szerializált munkafolyamat-definícióból származik, és segít pontosan azonosítani, hogy egy telepítés után melyik munkafolyamat-formát hajtja végre a folyamatban lévő futás.

## Indítás idempotenssé tétele

Használja a `idempotency_key()` elemet, ha a hívók újrapróbálhatják ugyanazt a kérést:

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

Ha egy munkafolyamatot olyan kulccsal indítanak újra, amelyet már használtak, a Queuety az eredeti munkafolyamat-azonosítót adja vissza új futás létrehozása helyett. A kulcsok minden munkafolyamatnév között globálisak, ezért vegye bele a munkafolyamat nevét is, ha különböző munkafolyamatoknál előfordulhat ugyanaz a kulcs.

Ez különösen hasznos a következőknél:

- API végpontok, amelyeket az ügyfelek vagy átjárók újrapróbálhatnak
- webhook-fogyasztók, amelyek duplikált kézbesítéseket kaphatnak
- tervezőlépések, amelyek külső entitásonként csak egy vezénylési futást hozhatnak létre

Az idempotenciakulcsok a `queuety_workflow_dispatch_keys` táblában tárolódnak.

## Munkafolyamat-keretek beállítása

A tervezett keret túllépése esetén a futás meghiúsításához használjon munkafolyamat-kereteket:

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

Korlátozza, hány munkafolyamat-lépés fejeződhet be a futás meghiúsulása előtt. Ez hasznos olyan munkafolyamatok védelmére, amelyek dinamikusan ágaznak el, vagy a `_next_step` segítségével ugyanazt a részt újra elérhetik.

### `max_for_each_items()`

Korlátozza, hogy egyetlen `for_each()` lépés hány futásidőben felderített elemet bonthasson ki. Ez hasznos tervező/végrehajtó rendszereknél, ahol egy ügynök a szándékoltnál sokkal több ágmunkát deríthet fel.

### `max_state_bytes()`

Korlátozza a nyilvános munkafolyamat-állapot kódolt méretét. Ez segít megakadályozni, hogy a hosszan futó munkafolyamatok nagy, nehezen vizsgálható, exportálható vagy újrapróbálható adatcsomagokká nőjenek.

### `max_cost_units()`

Korlátozza a befejezett lépések által felhasznált költségegységek összegét. A költségegységeket a lépés- vagy feladat-metaadat adja, amelyet a Queuety old fel a munka sorba állításakor. A szokásos felhasználói munka alapértéke `1`, a vezénylési helyőrzők, például a késleltetések és várakozások értéke `0`, a kezelők pedig a `config()` vagy a feladat tulajdonságai révén magasabb pozitív értéket állíthatnak be. Csak egy lépésdefiníció `cost_units` eleme állíthat be `0` értéket.

Ez akkor hasznos, ha egy munkafolyamat ugyanazt a részt újra elérheti, vagy a for-each olyan költséges munkát végez, amelyet önmagában a lépésszám nem tükröz. Egy tervező, amely újra és újra egy költséges modellhívást indít, a `max_transitions()` kereten belül maradhat, miközben mégis túllépi a tervezett költségkeretet.

### `max_started_workflows()`

Korlátozza, hogy egy futás hány legfelső szintű munkafolyamatot indíthat a `start_workflows()` vagy a `start_agents()` segítségével. A korlátot az alárendelt munkafolyamatok indítása előtt ellenőrzi, így a szülő meghiúsul anélkül, hogy részben létrehozna egy keretet túllépő csoportot.

Ha túllépik a költségkeretet, a Queuety azonnal meghiúsítja a munkafolyamatot, ahelyett hogy újrapróbálná a lépést. Egy kivétel van: ha a `Queuety::signal()` lezár egy várakozást, és az eredményül kapott átmenet túllépi a költségkeretet, a kivétel a `signal()` hívójához kerül, a jel beszúrása visszagörgetésre kerül, a munkafolyamat pedig tovább vár.

## A korlátok megfigyelése

A munkafolyamat állapota a következőket teszi elérhetővé:

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

A `budget` adatcsomagja tartalmazza a beállított korlátokat és az aktuális használatot, beleértve a nyilvános állapot aktuális méretét bájtban.

Példa:

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