Zamonaviy backend tizimlarda ko‘pincha foydalanuvchidan kelgan so‘rovlar bilan birga ko‘plab qo‘shimcha vazifalar ham bajarilishi kerak bo‘ladi. Masalan, foydalanuvchi ro‘yxatdan o‘tganda unga email yuborish, rasm yuklanganda uni optimizatsiya qilish, bildirishnoma jo‘natish yoki statistik ma’lumotlarni hisoblash kabi jarayonlar mavjud. Agar bu ishlarning barchasi bir vaqtning o‘zida HTTP request ichida bajarilsa, server sekinlashadi va foydalanuvchi uzoq vaqt javob kutishga majbur bo‘ladi.
Shu sababli zamonaviy backend arxitekturalarda queue tizimlari keng qo‘llaniladi. Queue tizimi og‘ir yoki vaqt talab qiladigan vazifalarni alohida navbatga qo‘yadi va ularni alohida worker jarayonlari orqali bajaradi. Natijada asosiy server foydalanuvchiga tez javob qaytaradi, qolgan vazifalar esa fon rejimida bajariladi.
Queue nima?
Queue — bu FIFO (First In, First Out) prinsipi asosida ishlaydigan ma’lumot tuzilmasidir. Ya’ni birinchi qo‘shilgan vazifa birinchi bo‘lib bajariladi.
Oddiy qilib aytganda, bu bankdagi navbatga o‘xshaydi. Birinchi kelgan odam birinchi xizmat oladi, keyin esa keyingi odamlar navbati bilan xizmat oladi.
Backend tizimlarda ham aynan shu prinsip qo‘llaniladi. Masalan, agar uchta vazifa queue’ga qo‘shilgan bo‘lsa, ular quyidagicha bajariladi:
Task1 → Task2 → Task3
Worker birinchi vazifani olib bajaradi, keyin ikkinchi va uchinchi vazifalarni navbat bilan bajaradi.
Queue arxitekturasi
Ko‘p queue tizimlari uchta asosiy komponentdan iborat bo‘ladi: producer, queue (broker) va worker.
Producer — bu queue’ga vazifa qo‘shadigan servis yoki dastur qismi hisoblanadi. Odatda bu API server yoki boshqa mikroservis bo‘ladi. Masalan, foydalanuvchi yangi akkaunt yaratganda server email yuborish vazifasini queue’ga qo‘shadi.
Queue yoki broker — bu vazifalarni vaqtincha saqlaydigan tizimdir. Queue vazifalarning navbatini boshqaradi, ularning statuslarini saqlaydi va workerlarga vazifalarni taqsimlaydi.
Worker — bu queue’dan vazifalarni olib, ularni bajaradigan jarayon hisoblanadi. Worker doimiy ravishda queue’ni kuzatib turadi va yangi vazifa kelganda uni bajarishni boshlaydi.
Butun jarayonni quyidagi tarzda tasavvur qilish mumkin:
Foydalanuvchi so‘rovi → Producer → Queue → Worker → Vazifa bajariladi
Queue qanday ishlaydi?
Jarayon odatda bir nechta bosqichdan iborat bo‘ladi.
Birinchi bosqichda producer yangi vazifani queue’ga qo‘shadi. Masalan, API server foydalanuvchi ro‘yxatdan o‘tganda email yuborish vazifasini queue’ga qo‘shadi.
Ikkinchi bosqichda worker queue’dan vazifani kutib turadi. Worker vazifa kelishini kutadi va queue’da yangi element paydo bo‘lishi bilan uni olib ishlay boshlaydi.
Uchinchi bosqichda worker vazifani bajaradi. Masalan, email yuboradi, rasmni optimizatsiya qiladi yoki boshqa fon vazifasini bajaradi.
Vazifa tugagach uning holati yangilanadi. Odatda queue tizimlarida vazifalar bir nechta statuslardan o‘tadi.
waiting → active → completed yoki waiting → active → failed
Waiting — vazifa queue’da navbatda turibdi. Active — worker vazifani bajarayapti. Completed — vazifa muvaffaqiyatli tugadi. Failed — vazifa xatolik bilan tugadi.
Polling muammosi
Agar worker queue’ni oddiy usul bilan tekshirib tursa, bu polling deyiladi. Masalan, worker har bir sekundda queue’da vazifa bor-yo‘qligini tekshirishi mumkin.
Bunday jarayon quyidagicha ko‘rinadi:
while(true)
queue bo‘shmi?
agar bo‘sh bo‘lsa kut
yana tekshir
Bu usul samarasiz hisoblanadi, chunki:
- CPU keraksiz ishlatiladi
- network requestlar ko‘payadi
- tizim samaradorligi pasayadi
Shuning uchun zamonaviy queue tizimlari polling o‘rniga boshqa mexanizm ishlatadi.
Blocking mexanizm
Ko‘p queue tizimlari blocking mexanizmdan foydalanadi. Masalan Redis asosidagi queue tizimlarida BLPOP, BRPOP yoki BLMOVE kabi commandlar mavjud.
Bu commandlar shunday ishlaydi: agar queue bo‘sh bo‘lsa, Redis worker connectionini yopmaydi va uni kutish holatida ushlab turadi. Worker CPU ishlatmaydi va yangi vazifa kelishini kutadi.
Producer yangi vazifa qo‘shganda Redis darhol worker’ni uyg‘otadi va vazifani worker’ga beradi.
Natijada tizim polling qilmaydi va juda samarali ishlaydi. Bu mexanizm katta tizimlarda resurslarni tejashga va tez ishlashga yordam beradi.
Distributed workerlar
Queue tizimlarining yana bir muhim afzalligi — ular oson scale qilinadi. Ya’ni bir nechta worker ishlashi mumkin.
Agar yangi vazifa kelib tushsa, queue uni bo‘sh workerga beradi. Bu jarayon avtomatik ravishda load balancing vazifasini bajaradi.
Natijada bir vaqtning o‘zida bir nechta vazifalar parallel bajarilishi mumkin. Bu esa katta tizimlarda juda muhim hisoblanadi.
Queue tizimlarining afzalliklari
Queue tizimlari backend arxitekturaga bir nechta muhim imkoniyatlar beradi.
Birinchidan, ular asynchronous processing imkonini beradi. Foydalanuvchi requestni kutmaydi, vazifa esa fon rejimida bajariladi.
Ikkinchidan, tizimni oson scale qilish mumkin. Workerlar sonini oshirish orqali ko‘proq vazifalarni parallel bajarish mumkin.
Uchinchidan, queue tizimlari barqarorlikni oshiradi. Agar vazifa bajarilmay qolsa, uni qayta ishga tushirish mumkin.
To‘rtinchidan, queue tizimlari load balancing imkonini beradi. Vazifalar workerlar o‘rtasida avtomatik taqsimlanadi.
Queue qayerlarda ishlatiladi?
Queue tizimlari juda ko‘p joylarda ishlatiladi. Eng ko‘p uchraydigan misollar quyidagilar:
- email yuborish tizimlari
- SMS yuborish xizmatlari
- rasm va video qayta ishlash
- notification tizimlari
- analytics hisoblash
- payment tizimlari
- log processing
- katta hajmdagi data processing
Xulosa
Queue tizimlari zamonaviy backend arxitekturadagi eng muhim komponentlardan biridir. Ular og‘ir vazifalarni asosiy request jarayonidan ajratib, workerlar orqali fon rejimida bajarishga imkon beradi.
Natijada tizim tezroq ishlaydi, server resurslari samarali ishlatiladi va butun platforma oson scale qilinadi. Shu sababli bugungi kunda katta backend tizimlarning deyarli barchasida queue mexanizmi mavjud.