Telegram botni yuqori yuklamaga qanday moslashtirish mumkin
Chuqur4 daqInnovialabs tahririyati
Qisqacha
Yangilanishlarni webhook orqali qabul qilib, darhol navbatga qo‘ying, ularni holati Redis da saqlanadigan stateless workerlar bilan qayta ishlang, update_id bo‘yicha takrorlardan himoyalaning, chiquvchi xabarlarni esa umumiy rate limiter orqali o‘tkazing.
Arxitektura bir xatboshida
Yuklama ostidagi bot — bitta jarayon emas, balki konveyer:
- Webhook qabul qiluvchi yangilanishni (update) oladi, maxfiy kalitni tekshiradi va navbatga qo‘yadi. Telegram ga javob darhol qaytadi.
- Vazifalar navbati (Redis Streams, RabbitMQ, Kafka, Celery, arq va h.k.) cho‘qqi yuklamalarni buferlaydi.
- O‘z holatiga ega bo‘lmagan workerlar yangilanishlarni qayta ishlaydi. Ularni kerakli miqdorda ishga tushirish mumkin.
- Redis FSM holatlari, kesh, bloklashlar va limit hisoblagichlarini saqlaydi.
- Jo‘natuvchi chiquvchi xabarlarni Telegram limitlarini hisobga olib yuboradi.
Nega long polling emas, webhook
Long polling (getUpdates) ni gorizontal masshtablab bo‘lmaydi: bir vaqtda faqat bitta iste’molchi yangilanishlarni olishi mumkin, ikkinchisi konflikt xatosini oladi. Yuqori yuklama uchun webhook kerak:
- Telegram yangilanishlarni o‘zi HTTPS manzilga yuboradi;
- balanslovchi ortida bir nechta qabul qiluvchi qo‘yish mumkin;
setWebhookdagimax_connectionsparametri Telegram dan keladigan parallel ulanishlar sonini cheklaydi;setWebhookdagisecret_tokenX-Telegram-Bot-Api-Secret-Tokensarlavhasini tekshirib, begona so‘rovlarni rad etish imkonini beradi.
Qabul qiluvchi tez javob berishi kerak. Agar ishlov berish so‘rov ichida bo‘lib, sekinlashsa, Telegram navbat to‘playdi va yetkazishni takrorlaydi, foydalanuvchilar esa kechikishni ko‘radi.
Chat ichidagi yangilanishlar tartibi
Parallel ishlov berish tartibni buzadi: foydalanuvchining ikkinchi xabari birinchisidan oldin qayta ishlanishi va FSM noto‘g‘ri holatga o‘tishi mumkin.
Yechimlar:
chat_idbo‘yicha partitsiyalash: bitta chatning yangilanishlari doim bitta partitsiya yoki navbatga tushadi va ketma-ket qayta ishlanadi;- ishlov berish vaqtida Redis da chat bo‘yicha bloklash;
- turli chatlar esa parallel qayta ishlanadi.
Idempotentlik
Yangilanish ikki marta kelishi mumkin: Telegram xato yoki taymautda yetkazishni takrorlaydi, navbat esa worker yiqilgandan keyin vazifani qaytaradi. Himoya:
# update_id ni qayta ishlangan deb belgilaymiz; kalit bir sutka yashaydi
is_new = await redis.set(f"upd:{update.update_id}", 1, nx=True, ex=86400)
if not is_new:
return # dubl, o‘tkazib yuboramiz
Ammo worker ishlov berish o‘rtasida yiqilsa, bu yetarli emas. Shuning uchun yon ta’sirlarni ham idempotent qiling:
- buyurtma yaratish — unikal kalit bilan (
update_idyokicallback_query.id); - balansdan yechish — operatsiya hali o‘tkazilmaganini tekshiradigan tranzaksiyada;
- xabar yuborish — qayta urinishdan oldin «allaqachon yuborilgan» yozuvi bilan.
Holat Redis da
Agar FSM jarayon xotirasida saqlansa, ikkinchi worker bu haqda bilmaydi. Barcha holatni tashqariga chiqaring:
- FSM va dialog ma’lumotlari — Redis da (aiogram da bu
RedisStorage), tashlab ketilgan dialoglar uchun TTL bilan; - uzoq muddatli ma’lumotlar (foydalanuvchilar, buyurtmalar) — asosiy bazada;
- ma’lumotnomalar keshi — har bir xabarda bazaga murojaat qilmaslik uchun Redis da.
Shunda istalgan worker istalgan yangilanishni qayta ishlay oladi, qayta ishga tushirish esa hech narsani yo‘qotmaydi.
Gorizontal masshtablash
- Qabul qiluvchilar va workerlar — stateless konteynerlar, navbat uzunligi yoki CPU bo‘yicha masshtablanadi.
- Turli vazifa turlari uchun alohida navbatlar: interaktiv (foydalanuvchilarga javoblar) va fon (rassilkalar, hisobotlar, fayllarni qayta ishlash). Rassilka javoblarni sekinlashtirmasligi kerak.
- Og‘ir operatsiyalar (PDF yaratish, sun’iy intellekt chaqiruvlari, media) — taymautli alohida worker pulida.
- Ko‘pincha botdan oldin ma’lumotlar bazasi tor joyga aylanadi: ulanishlar puli, indekslar, o‘qish uchun replikalar.
Chiquvchi xabarlarga Telegram limitlari
Telegram yuborish chastotasini cheklaydi. Rasmiy FAQ dagi mo‘ljallar: bitta chatga soniyasiga bittadan ko‘p bo‘lmagan xabar, guruhga daqiqasiga 20 tadan ko‘p bo‘lmagan xabar va ommaviy rassilkada soniyasiga taxminan 30 ta xabar. Limitlar o‘zgarishi mumkin, shuning uchun hujjatlarni tekshirib turing.
Amalda nima qilish kerak:
- Redis da umumiy rate limiter (token bucket) — workerlar ko‘p bo‘lganda har biridagi lokal hisoblagich ishlamaydi;
- bir vaqtda chat bo‘yicha va global limit;
429javobidaretry_afterni o‘qing va vazifani darhol takrorlamasdan, keyinga suring;- rassilkalarni progressni saqlaydigan navbat orqali yuriting, shunda nosozlikdan keyin boshidan emas, to‘xtagan joydan davom etasiz;
- juda katta rassilkalar uchun Telegram da Stars bilan to‘lanadigan
allow_paid_broadcastrejimi bor.
Kuzatuvchanlik
getWebhookInfo: kechikishlarda birinchi qaraladigan narsa —pending_update_countvalast_error_message.- Metrikalar: navbat uzunligi, ishlov berish vaqti, xatolar ulushi,
429javoblar soni. - Bitta yangilanishni butun tizim bo‘ylab kuzatish uchun
update_idvachat_idbilan loglar.