
# Töötlejad

Töötlejad on pikalt töötavad protsessid, mis küsitlevad andmebaasi ootel tööde leidmiseks, käivitavad need ja viivad töövooge edasi. Käsk `wp queuety work` käivitub WP-CLI sees, samal ajal kui järjekord võetakse otse MySQL kaudu, kasutades parimat saadaolevat Queuety DB-draiverit.

Plugin installib ka vaikimisi kord minutis käivituva WordPress cron varuvariandi keskkondade jaoks, kus puudub shelli juurdepääs. See leht käsitleb spetsiaalseid WP-CLI töötlejaid, mis on soovitatav suurema läbilaskevõimega juurutusviis.

## Töötleja käivitamine

```bash
wp queuety work
```

See käivitab ühe töötleja järjekorras `default`. See töötab tsüklis: võtab töö, käivitab selle ja kordab. Kui järjekord on tühi, ootab see enne järgmist küsitlust `QUEUETY_WORKER_SLEEP` sekundit (vaikimisi: 1).

### Suvandid

| Suvand | Kirjeldus |
|---|---|
| `--queue=<queue>` | Töödeldavad Queue(s), prioriteedi määramiseks komadega eraldatult (vaikimisi: `default`) |
| `--once` | Töötle kuni üks töö ja välju |
| `--workers=<n>` | Hargi N töötlejaprotsessi (vajab laiendusi `pcntl` ja `posix`) |
| `--min-workers=<n>` | Kohanduva kogumi minimaalne töötlejate arv. Vajab `--max-workers` |
| `--max-workers=<n>` | Kohanduva kogumi maksimaalne töötlejate arv |

```bash
# Process a specific queue
wp queuety work --queue=emails

# Process at most one job and exit
wp queuety work --once

# Run 4 concurrent workers
wp queuety work --workers=4

# Scale between 2 and 6 workers as backlog changes
wp queuety work --queue=providers --min-workers=2 --max-workers=6
```

## Mitme järjekorra prioriteedid

Üks töötleja saab töödelda mitut järjekorda prioriteetsuse järjekorras. Edastage suvandile `--queue` komadega eraldatud järjekorranimede loend:

```bash
wp queuety work --queue=critical,default,low
```

Töötleja proovib tööd võtta igast järjekorrast loetletud järjekorras. Kõigepealt kontrollib see `critical`. Kui `critical` sisaldab tööd, töötleb see selle. Kui `critical` on tühi, liigub see edasi järjekorda `default` ja seejärel järjekorda `low`. Nii saavad kõrgema prioriteediga järjekorrad alati enne madalama prioriteediga järjekordi tühjaks.

### Prioriteetsuse toimimine

Igal tsüklil proovib töötleja tööd võtta loendi esimesest järjekorrast. Kui see järjekord on tühi või peatatud, liigub töötleja järgmise juurde ja jätkab, kuni leiab töö või kõik järjekorrad on läbi kontrollitud. Kui tööd ei leita, jääb töötleja magama ja proovib uuesti. See on range prioriteedimudel, mis tähendab, et pidev voog `critical` töödest jätab järjekorrad `default` ja `low` tööst ilma. Kui madalama prioriteediga järjekorrad vajavad tagatud läbilaskevõimet, kasutage nende jaoks spetsiaalseid töötlejaid.

### Mitme järjekorra kasutamine PHP-is

Meetodid `Worker::run()` ja `Worker::flush()` aktsepteerivad nii stringi kui ka massiivi:

```php
// Comma-separated string
Queuety::worker()->run( 'critical,default,low' );

// Array
Queuety::worker()->run( [ 'critical', 'default', 'low' ] );

// flush() also supports multi-queue
$count = Queuety::worker()->flush( 'critical,default,low' );
```

### Juurutusstrateegiad

**Iga järjekorra jaoks eraldi töötlejad** annavad teile täieliku kontrolli samaaegsuse ja eraldatuse üle. Igal järjekorral on oma töötleja process(es) ning teised järjekorrad ei saa seda tööta jätta:

```ini
[program:queuety-critical]
command=wp queuety work --queue=critical
numprocs=4

[program:queuety-default]
command=wp queuety work --queue=default
numprocs=2

[program:queuety-low]
command=wp queuety work --queue=low
numprocs=1
```

**Prioriteetsus ühe töötlejaga** on lihtsamini hallatav ja sobib hästi siis, kui madalama prioriteediga järjekorrad taluvad viivitusi:

```ini
[program:queuety-worker]
command=wp queuety work --queue=critical,default,low
numprocs=2
```

Võite ka mõlemat lähenemist kombineerida: kasutage läbilaskevõime tagamiseks spetsiaalseid töötlejaid `critical` jaoks ja kõige muu jaoks prioriteetsuse alusel töötlejat:

```ini
[program:queuety-critical]
command=wp queuety work --queue=critical
numprocs=2

[program:queuety-fallback]
command=wp queuety work --queue=default,low
numprocs=2
```

## Ressursiteadlik töötlusse lubamine

