
# Darbplūsmas aizsargmehānismi

Aģentu tipa darbplūsmas ir elastīgas, taču tajās ir arī vieglāk izveidot dublētas izpildes vai ļaut plānotājam radīt vairāk darba, nekā paredzēts. Queuety nodrošina vieglus aizsargmehānismus darbplūsmas līmenī, lai jūs varētu saglabāt šo elastību un vienlaikus nezaudēt kontroli.

Plašāku informāciju par resursu modeli, kas ietver darbinieku pieņemšanu un katra darba izmaksu metadatus, skatiet sadaļā [Resursu pārvaldība](https://queuety.inline0.dev/lv/docs/features/resource-management).

## Darbplūsmas definīcijas versiju pārvaldība

Izmantojiet `version()`, lai darbplūsmas definīcijai pievienotu lietotnes līmeņa versijas apzīmējumu:

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

Versija tiek glabāta kopā ar darbplūsmas stāvokli, ir pieejama, izmantojot `workflow_status()`, tiek izvadīta ar `wp queuety workflow status` un ir iekļauta darbplūsmas eksportos.

Queuety glabā arī deterministisku `definition_hash` katrai darbplūsmas izpildei. Jaukšana tiek veidota no serializētās darbplūsmas definīcijas un ir noderīga, ja pēc izvietošanas jānosaka, tieši kuru darbplūsmas struktūru izpilda pašlaik notiekoša izpilde.

## Nodrošiniet idempotentu izpildes nosūtīšanu

Izmantojiet `idempotency_key()`, ja izsaucēji var atkārtoti nosūtīt vienu un to pašu pieprasījumu:

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

Ja darbplūsma tiek nosūtīta izpildei atkārtoti ar jau izmantotu atslēgu, Queuety atgriež sākotnējo darbplūsmas ID, nevis izveido dublētu izpildi. Atslēgas ir kopīgas visiem darbplūsmu nosaukumiem, tāpēc iekļaujiet darbplūsmas nosaukumu atslēgā, ja dažādām darbplūsmām var būt vienāda atslēga.

Tas ir īpaši noderīgi:

- API galapunktiem, kurus klienti vai vārtejas var izsaukt atkārtoti
- tīmekļa āķu patērētājiem, kuri var saņemt dublētus paziņojumus
- plānotāja darbībām, kurām katrai ārējai entītijai jāizveido tikai viena orkestrācijas izpilde

Idempotences atslēgas tiek glabātas tabulā `queuety_workflow_dispatch_keys`.

## Iestatiet darbplūsmas budžetus

Izmantojiet darbplūsmas budžetus, lai apturētu izpildes, kas pārsniedz paredzēto apjomu:

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

Ierobežo, cik daudz darbplūsmas darbību var pabeigt pirms izpildes apturēšanas. Tas noder darbplūsmām, kurās ir dinamiski atzari vai kuras var atgriezties tajā pašā apgabalā, izmantojot `_next_step`.

### `max_for_each_items()`

Ierobežo, cik daudz izpildlaikā atklātu vienumu var izvērst viena `for_each()` darbība. Tas noder plānotāja un izpildītāja sistēmās, kurās aģents var atklāt daudz vairāk atzaru darba, nekā paredzēts.

### `max_state_bytes()`

Ierobežo publiskā darbplūsmas stāvokļa kodēto izmēru. Tas neļauj ilgstoši darbojošām darbplūsmām izaugt līdz lieliem datu blokiem, kurus ir lēni pārbaudīt, eksportēt vai izpildīt atkārtoti.

### `max_cost_units()`

Ierobežo pabeigtajās darbībās patērēto kopējo izmaksu vienību skaitu. Izmaksu vienības tiek iegūtas no darbības vai darba metadatiem, ko Queuety nosaka, ievietojot darbu rindā. Parastam lietotāja darbam pēc noklusējuma tiek izmantota vērtība `1`, orkestrācijas vietturiem, piemēram, aizkavēm un gaidīšanai, tiek izmantota vērtība `0`, bet apstrādātāji var iestatīt lielāku pozitīvu vērtību, izmantojot `config()` vai darba rekvizītus. Tikai darbības definīcijas `cost_units` var iestatīt vērtību `0`.

Tas noder, ja darbplūsma var atgriezties tajā pašā apgabalā vai for-each darbībā tiek veikts darbs, kura izmaksas nevar noteikt tikai pēc darbību skaita. Plānotājs, kas atkārtoti izsauc dārgu modeļa darbību, var nepārsniegt `max_transitions()`, bet tomēr iztērēt vairāk, nekā paredzēts.

### `max_started_workflows()`

Ierobežo, cik darbplūsmu augšējā līmenī izpilde var sākt, izmantojot `start_workflows()` vai `start_agents()`. Ierobežojums tiek pārbaudīts pirms pakārtoto darbplūsmu nosūtīšanas izpildei, tāpēc vecākdarbplūsma neizdodas, neizveidojot daļēji grupu, kas jau pārsniedz budžetu.

Kad budžets tiek pārsniegts, Queuety nekavējoties pārtrauc darbplūsmu, nevis atkārtoti mēģina izpildīt darbību. Izņēmums: ja `Queuety::signal()` pabeidz gaidīšanu un tās rezultātā notiek pāreja, kas pārsniedz budžetu, izņēmums tiek nodots `signal()` izsaucējam, signāla ievietošana tiek atsaukta, un darbplūsma turpina gaidīt.

## Aizsargmehānismu pārraudzība

Darbplūsmas statusā ir pieejama šāda informācija:

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

`budget` datos ir ietverti konfigurētie ierobežojumi un pašreizējais lietojums, tostarp pašreizējais publiskā stāvokļa izmērs baitos.

Piemērs:

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