Навбати вазифаҳо ва мувозинат
1) Чаро навбатҳо вазифа
Навбати кор/навбати корӣ истеҳсолкунандагон ва иҷрокунандагонро аз рӯи вақт ва суръат ҷудо мекунад:- Қуллаҳои ҳамвор: буферӣ байни зерсистемаҳои пеши ва вазнин.
- SLA-ро мӯътадил мекунад: афзалиятҳо ва ҷудокунии синфҳои сарборӣ.
- Таҳаммулпазирии гуноҳро содда мекунад: бозсозӣ, DLQ, дубора намоиш.
- Тарозуи уфуқӣ: Коргаронро бидуни тағир додани API илова кунед.
Соҳаҳои маъмулӣ: коркарди пардохт, огоҳиномаҳо, тавлиди гузориш/ВАО, коркарди пас аз ETL/ML, ҳамгироӣ бо API-ҳои беруна.
2) Мафҳумҳои моделӣ ва асосӣ
Истеҳсолкунанда: вазифаро нашр мекунад (сарборӣ + метамаълумот: калиди idempotency, афзалият, мӯҳлат).
Навбат/мавзӯъ: буферӣ/сабти вазифаҳо.
Коргар: вазифа мегирад, коркард мекунад, тасдиқ мекунад (ack) ё бо хатогӣ бармегардад.
Вақти намоён/иҷора: Вазифаҳои "иҷора" барои давомнокии коркард, пас аз - худкори дубора.
DLQ (Dead Letter Queue): вазифаҳои "дафн" пас аз маҳдудияти кӯшишҳо/хатогиҳои марговар.
Меъёри меъёри/мувофиқат: маҳдудияти истеъмол барои як коргар/як навбат/барои ҳар як иҷорагир.
- Кашидан: худи коргар вазифаро талаб мекунад (бори вазнро ҳисоб мекунад).
- Тела: fluffs Broker; аз "пур" кардани коргарони заиф муҳофизат лозим аст.
3) Семантикаи расонидан ва тасдиқ
Аксар вақт: ҳеҷ гуна бознигарӣ нест; тезтар, вале талафоти имконпазир.
Ҳадди аққал як маротиба (барои аксари навбатҳо бо нобаёнӣ): нусхабардорӣ имконпазир аст → idempotency handler талаб карда мешавад.
Ба таври муассир як маротиба: дар сатҳи татбиқ ба даст оварда шудааст (idempotency, dedup, муомилот/outbox). Брокер метавонад кӯмак кунад, аммо на "тирчаи ҷодугарӣ".
- Ack/Nack: натиҷаи равшан.
- Requeue/Retry: s backoff + jitter.
- Паёми заҳр - ба DLQ фиристед.
4) Мувозинат ва банақшагирӣ
4. 1 Пайдарпаӣ ва алгоритмҳо
ФИФО: Оддӣ ва пешгӯишаванда.
Навбати афзалиятнок: синфҳои афзалиятнок (P0... П3).
WRR/WSR (Вазни мудаввар-Робин/тасодуфӣ): саҳмияҳои CPU/интиқол байни дарсҳо.
WFQ/DRR (шабеҳ ба навбатҳои "одилона" дар шабакаҳо): саҳмияҳо ба иҷорагир/муштарӣ.
Мӯҳлати ниҳоӣ/EDF: барои вазифаҳо бо мӯҳлатҳо.
Ҳиссаи одилона: маҳдуд кардани "ҳамсояҳои пурғавғо" (квотаҳо барои ҳар як иҷорагир).
4. 2 Ҷараёни коркард
Парвоз дар як парвоз/Coalescing: Якҷоя кардани вазифаҳои калидии такрорӣ.
Сарпӯшҳои мувофиқат: маҳдудиятҳои қатъии параллелизм аз рӯи намуди вазифа/ҳамгироӣ (API-ҳои беруна).
4. 3 Geo ва Shardening
Shards аз рӯи калид (иҷорагир/id) → маҳалли ҷойгиршавии маълумот, тартиби устувор дар дохили shards.
Кэшҳо/захираҳои часпанда: масири ҳаш ба коргарон бо ҳолати "замимашуда".
5) Retrai, backoff ва DLQ
Бозгашти экспоненсиалӣ + jitter: 'base 2 * кӯшиш ± тасодуфӣ'.
Кӯшишҳои ҳадди аксар ва мӯҳлати ниҳоӣ (вақти мурдан) барои як вазифа.
Таснифи хатогиҳо: 'бознишаста' (шабака/лимит), 'бознишаста' (манъкунӣ/манъи тиҷорат).
Навбати таваққуф/таъхир: вазифаҳои ба таъхир афтода (масалан, пас аз 15 дақиқа такрор кунед).
Сиёсати DLQ: итминон ҳосил кунед, ки паёми "заҳролуд" ба куҷо ва дар кадом шароит мерасад; таъмин як репросессор.
6) Номутобиқатӣ ва такрорӣ
Idempotency-Калид дар вазифа; store (Redis/DB) бо TTL барои калидҳои охирини N:- дида мешавад → гузаштан/якҷоя кардан/натиҷа-кэш.
- Калидҳои табиӣ: Истифодаи 'order _ id/ payment_id' ба ҷои UID-ҳои тасодуфӣ.
- Outbox - далели вазифа ва вазъи онро дар як амалиёти пойгоҳи додаҳо бо муомилоти тиҷорӣ сабт кунед.
- Маҳз як маротиба дар кабуд: 'UPSERT' бо калид, версия, "ҳадди аққал як маротиба" дар навбат + номутобиқатӣ дар пойгоҳи додаҳо.
7) Синфҳои бисёрсоҳавӣ ва SLA
Навбатҳо/ҷараёнҳои ҷудогона аз рӯи синф: 'интиқодӣ', 'стандартӣ', 'яклухт'.
Квотаҳо ва афзалиятҳо барои як иҷорагир (тилло/нуқра/биринҷӣ).
Ҷудокунӣ: ҳавзҳои коргаронро дар зери P0 ҷудо кунед; замина - дар кластер/гиреҳҳои алоҳида.
Назорати қабул: бештар аз он ки шумо метавонед дар мӯҳлатҳо коркард кунед, қабул накунед.
8) Коргарони автосализатсия
Нишондиҳандаҳо барои миқёс: умқи навбат, суръати расидан, вақти коркард, мӯҳлати SLA.
KEDA/Pod Autoscaler уфуқӣ: SQS/Харгӯш/Кафка чуқурии ақибмонда.
Омилҳои маҳдудкунанда: меъёри беруна API-ро маҳдуд мекунад, пойгоҳи додаҳо (ақибро нест накунед).
9) Имконот ва намунаҳои технология
9. 1 харгӯш/AMQP
Мубодила: мустақим/мавзӯъ/мухлиси; Навбати с ack/ttl/DLQ (мубодилаи мактубҳо).
Prefetch (QOS) "чӣ қадар вазифаҳоро дар болои коргар" танзим мекунад.
ini x-dead-letter-exchange=dlx x-dead-letter-routing-key=jobs.failed x-message-ttl=60000
9. 2 SQS (ва аналогҳо)
Мӯҳлати зоҳирӣ, таъхири сонияҳо, RedrivE Policy (DLQ).
Idempotence - оид ба ариза (ҷадвали dedup).
Маҳдудиятҳо: қассобҳо 1-10 паём; тамаркуз ба хунхобии idempotent.
9. 3 Кафка/NATS Jetstream
Барои қубурҳои калонҳаҷм: интиқоли баланд, нигоҳдорӣ/такрорӣ.
Навбати вазифа аз рӯи гузоришҳо: як вазифа = як паём; як коргар барои назорати калидӣ тавассути тақсимоти мавзӯъ.
Retrai: мавзӯъҳои инфиродӣ/мавзӯъҳо-суффиксҳо бо бозгашт.
9. 4 навбати Редис (Sidekiq/Resque/Bull/Celery-Redis)
Таъхири хеле паст; устувориро тамошо кунед (RDB/AOF), калидҳои такрорӣ ва калидҳои қулф барои як парвоз.
Барои вазифаҳои "сабук" мувофиқ аст, на барои нигоҳдории дарозмуддат.
9. 5 Чаҳорчӯба
Карафс (Python), Sidekiq (Ruby), RQ/Bull
10) Схемаҳои масир ва мувозинат
Раунд-Робин: Ба таври баробар, аммо "вазнинии" вазифаҳоро ба назар намегирад.
RR вазн: тақсимот аз рӯи иқтидори коргарон/ҳавз.
Одилона/Backpressure огоҳ: Коргар танҳо ҳангоми тайёрӣ вазифаи нав мегирад.
Хатҳои афзалиятнок: навбатҳои алоҳида барои як синф; коргарон агар дастрас бошанд, бо тартиби [P0 →... → Pn] мехонанд.
Масири ҳэш: 'hash (калид)% shards' - барои коркарди давлатӣ/кэш.
11) Мӯҳлатҳо, мӯҳлатҳо ва SLA
Мӯҳлати иҷрои вазифа: "иҷора" -и дохилии кор (дар коди коргар) ≤ Вақти намоёни брокер.
Мӯҳлати глобалӣ: вазифа пас аз T вақт маъно надорад - NACK → DLQ.
Аз буҷа огоҳ: коҳиш додани кор (brownout) ҳангоми наздик шудани мӯҳлат (натиҷаҳои қисман).
12) Мушоҳида ва идоракунӣ
12. 1 Ченак
'queue _ depth', 'arrival _ rate', 'service _ rate', 'lag' (Kafka), 'ноаён _ паёмҳо' (SQS).
'нокомӣ/нокомӣ/истеъфо _ total', 'retry _ truds', 'dlq _ in _ total', 'коркард _ time _ ms {p50, p95, p99}'.
'idempotency _ hit _ rate', 'dedup _ drops _ total', 'poison _ total'.
12. 2 Гузоришҳо/Пайгирӣ
Таносуб: 'job _ id', 'correlation _ id', калиди такрорӣ.
Ҳамчун рӯйдодҳо 'retry/backoff/dlq' -ро қайд кунед; пайвастшавӣ аз дархости аввалия.
12. 3 Панели/огоҳиҳо
Триггерҳо: чуқурӣ> X, p99> SLO, афзоиши DLQ, вазифаҳои часпида (мӯҳлати намоён> N), калидҳои гарм.
13) Бехатарӣ ва риояи
Ҷудокунии иҷорагир: навбатҳои инфиродӣ/ҷойҳои асосӣ, ACL, квотаҳо.
Рамзгузорӣ дар нақлиёт ва/ё "дар истироҳат".
Кам кардани PII дар сарборӣ; hash/ID ба ҷои PII хом.
Асрори: нишонаҳоро дар мақоми вазифа нагузоред, захира/refs-ро истифода баред.
14) Анти-намунаҳо
Retrai бе idempotency → амалиётҳои такрорӣ/пул "ду бор".
Як навбати азим "барои ҳама §" ҷудокунӣ ва таъхирҳои пешгӯинашаванда нест.
Ретраи беохир бе DLQ → вазифаҳои абадии "заҳролуд".
Вақти намоён <вақти коркард → нусхаҳои каскадӣ.
Сарбории калон дар навбат → фишори шабака/хотира; беҳтар аст, ки дар стори объект нигоҳ дошта, пайвандро интиқол диҳед.
Модели тела бидуни backpressure → коргарон пахш мекунанд.
Омезиши вазифаҳои муҳим ва яклухт дар як ҳавзи коргарон.
15) Рӯйхати назорати амалисозӣ
- Таснифи вазифаҳо аз рӯи SLA (P0/P1/P2) ва ҳаҷм.
- Брокер/чаҳорчӯбро бо семантикаи дилхоҳ ва нигоҳдорӣ интихоб кунед.
- Калидҳои тарроҳӣ, афзалиятҳо ва масир (hash/shards/хатҳои афзалиятнок).
- Бозгашти бозгашт + jitter ва сиёсати DLQ.
- Татбиқи idempotency (калидҳо, upsert, deadstore бо TTL).
- Таъини мӯҳлати ҳар як вазифа, намоён ва мӯҳлати умумии мӯҳлат.
- Мувофиқат ва меъёри ҳамгироӣ/иҷорагиронро маҳдуд кунед.
- Миқёси худкори амиқ/ақибмонда бо сақичҳо.
- Ченакҳо/пайгирӣ/огоҳиҳо; runbooks оид ба "тӯфон" ва DLQ пур.
- Санҷишҳо барои нокомӣ: афтодани коргар, паёми "заҳролуд", изофабор, вазифаҳои дароз.
16) Конфигуратсияҳо ва рамзи намуна
16. 1 Карафс (Редис/Харгӯш) - ҷараёни асосӣ
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 харгӯш - 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 Кафка - Бозсозӣ аз рӯи сатҳ
orders -> orders.retry.5s -> orders.retry.1m -> orders.dlq
(Интиқол бо таъхири таъхир тавассути ҷадвал/cron-истеъмолкунанда.)
16. 4 NATS Jetstream - бозгашт аз истеъмолкунанда
bash nats consumer add JOBS WORKERS --filter "jobs.email" \
--deliver pull --ack explicit --max-deliver 6 \
--backoff "1s,5s,30s,2m,5m"
17) FAQ
Савол: Кай интихоб кардани фишор бар зидди кашидан?
A: Pull ба ақибнишинии табиӣ ва мувозинати "ростқавл" медиҳад; тела бо суръати паст осонтар аст ва вақте ки TTFB ҳадди аққал лозим аст, аммо маҳдудкунандагонро талаб мекунад.
Савол: Чӣ гуна бояд калиди гармро пешгирӣ кард?
A: Шард аз рӯи калиди таркибӣ ('фармоиш _ id% N'), буферӣ ва партия-раванд, ба ҳар як калид маҳдудиятҳо ворид кунед.
Савол: Оё "маҳз як бор" имконпазир аст?
A: Амалан - тавассути idempotence ва outbox transactional. Комилан "математикӣ" маҳз як маротиба дар ҳама ҳолатҳо камёб ва гарон аст.
Савол: Замимаҳои калони вазифаро дар куҷо нигоҳ доштан мумкин аст?
A: Дар нигаҳдории объект (S3/GCS) ва дар вазифа - пайванд/ID; фишорро ба брокер ва шабака коҳиш медиҳад.
Савол: Чӣ гуна TTL/намоёнро интихоб кардан мумкин аст?
A: Намоёнӣ ≥ вақти коркарди p99 × саҳҳомии 2-3 ×. Вазифаҳои TTL - мӯҳлати камтар аз тиҷорат.
18) Натиҷаҳо
Системаи қавии навбатӣ мувозинати байни семантикаи таҳвил, афзалиятҳо ва маҳдудиятҳо мебошад. Калидҳои тарроҳӣ ва масир, idempotency-ро таъмин кунед, бо бозгашт ва DLQ баргардонед, ба синфҳои SLA захираҳо ҷудо кунед ва ченакҳоро назорат кунед. Он гоҳ равандҳои пасзаминаи шумо пешгӯишаванда, устувор ва миқёспазир хоҳанд буд - ҳеҷ гуна ногаҳонӣ дар қуллаҳо.