Töötlejad ei võta lihtsalt järgmist ootel kirjet. Enne võetud töö alustamist saab Queuety rakendada üldisi töötlusse lubamise kontrolle, mis põhinevad töö samaaegsusrühmal ja vastava käsitleja hiljutisel käitusprofiilil.

Üldise mudeli kohta, sealhulgas selle kohta, kuidas see seostub töö metaandmete ja töövoo eelarvetega, vaadake [Ressursside haldamine](https://queuety.inline0.dev/et/docs/features/resource-management).

Samaaegsusrühm seab mitmele käsitlejale või tööklassile ühise ülempiiri. Kui märgite mitu kulukat teenusepakkujat sama rühma ja piiranguga, vabastab töötleja äsja võetud töö selle käivitamise asemel, kui rühm on täis koormatud. Nii ei koorma sõltumatud järjekorrad üht allavoolusüsteemi korraga üle pelgalt seetõttu, et mitu töötlejat on jõude.

Hiljutised käituslogid annavad sisendi ka lihtsale töötlusse lubamise profiilile. Kui ressursipõhine töötlusse lubamine on sisse lülitatud, uurib Queuety käsitleja hiljutist keskmist kestust ja tippmälu, enne kui selle käivitab. Kui praegune töötleja läheneb juba seadistatud mälupiirile, järjekorra või teenusepakkuja rühm on juba oma kaalutud eelarve täis kasutanud, praegusel konteineril ei paista selle käsitleja täheldatud profiili jaoks piisavalt vaba mälu olevat või `--once` laadne käitus läheneb oma ajapiirile, lükkab Queuety töö edasi, selle asemel et alustada tööd, mis tõenäoliselt korralikult lõpule ei jõua.

Lubage reegel töö definitsioonis, mitte töötleja käsus:

```php
class CallProviderStep implements \Queuety\Step {
    public function handle( array $state ): array {
        // ...
    }

    public function config(): array {
        return [
            'concurrency_group' => 'providers',
            'concurrency_limit' => 3,
            'cost_units' => 5,
        ];
    }
}
```

Samad metaandmed saab lisada avalike omadustega väljakutsutavatele tööklassidele või üksikule väljakutsele meetodite `PendingJob::concurrency_group()` ja `PendingJob::cost_units()` kaudu.

Töötleja töötlusse lubamise profiili juhivad järgmised konstandid:

| Konstant | Kirjeldus |
|---|---|
| `QUEUETY_RESOURCE_ADMISSION` | Profiilipõhiste töötlusse lubamise kontrollide sisse- või väljalülitamine |
| `QUEUETY_RESOURCE_PROFILE_WINDOW_MINUTES` | Ajavahemik, mille põhjal koostatakse käsitlejate hiljutised profiilid |
| `QUEUETY_RESOURCE_PROFILE_TTL` | Käsitlejate hiljutiste profiilide vahemällu salvestamise TTL |
| `QUEUETY_RESOURCE_MEMORY_HEADROOM_MB` | Enne järgmise töö lubamist reservi jäetav mälumaht |
| `QUEUETY_RESOURCE_SYSTEM_MEMORY_AWARENESS` | Parima võimaliku konteineri- või hostimälukontrolli sisse- või väljalülitamine |
| `QUEUETY_RESOURCE_SYSTEM_MEMORY_HEADROOM_MB` | Enne järgmise töö lubamist reservi jäetav süsteemimälu maht |
| `QUEUETY_RESOURCE_QUEUE_COST_BUDGETS` | Järjekorra nime järgi määratavad kaalutud kulueelarved |
| `QUEUETY_RESOURCE_GROUP_COST_BUDGETS` | Kaalutud kulueelarved võtmega `concurrency_group` |
| `QUEUETY_RESOURCE_TIME_HEADROOM_MS` | Ühekordsete töötlejakäivituste jaoks reservi jäetav ajavaru |

## Töötleja elutsükkel

Töötleja peatub sujuvalt pärast käimasoleva töö lõpetamist, kui täitub mõni järgmistest tingimustest:

| Tingimus | Seadistus |
|---|---|
| Töödeldud tööde maksimumarv | `QUEUETY_WORKER_MAX_JOBS` (vaikimisi: 1000) |
| Mälupiiri ületamine | `QUEUETY_WORKER_MAX_MEMORY` (vaikimisi: 128 MB) |

Peatumise järel väljub töötleja puhtalt. Tootmiskeskkonnas käivitab protsessihaldur selle automaatselt uuesti.

Signaale ei käsitleta veel sujuvalt ([#4](https://github.com/inline0/queuety/issues/4)). Üksik `wp queuety work` protsess ei paigalda signaalikäsitlejat, seega `SIGTERM` või `SIGINT` (Ctrl+C) lõpetab selle kohe, ka töö keskel. See töö jääb olekusse `processing`, kuni aegunud tööde taastamine selle `QUEUETY_STALE_TIMEOUT` sekundi pärast lähtestab, seega hoidke käsitlejad korduskäivitamise suhtes ohutuna. Töötlejate kogum edastab `SIGTERM` oma alamprotsessidele, kuid alamprotsessid sellele ei reageeri, nii et kogum töötab edasi, kuni need mõnel ülaltoodud põhjusel peatuvad. Kui peate kogumi peatama, määrake protsessihaldurile peatamise ajalõpp, mille järel see saadab `SIGKILL`.

## Mitme töötleja samaaegsus

Lipp `--workers=N` hargneb N alamprotsessiks, kasutades `pcntl_fork()`. Iga alamprotsess loob oma andmebaasiühenduse ja töötleb töid eraldi. Põhiprotsess jälgib alamprotsesse ja käivitab krahhi korral need uuesti.

```bash
wp queuety work --queue=default --workers=4
```

Nõuded:
Laiendused `pcntl` ja `posix` PHP peavad olema installitud (ilma `pcntl`-ta ebaõnnestub käsk teatega "pcntl extension is required for --workers=N."), ja iga alamprotsess kasutab oma andmebaasiühendust, seega peab teie MySQL `max_connections` seadistus töötlejate kogumit arvestama. Kohanduvatel kogumitel (`--min-workers`/`--max-workers`) on samad nõuded.

## Kohanduvad töötlejate kogumid

Kohanduvad kogumid hoiavad minimaalse arvu töötlejaid soojas ning kasvatavad ja kahandavad nende arvu seadistatud vahemiku piires:

```bash
wp queuety work --queue=providers --min-workers=2 --max-workers=6
```

Põhiprotsess jälgib valitud järjekordade hulgas saadaval olevat järjekorra tagavara ja kohandab alamprotsesside arvu selle järgi, arvestades seadistatud ülempiiri. Kui järjekorras jääb vaiksemaks, ootab kogum enne vähendamist jõudeoleku armuaega, et lühiajalised koormustipud ei põhjustaks protsesside loendis kohe muutusi.

Suurendamine on endiselt ettevaatlik. Kui Queuety suudab lugeda konteineri või hosti mälutelemeetriat, keeldub see alamprotsesse lisamast, kui järgmise töötleja kogu mälumahu jaoks pole piisavalt vaba mälu.

Põhiprotsessi skaleerimistsüklit juhivad järgmised seaded:

| Konstant | Kirjeldus |
|---|---|
| `QUEUETY_WORKER_POOL_SCALE_INTERVAL` | Kui sageli põhiprotsess töötlejate kogumi suurust kooskõlastab |
| `QUEUETY_WORKER_POOL_IDLE_GRACE` | Kui kaua peab järjekord vaikne olema, enne kui kogumit vähendatakse |

## Aegunud töö taastamine

Kui töötleja jookseb töö töötlemise ajal kokku, jääb töö olekusse `processing`. Pikalt töötav töötleja kontrollib umbes kord minutis, kas mõni töö on olnud olekus `processing` kauem kui `QUEUETY_STALE_TIMEOUT` sekundit. Aegunud töö, millel on katseid alles, proovitakse uuesti pärast ooteaja möödumist; kõik katsed ära kasutanud töö jäetakse ootele ja selle töövoog märgitakse ebaõnnestunuks. `--once` töötlejad ja varuvariant WP-Cron seda kontrolli ei tee.

Taastage aegunud tööd käsitsi:

```bash
wp queuety recover
```

## Tühjendusrežiim

Töötle kõik ootel tööd ja välju. Sobib testimiseks või ühekordseks partiitöötluseks:

```bash
wp queuety flush
wp queuety flush --queue=emails
```

## Tootmiskeskkonda juurutamine

Tootmiskeskkonnas kasutage töötlejate töös hoidmiseks protsessihaldurit. Siin on kaks levinud võimalust.

### Supervisord

```ini
[program:queuety-default]
command=wp queuety work --queue=default
directory=/var/www/html
autostart=true
autorestart=true
numprocs=2
process_name=%(program_name)s_%(process_num)02d
stdout_logfile=/var/log/queuety-default.log
stderr_logfile=/var/log/queuety-default-error.log

[program:queuety-emails]
command=wp queuety work --queue=emails
directory=/var/www/html
autostart=true
autorestart=true
numprocs=1
stdout_logfile=/var/log/queuety-emails.log
stderr_logfile=/var/log/queuety-emails-error.log
```

### Systemd

```ini
[Unit]
Description=Queuety Worker (default queue)
After=mysql.service

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/html
ExecStart=/usr/local/bin/wp queuety work --queue=default
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
```

Lubage ja käivitage:

```bash
sudo systemctl enable queuety-worker
sudo systemctl start queuety-worker
```

### Juurutamisnõuanded

Kasutage eri järjekordade jaoks eraldi töötlejaid, kui vajate tugevamat eraldatust. Kasutage suvandit `--workers=N`, kui töökoormus on protsessorimahukas, ja eelistage eraldi jälgitavaid töötlejaid, kui töökoormus koosneb peamiselt sisend- ja väljundtoimingutest. Määrake `QUEUETY_WORKER_MAX_JOBS`, kui soovite perioodiliste taaskäivitustega mälu vabastada, ja jälgige `buried` arvu [veebikonksude](https://queuety.inline0.dev/et/docs/features/webhooks) või [mõõdikute](https://queuety.inline0.dev/et/docs/features/metrics) kaudu.
