Wezipeleriň nobatlary we deňagramlylygy
1) Näme üçin wezipeleriň nobatlary
Wezipe nobaty (job queue/work queue) öndürijileri we ýerine ýetirijileri wagt we tizlik boýunça aýyrýar:- Depeleri tekizleýär: öň bilen agyr kiçi ulgamlaryň arasyndaky bufer.
- SLA durnuklaşdyrýar: ileri tutulýan ugurlar we ýük synplarynyň izolýasiýasy.
- Şowsuzlyga çydamlylygy ýönekeýleşdirýär: retralar, DLQ, gaýtadan sahnalaşdyrmak.
- Gorizontal masştaby: API çalşmazdan workerleri goşuň.
Adaty domenler: tölegleri gaýtadan işlemek, bellikler, hasabat/media döretmek, ETL/ML-postprosessing, daşarky API-ler bilen integrasiýa.
2) Model we esasy düşünjeler
Prodýuser: tabşyrygy çap edýär (töleg + meta-maglumatlar: idempotency key, ileri tutulýan, möhletli).
Nobat/topik: tampon/log meseleler.
Worker: tabşyrygy alýar, gaýtadan işleýär, tassyklaýar (ack) ýa-da ýalňyşlyk bilen yzyna gaýtarýar.
Visibility Timeout/Lease: "kärende" işi gaýtadan işlemek wagty üçin, soň - awto-redaktirlemek.
DLQ (Dead Letter Queue): Synanyşyklaryň/ölümli ýalňyşlyklaryň çäginden soň wezipeleri "jaýlamak".
Rate Limit/Concurrency: sarp ediş çäklendirmeleri per-worker/per-nobat/per-tenant.
- Pull: worker meseläni özi soraýar (ýüküň dozasyny berýär).
- Push: dellal push; gowşak workerleriň "guýulmagyndan" gorag gerek.
3) Eltmegiň we tassyklamagyň semantikleri
At-most-once: retraýsyz; has çalt, ýöne ýitmek mümkin.
At-least-once (nobatlaryň köpüsi üçin defolt): dublikatlar bolup biler → prosessoryň idempotentligi talap edilýär.
Effectively exactly-once: programma derejesinde gazanylýar (idempotentlik, dedup-stor, amallar/autbox). Broker kömek edip biler, ýöne "jadyly ok" däl.
- Ack/Nack: aýdyň netije.
- Requeue/Retry: с backoff + jitter.
- Poison message: DLQ-e iberiň.
4) Deňagramlaşdyrmak we meýilleşdirmek
4. 1 Yzygiderlilik we algoritmler
FIFO: ýönekeý we öňünden aýdylýan.
Priority Queue: prioritet synplar (P0... P3).
WRR/WSR (Uly tegelek-Robin/Random): Synplaryň arasyndaky CPU/bölek paýlary.
WFQ/DRR (torlardaky "adalatly" nobatlaryň meňzeşi): per-tenant/müşderi paýlary.
Deadline/EDF: möhletli meseleler üçin.
Fair Share: "şowhunly goňşulary" çäklendirmek (per-tenant quotas).
4. 2 Bejeriş akymlary
Single-flight/Coalescing: Düwmäniň dublikatlaryny birleşdiriň.
Concurrency caps: Meselelere/integrasiýalara (daşarky API) görä gaty paralellik çäkleri.
4. 3 Geo we şardlamak
Şardlar açar boýunça (tenant/id) → Maglumatlaryň ýerleşişi, şardlaryň içinde durnukly tertip.
Sticky kesişlere/çeşmelere: "birikdirilen" ýagdaýly workerler üçin kesh-routing.
5) Retraýlar, backoff we DLQ
Eksponensial backoff + jitter: 'base 2 ^ attempt ± random'.
Maksatnama üçin iň köp synanyşyk we umumy möhlet (time-to-die).
Ýalňyşlyklaryň klassifikasiýasy: 'retryable' (tor/çäk), 'retryable' (validasiýa/iş gadaganlygy).
Parking/Delay Queue: yza süýşürilen meseleler (mysal üçin, 15 minutdan soň gaýtalaň).
DLQ-syýasat: "zäherli" habaryň nirä we haýsy şertlerde gelýändigini hökman görkeziň; reprocessor.
6) Idempotentlik we duplikasiýa
Idempotency-Key meselede; Iň soňky açarlar üçin TTL bilen stor (Redis/DB):- seen → skip/merge/result-cache.
- Natural keys: 'order _ id/ payment_id' tötänleýin UUID-leriň ýerine ulanyň.
- Outbox: iş amallary bilen bir DB amalynda wezipe faktyny we onuň ýagdaýyny ýazmak.
- Gökdäki "Exactly-once": "UPSERT" açary boýunça, wersiýalary barlamak, nobata "at-least-once" + DB-de idempotentlik.
7) Köp tenantlyk we SLA synplary
Synplary bölüň: 'critical', 'standard', 'bulk'.
Per-tenantyň kwotalary we ileri tutulýan ugurlary (Gold/Silver/Bronze).
Izolýasiýa: P0 aşagyndaky workerleriň dedicate-pullary; fon - aýratyn klasterde/nodlar.
Admission control: senediňizden köp kabul etmäň.
8) Workerleriň awtoskeýlingi
Skeyling üçin metrikler: queue depth, arrival rate, processing time, SLA-möhletler.
KEDA/Horizontal Pod Autoscaler: SQS/Rabbit/Kafka lag.
Çäklendiriji faktorlar: daşarky API rate limits, maglumatlar bazasy (arka tarapy ýok etmäň).
9) Tehnologiki wariantlar we patternler
9. 1 RabbitMQ/AMQP
Exchanges: direct/topic/fanout; Queues с ack/ttl/DLQ (dead-letter exchange).
Prefetch (QoS) "workerde näçe meseläni" düzgünleşdirýär.
ini x-dead-letter-exchange=dlx x-dead-letter-routing-key=jobs.failed x-message-ttl=60000
9. 2 SQS (we analoglary)
Visibility Timeout, DelaySeconds, RedrivePolicy (DLQ).
Idempotentlik - programmada (dedup-tablisa).
Çäkler: 1-10 habaryň gaplary; dempotent sinklere gönükdiriň.
9. 3 Kafka/NATS JetStream
Uly göwrümli paýlaýnlar üçin: ýokary geçiriş, retenşn/repli.
Task-nobat: bir wezipe = bir habar; partiýa/subject arkaly "açar üçin bir worker" gözegçilik.
Retraýlar: aýry-aýry topikler/subject-goşulmalar bilen backoff.
9. 4 Redis-nobatlar (Sidekiq/Resque/Bull/Celery-Redis)
Gaty pes gizlinlik; durnuklylygy (RDB/AOF), retry açarlary we single-flight üçin lock-keys.
"Ýeňil" meseleler üçin amatly, uzak möhletli retenşn üçin däl.
9. 5 Frameworklar
Celery (Python), Sidekiq (Ruby), RQ/BullMQ (Node), Huey/Resque - taýýar retralar, meýilnamalar, middleware, metrikler.
10) Marşrutlaşdyrmagyň we deňagramlylygyň shemalary
Round-Robin: birmeňzeş, ýöne meseleleriň "agyrlygyny" göz öňünde tutmaýar.
Weighted RR: workerleriň/howuzyň kuwwatyna görä paýlamak.
Fair/Backpressure-aware: worker täze wezipäni diňe taýýar bolanda alýar.
Priority lanes: synp üçin aýratyn nobatlar; workerler bar bolsa [P0 →... → Pn] okaýarlar.
Hash-routing: 'hash (key)% shards' - stateful/kesmek üçin.
11) Wagtlar, möhletler we SLA
Per-task timeout: içerki "kärende" işi (worker kodunda) ≤ brokeriň Visibility Timeout.
Global deadline: T wagtyndan soň meseläniň manysy ýok - NACK → DLQ.
Budget-aware: Iş möhleti ýakynlaşanda (brownout) işini azaldyň (bölekleýin netijeler).
12) Gözegçilik we dolandyryş
12. 1 Metrikler
`queue_depth`, `arrival_rate`, `service_rate`, `lag` (Kafka), `invisible_messages` (SQS).
`success/failed/retired_total`, `retry_attempts`, `dlq_in_total`, `processing_time_ms{p50,p95,p99}`.
`idempotency_hit_rate`, `dedup_drops_total`, `poison_total`.
12. 2 Giriş/söwda
Baglanyşyk: 'job _ id', 'correlation _ id', duplikasiýa açary.
'retry/backoff/dlq' -ni waka hökmünde belläň; başlangyç soragyň spanyndan çyzmak.
12. 3 Daşbordlar/alertler
Triggerler: çuňlugy> X, p99> SLO, DLQ beýikligi, "ýapyşan" meseleler (visibility> N), "gyzgyn" açarlar.
13) Howpsuzlyk we laýyklyk
Kärendeçileriň izolýasiýasy: aýry-aýry nobatlar/açar giňişlikleri, ACL, kwotalar.
Transportda şifrlemek we/ýa-da "rahat".
payload-da PII-minimalizasiýa; çig PII ýerine hash/ID.
Syrlar: bellikleri wezipeleriň bedenine goýmaň, vault/refs ulanyň.
14) Anti-patternler
Idempotentlik bolmazdan retraýlar → goşa amallar/pul "iki gezek".
"Hemme zat üçin" bir ullakan nobat → izolýasiýa ýok, garaşylmadyk gijikdirmeler.
DLQ-siz tükeniksiz retralar → baky "zäherli" meseleler.
Visibility Timeout <iş wagty → kaskad dublikatlary.
Nobatdaky uly töleg → tor/ýady basýar; obýektiň gapdalynda saklamak we baglanyşygy geçirmek has gowudyr.
Push-model backpressure → workerler bogulýarlar.
Möhüm we bulk-meseleleri bir howuzda garyşdyrmak.
15) Girizmegiň çek-sanawy
- SLA (P0/P1/P2) we göwrümi boýunça wezipeleri klassifikasiýa ediň.
- Islenýän semantika we retenshn bilen broker/çarçuwany saýlaň.
- Açarlary, ileri tutulýan ugurlary we marşrutlary düzüň (hash/shards/priority lanes).
- Backoff + jitter we DLQ syýasaty bilen retraýalary açyň.
- Idempotentligi durmuşa geçiriň (açarlar, upsert, TTL bilen dup-stor).
- Wagtlary sazlaň: per-task, visibility, umumy möhlet.
- concurrency we rate integrasiýa/tenant bilen çäklendiriň.
- Çuň/laga boýunça goragly awtoskeyling.
- Metrikler/söwda/alertler; runbooks "tupan" we DLQ-den aşa köp.
- Feýller üçin synaglar: workeriň ýykylmagy, "zäherli" habar, aşa ýüklemek, uzyn meseleler.
16) Konfigurasiýa we kod mysallary
16. 1 Celery (Redis/Rabbit) - esasy flow
python app = Celery("jobs", broker="amqp://...", backend="redis://...")
app.conf.task_acks_late = True # ack после выполнения app.conf.broker_transport_options = {"visibility_timeout": 3600}
app.conf.task_default_retry_delay = 5 app.conf.task_time_limit = 300 # hard timeout
@app.task(bind=True, autoretry_for=(Exception,), retry_backoff=True, retry_jitter=True, max_retries=6)
def process_order(self, order_id):
if seen(order_id): return "ok" # идемпотентность do_work(order_id)
mark_seen(order_id)
return "ok"
16. 2 RabbitMQ — DLQ/TTL
ini x-dead-letter-exchange=dlx x-dead-letter-routing-key=jobs.dlq x-message-ttl=600000 # 10 минут x-max-priority=10
16. 3 Kafka - derejeler boýunça retralar
orders -> orders.retry.5s -> orders.retry.1m -> orders.dlq
(Gijikdirilen gowşuryş bilen scheduler/cron-consumer arkaly geçiriň.)
16. 4 NATS JetStream — consumer с backoff
bash nats consumer add JOBS WORKERS --filter "jobs.email" \
--deliver pull --ack explicit --max-deliver 6 \
--backoff "1s,5s,30s,2m,5m"
17) FAQ
Q: pull garşy push haçan saýlamaly?
A: Pull tebigy backpressure we "dogruçyl" deňagramlylygy berýär; push pes tizlikde we iň az TTFB gerek bolanda has aňsat, ýöne çäklendirijileri talap edýär.
Q: "Gyzgyn" açardan nädip gaça durmaly?
A: Birleşdirilen açar boýunça şard ediň ('order _ id% N'), bufer ediň we batch-gaýtadan işläň, per-açar çäklerini giriziň.
Q: "exactly-once" bolup bilermi?
A: Iş ýüzünde - idempotentlik we geleşik autboks arkaly. Doly "matematiki" exactly-once tutuş ýolda seýrek we gymmat.
Q: Uly maýa goýumlaryny nirede saklamaly?
A: Obýektiň saklanylýan ýerinde (S3/GCS), wezipede bolsa/ID baglanyşygy; dellalyň we toruň basyşyny peseldýär.
Q: TTL/visibility nädip saýlamaly?
A: Visibility ≥ p99 gaýtadan işlemek wagty × ätiýaçlyk 2-3 ×. TTL wezipeleri - iş möhletinden az.
18) Netijeler
Nobatlaryň güýçli ulgamy - gowşuryş semantikasynyň, ileri tutulýan ugurlaryň we çäklendirijileriň arasyndaky deňagramlylykdyr. Açarlary we marşrutlary dizaýn ediň, idempotentligi üpjün ediň, backoff we DLQ bilen retralar, çeşmeleri SLA synplaryna paýlaň we metrlere gözegçilik ediň. Şonda fon prosesleriňiz öňünden aýdyp boljak, durnukly we masştably bolar - iň ýokary derejelerde garaşylmadyk ýagdaýda.