Масштабування IV: дотримання лімітів
Telegram обмежує кількість повідомлень, які ваш бот може надсилати щосекунди. Це означає, що будь-який запит до API, який ви виконуєте, може призвести до помилки з кодом статусу 429 (Too Many Requests - Забагато запитів) і заголовком retry
, як зазначено тут. Це може статися в будь-який момент.
Існує лише один правильний спосіб впоратися з такими ситуаціями:
- Зачекайте вказану кількість секунд.
- Повторіть запит.
На щастя, для цього існує плагін.
Цей плагін дуже простий. Він буквально просто чекає й повторює спроби. Однак його використання має серйозні наслідки: будь-який запит може сповільнюватися. Коли ви запускаєте свого бота на вебхуках, це означає, що технічно ви повинні використовувати чергу незалежно від того, що ви робите, або що вам потрібно налаштувати плагін auto
так, щоб він ніколи не займав багато часу, але тоді ваш бот може пропустити виконання деяких запитів.
Які саме ліміти існують
Вони не визначені.
Змиріться з цим.
У нас є кілька хороших ідей щодо того, скільки запитів ви можете виконати, але точні цифри невідомі. Якщо хтось скаже вам реальні ліміти, він не дуже добре обізнаний. Ліміти - це не просто жорсткі пороги, які ви можете дізнатися, експериментуючи з Bot API. Це скоріше гнучкі обмеження, які змінюються залежно від точного корисного навантаження запитів вашого бота, кількості користувачів та інших факторів, не всі з яких відомі.
Ось кілька хибних уявлень і помилкових припущень про ліміти:
- Мій бот занадто новий, щоб отримувати помилки перевищування кількості запитів.
- Мій бот не отримує достатньо трафіку, щоб отримувати помилки перевищування кількості запитів.
- Ця функція мого бота використовується недостатньо, щоб отримувати помилки перевищування кількості запитів.
- Мій бот залишає достатньо часу між викликами API, щоб не отримувати помилок перевищування кількості запитів.
- Цей конкретний виклик методу не може отримувати помилки перевищування кількості запитів.
get
не може отримувати помилки перевищування кількості запитів.Me get
не може отримувати помилки перевищування кількості запитів.Updates
Все це неправильно.
Давайте перейдемо до того, що ми дійсно знаємо.
Безпечні припущення щодо лімітів
З частих питаннь про ботів ми знаємо кілька лімітів, які не можна перевищувати ніколи.
“Під час надсилання повідомлень у певному чаті уникайте надсилання більше одного повідомлення на секунду. Ми можемо дозволити короткі серії, які перевищують цей ліміт, але зрештою ви почнете отримувати помилку з кодом 429.”
Це має бути досить зрозуміло. Плагін
auto
впорається з цим за вас.-retry “Якщо ви надсилаєте масові сповіщення кільком користувачам, API не дозволить більше 30 повідомлень в секунду або близько того. Для досягнення найкращого результату розгляньте можливість розподілення сповіщень на великі інтервали у 8-12 годин.”
Це стосується лише масових сповіщень, тобто якщо ви активно надсилаєте повідомлення багатьом користувачам. Якщо ви просто відповідаєте на повідомлення від користувачів, то не проблема надсилати 1000 і більше повідомлень на секунду.
Коли в частих питаннях про ботів сказано, що вам слід “розглянути можливість розподілення сповіщень на великі інтервали часу”, це не означає, що вам слід додавати будь-які штучні затримки. Натомість, головна ідея полягає в тому, що надсилання масових сповіщень - це процес, який займе багато годин. Ви не можете розраховувати на миттєве надсилання повідомлень усім користувачам одночасно.
“Також зверніть увагу, що ваш бот не зможе надсилати більше 20 повідомлень на хвилину в одну групу.”
Знову ж таки, досить зрозуміло. Абсолютно не повʼязано з масовими повідомленнями або з тим, скільки повідомлень надсилається в групі. І знову ж таки, плагін
auto
подбає про це за вас.-retry
Існує кілька інших відомих обмежень, які були виявлені поза офіційною документацією Bot API. Наприклад, відомо, що боти можуть редагувати до 20 повідомлень на хвилину в груповому чаті. Однак це виняток, і ми також повинні припустити, що ці обмеження можуть бути змінені в майбутньому. Тож ця інформація не впливає на те, як запрограмувати вашого бота.
Зокрема, не варто обмежувати швидкість роботи бота на основі цих даних:
Обмеження запитів
Дехто вважає, що впиратися в ліміти - це погано. Вони вважають за краще знати точні ліміти, щоб пригальмувати свого бота.
Це неправильно. Ліміти - це інструмент, корисний для боротьби з надмірною кількістю запитів, і якщо ви діятимете відповідно, вони не матимуть жодного негативного впливу на вашого бота. Тобто перевищення лімітів не призводить до банів. А от ігнорування - призводить.
Більше того, згідно з Telegram, знати точні ліміти “марно і шкідливо”.
Марно, тому що навіть якби ви знали ліміти, вам все одно довелося б обробляти помилки перевищування кількості запитів. Наприклад, сервер Bot API повертає 429, коли вимикається, щоб перезавантажитися під час технічного обслуговування.
Це шкідливо, тому що якщо ви будете штучно затримувати деякі запити, щоб уникнути перевищення лімітів, продуктивність вашого бота буде далека від оптимальної. Ось чому ви завжди повинні робити запити якомога швидше, але з повагою ставитися до всіх помилок перевищування кількості запитів, використовуючи плагін auto
.
Але якщо погано обмежувати запити, то як можна робити трансляцію повідомлень?
Як транслювати повідомлення
Трансляцію можна здійснювати, дотримуючись дуже простого підходу.
- Надішліть повідомлення користувачеві.
- Якщо ви отримали 429, зачекайте і спробуйте ще раз.
- Повторіть спробу.
Не додавайте штучних затримок. Вони роблять трансляцію повідомлень повільнішою.
Не ігноруйте 429 помилку. Це може призвести до бану.
Не відправляйте багато повідомлень паралельно. Ви можете надсилати дуже мало повідомлень паралельно (можливо 3 або близько того), але це може бути складно реалізувати.
2-й крок у наведеному вище списку виконується автоматично плагіном auto
, тому код виглядатиме так:
bot.api.config.use(autoRetry());
for (const [chatId, text] of broadcast) {
await bot.api.sendMessage(chatId, text);
}
2
3
4
Найцікавіше тут - це те, чим буде broadcast
(трансляція). Вам потрібно, щоб всі ваші чати зберігалися в якійсь базі даних, і ви мали можливість повільно їх отримувати.
Наразі вам доведеться реалізувати цю логіку самостійно. В майбутньому ми хочемо створити плагін для трансляції повідомлень. Ми будемо раді прийняти ваші внески! Приєднуйтесь до нас тут.
Чи можу я заплатити для підвищення лімітів?
Так.
Цей розділ стосується лише тих ботів, на балансі яких є щонайменше 10 000 зірок Telegram.
Коли ви транслюєте багато повідомлень, ви створюєте велике навантаження на інфраструктуру Telegram. Отже, якщо ви хочете, щоб Telegram збільшив ліміти, вам потрібно компенсувати їм трафік, який ви генеруєте. Скоріш за все, вам також доведеться трохи доплатити.
Платні трансляції дозволяють використовувати ваш баланс зірок Telegram для збільшення лімітів вашого бота. Після цього ви зможете надсилати до 1000 повідомлень на секунду.
- Увімкніть Платні трансляції за допомогою @Bot
Father . - Ви можете використовувати той самий код, що і для звичайних трансляцій. Зрештою, ви все одно повинні дотримуватися лімітів, навіть якщо вони тепер набагато вищі. Однак вам потрібно виконувати кілька викликів API одночасно для набагато більшої пропускної здатності.
- Вкажіть
allow
у кожному виклику API._paid _broadcast
Другий крок передбачає використання черги, яка дозволить вам виконувати завдання з певним ступенем паралелізму. Якщо ви використовуватимете замало паралелізму, ваша пропускна здатність буде нижчою за 1000 повідомлень на секунду. Якщо ви використовуватимете занадто багато, ви натрапите на обмеження швидкості швидше, ніж це необхідно. Крім того, якщо у вас багато одночасних викликів send
, і один з них отримує код відповіді 429, то всі інші вихідні запити фактично ігноруватимуть цей ліміт швидкості. Як наслідок, Telegram застосує до вас ще триваліший період cooldown’у.
Правильну кількість одночасних викликів можна визначити, подивившись на середній час, який займає надсилання повідомлення. Наприклад, якщо це середнє значення дорівнює 57 мілісекунд, вам слід прагнути до виконання 57 одночасних викликів send
.