Queue-Based Load Leveling — producer yaratadigan ish hajmi bilan consumer qayta ishlash capacity’si orasiga queue qo‘yib, keskin traffic burstlarini silliqlaydigan cloud pattern. Producer ishni darhol consumerga yubormaydi, balki queue’ga yozadi. Workerlar esa o‘z tezligida qayta ishlaydi.
Pattern downstream service va database’ni qisqa muddatli overload’dan himoya qiladi.
Muammo
Userlar bir vaqtda minglab fayl yuklashi mumkin.
Har upload darhol image processing service’ga yuborilsa:
- CPU tugaydi;
- database connection to‘ladi;
- timeout;
- cascading failure;
- request yo‘qolishi
yuz beradi.
Queue burstni backlog sifatida saqlaydi.
Producer
Producer task yoki commandni message ko‘rinishida queue’ga yuboradi.
saqlashi mumkin.
Producer queue qabul qilgach userga accepted javob qaytarishi mumkin.
Queue
Queue producer va consumer tezligini ajratadi.
U:
- durability;
- ordering;
- delivery;
- retention;
- visibility;
- acknowledgement
semantikasiga ega.
Maksimal backlog va retention belgilanadi.
Consumer
Consumer yoki worker queue’dan message olib qayta ishlaydi.
Worker soni capacity va backlogga qarab oshirilishi mumkin.
Bir message uzoq ishlasa visibility timeout va heartbeat boshqariladi.
Load leveling
Producer traffic’i notekis:
past
past
katta burst
past
Consumer esa barqaror tezlikda ishlaydi.
Queue yuqori nuqtadagi ishni vaqt bo‘ylab taqsimlaydi.
Bu peak capacity uchun ortiqcha server saqlash ehtiyojini kamaytiradi.
Asynchronous javob
Operation darhol tugamasligi sabab clientga:
berilishi mumkin.
“Success” faqat queue’ga qabul qilinganini anglatadimi yoki ish tugaganini aniq ko‘rsatish kerak.
Backlog
Queue’dagi ishlanmagan message’lar backlog.
Faqat message soni yetarli metric emas.
Kuzatiladi:
Autoscaling
Workerlar queue depth yoki message yoshi bo‘yicha scale qilinadi.
Juda agressiv scaling downstream database’ni birdan overload qilishi mumkin.
Maksimal concurrency dependency capacity bilan cheklanadi.
Scale down faol tasklar tugagach bajariladi.
Acknowledgement
Worker taskni muvaffaqiyatli tugatgach ack yuboradi.
Processingdan oldin ack qilinsa worker crashida task yo‘qolishi mumkin.
Keyin ack qilinsa task qayta yetkazilishi ehtimoli bor.
Handler idempotent bo‘ladi.
Visibility timeout
Worker message’ni olganda u vaqtincha boshqa consumerlardan yashiriladi.
Timeout tugab, ack bo‘lmasa message yana ko‘rinadi.
Task timeoutdan uzoq ishlasa visibility uzaytiriladi.
Juda uzun timeout crashdan keyingi retryni kechiktiradi.
Retry
Transient xatoda message qayta ishlanadi.
bilan boshqariladi.
Doimiy invalid payload cheksiz retry qilinmaydi.
Dead-letter queue
Ko‘p marta xato bergan message DLQga o‘tkaziladi.
U yerda:
saqlanadi.
Tuzatilgach boshqariladigan replay qilinadi.
Ordering
Bitta queue global ordering bersa parallel consumerlar uni buzishi mumkin.
Entity bo‘yicha ordering kerak bo‘lsa partition key yoki message group ishlatiladi.
Bitta hot key parallelizmni cheklaydi.
Idempotency
Ayni message qayta yetkazilishi mumkin.
Unique task ID va processed registry duplicate side effectni to‘xtatadi.
Yoki operation natural idempotent bo‘ladi.
External payment uchun provider idempotency key ishlatiladi.
Payload hajmi
Katta faylni queue message ichiga joylashtirish qimmat.
Fayl object storage’ga yoziladi.
Message ichida:
saqlanadi.
Bu Claim Check Patternga yaqin.
Queue to‘lishi
Backlog capacity limitga yetsa:
- producer throttle;
- request rad etish;
- past priorityni drop;
- boshqa storage;
- emergency scale
siyosati ishlatiladi.
Queue to‘lishidan oldin alert beriladi.
Stale task
Task juda kech qayta ishlansa business ma’nosini yo‘qotishi mumkin.
Masalan, bir daqiqalik notification bir soatdan keyin foydasiz.
Message TTL yoki handler deadline’ni tekshiradi.
Transactional enqueue
Database update va queue publish alohida bajarilsa biri muvaffaqiyatli, biri xato bo‘lishi mumkin.
Transactional Outbox database commit va event yozuvini birga saqlaydi.
Keyin worker queue’ga publish qiladi.
Observability
End-to-end trace:
request
→ enqueue
→ wait
→ worker start
→ processing
→ completion
bosqichlarini ko‘rsatadi.
Queue wait va processing latency alohida o‘lchanadi.
Poison message
Payload syntax jihatdan valid, ammo har safar handlerni xatoga olib keladigan bo‘lishi mumkin.
Delivery count limitga yetgach u DLQga o‘tkaziladi.
Aks holda bitta message queue boshini band qilib, keyingi ishlarni kechiktiradi.
Worker lease
Uzoq taskda worker message ownershipini heartbeat bilan uzaytiradi.
Worker to‘xtasa lease tugab, boshqa worker taskni qayta oladi.
Eski worker kech yakunlansa fencing yoki idempotency duplicate natijani cheklaydi.
Capacity rejalash
Arrival rate doim processing rate’dan yuqori bo‘lsa queue faqat muammoni kechiktiradi.
Sustainable capacity:
worker soni × bir worker throughputi
arrival rate’dan yuqori bo‘lishi kerak.
Backlog drain vaqti SLO bilan solishtiriladi.
Priority queue
Kritik tasklar oddiy backlog ortida uzoq kutmasligi uchun alohida queue yoki priority ishlatilishi mumkin.
Doimiy yuqori priority oqimi past priority tasklarni starvationga olib kelmasligi uchun quota ajratiladi.
Bog‘liq tushunchalar
Message queue, Load leveling, Backpressure, Worker, Acknowledgement, Visibility timeout, Dead-letter queue, Autoscaling, Idempotency, Transactional Outbox