Celery yoki Redis Queue (RQ): Python-da Qaysi Biri Afzal?
Muallif: Javohir Abdullayev · · Python

Python Loyihalarida Fon Vazifalari Nega Kerak?
Zamonaviy veb-ilovalarda har bir millisekund muhim ahamiyatga ega. Foydalanuvchi ro'yxatdan o'tganda tasdiqlash xatini yuborish, og'ir PDF hisobotlarni generatsiya qilish yoki tashqi to'lov tizimi API-lariga so'rov yuborish kabi amallar sinxron tarzda bajarilsa, foydalanuvchi bir necha soniya kutib qoladi. Natijada ilova sekin ishlaydi va foydalanuvchi tajribasi (UX) yomonlashadi.
Ushbu muammoni hal qilish uchun fon vazifalari (background tasks / background workers) ishlatiladi. Asosiy veb-server (masalan, Django yoki FastAPI) so'rovni qabul qiladi, og'ir vazifani navbatga (message broker) tashlaydi va darhol foydalanuvchiga muvaffaqiyatli javob qaytaradi. Orqa fonda esa alohida worker jarayonlari vazifani navbatdan olib bajaradi.
Python ekotizimida fon vazifalarini boshqarish uchun eng mashhur ikki yondashuv mavjud: Celery va Redis Queue (RQ). Ushbu maqolada har ikki vositaning afzalliklari, kamchiliklari va qaysi vaziyatda qaysi birini tanlash kerakligini tahlil qilamiz.
Celery: Sanoat Standarti va Kuchli Gigant
Celery — Python olamidagi eng qadimiy, keng tarqalgan va funksional jihatdan eng boy fon vazifalar menejeri hisoblanadi. U o'n yildan ortiq vaqt davomida katta korporativ tizimlarda muvaffaqiyatli sinovdan o'tgan.
Celery-ning Asosiy Afzalliklari:
- Ko'p qirrali brokerlar: Celery nafaqat Redis, balki RabbitMQ, Amazon SQS kabi mustahkam xabar navbatlari bilan mukammal ishlaydi.
- Keng imkoniyatlar (Workflows): Murakkab vazifalar zanjirlarini (chains, groups, chords) tuzish imkoniyati mavjud. Masalan, uchta vazifa parallel bajarilib, ularning natijasi to'rtinchi vazifaga argument sifatida berilishi mumkin.
- Rejalashtirilgan vazifalar (Cron): Celery Beat moduli orqali belgilangan vaqtda ishga tushadigan davriy vazifalarni server darajasidagi cron-ga tayanmasdan oson boshqarish mumkin.
- Katta jamoa va hujjatlar: Deyarli barcha mashhur kutubxonalar va Django kabi freymvorklar bilan tayyor integratsiyalarga ega.
Celery-ning Kamchiliklari:
- Murakkab konfiguratsiya: Sozlamalari juda ko'p. Noto'g'ri sozlangan prefetch yoki acknowledgment mexanizmlari xotira to'lib ketishiga olib kelishi mumkin.
- Og'ir arxitektura: Kichik loyihalar uchun Celery infratuzilmasi ortiqcha (overkill) bo'lishi mumkin.
Redis Queue (RQ): Yengil, Sodda va Chaqqon
RQ (Redis Queue) — faqatgina Redis asosida ishlaydigan, soddalik va tushunarlilikka e'tibor qaratgan yengil vaznli Python kutubxonasidir. Agar sizga Celery-ning 90% murakkab funksiyalari kerak bo'lmasa, RQ eng ajoyib muqobil hisoblanadi.
RQ-ning Asosiy Afzalliklari:
- Minimal konfiguratsiya: RQ-ni o'rnatish va birinchi vazifani ishga tushirish uchun 5 qatordan kamroq kod kifoya qiladi.
- Tushunarli arxitektura: Barcha vazifalar va navbatlar to'g'ridan-to'g'ri Redis ma'lumotlar tuzilmalarida saqlanadi. Debug qilish juda oson.
- Kichik hajm: Resurslarni kam talab qiladi va kichik xotirali arzon VPS serverlarda ham barqaror ishlaydi.
- RQ Dashboard: Qulay va sodda veb-interfeys orqali navbatlar, xatolar va bajarilgan vazifalarni monitoring qilish imkoniyati mavjud.
RQ-ning Kamchiliklari:
- Faqat Redis bilan cheklangan: RabbitMQ yoki boshqa brokerlarni qo'llab-quvvatlamaydi.
- Cheklangan rejalashtiruvchi: Davriy vazifalar uchun qo'shimcha paketlar (masalan,
rq-scheduler) talab etiladi. - Murakkab zanjirlarning yo'qligi: Juda murakkab parallel hisob-kitoblar va vazifalar bog'liqliklari uchun mos emas.
Amaliy Kod Namunasi: RQ va Celery Taqqoslovi
Keling, har ikki vositada oddiy elektron xat yuborish vazifasini qanday yozilishini ko'rib chiqamiz.
RQ Misoli:
from redis import Redis
from rq import Queue
q = Queue(connection=Redis())
def send_email_task(user_email):
# Xat yuborish mantig'i
print(f"{user_email} manziliga xat yuborildi!")
# Vazifani navbatga qo'shish
job = q.enqueue(send_email_task, 'user@pycoder.uz')Celery Misoli:
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def send_email_task(user_email):
# Xat yuborish mantig'i
print(f"{user_email} manziliga xat yuborildi!")
# Vazifani navbatga qo'shish
send_email_task.delay('user@pycoder.uz')Har ikkala misolda ham chaqirish jarayoni oddiy ko'rinadi, biroq Celery-da production sozlamalari (result backend, task routing, concurrency limits) ancha ko'proq e'tibor talab qiladi.
Qaysi Birini Tanlash Kerak?
Loyihangiz uchun to'g'ri vositani tanlashda quyidagi tavsiyalarga amal qiling:
- RQ tanlang, agar:
- Loyihangiz kichik yoki o'rta hajmda bo'lsa (startaplar, Telegram botlar, kichik API xizmatlar);
- Loyihangiz allaqachon Redis-dan kesh yoki sessiya uchun foydalanayotgan bo'lsa;
- Ortiqcha konfiguratsiyalarsiz, 15 daqiqada fon vazifalarini ishga tushirmoqchi bo'lsangiz;
- Jamoangiz Celery-ning murakkab parametrlarini o'rganishga vaqt sarflamoqchi bo'lmasa.
- Celery tanlang, agar:
- Katta hajmdagi korporativ ilova yoki mikroxizmatlar arxitekturasini qursangiz;
- Xabarlar yo'qolmasligi uchun RabbitMQ kabi kafolatlangan AMQP broker kerak bo'lsa;
- Murakkab vazifalar zanjiri (chains, chords, rate limiting) talab qilinsa;
- Ilovada o'nlab turli xil rejalashtirilgan davriy (cron) vazifalar mavjud bo'lsa.
Xulosa
Har ikkala vosita ham o'z vazifasini a'lo darajada bajaradi. Celery — har qanday og'ir yuklamaga chidamli shveysarcha pichoq bo'lsa, RQ — sodda vazifalarni tez va oson hal qiluvchi qulay skalpeldir. Yangi boshlanayotgan Telegram bot yoki Django/FastAPI MVP loyihasi uchun RQ ko'pincha eng to'g'ri va oqilona tanlov bo'ladi. Tizim kengayib, talablar murakkablashganda esa Celery-ga o'tish qiyin kechmaydi.
Teglar: #Python #Celery #Redis Queue #Backend Arxitektura