Лимиты запросов в телеграм-ботах или почему бот может падать на четырех пользователях
Привет-привет! Меня зовут Оля, и я программист учебного центра компании «Тензор».
В декабре 23-го мне поступила творческая задача разработать телеграм-бот для проведения новогоднего марафона-тренинга по личностному росту.
Получив первый вариант технического задания, помчала делать.
Задачи бота
Собирать данные о состоянии участника марафона по четырем характеристикам и сохранять их в БД ежедневно в 6.00.
Высылать задание в 08.00.
Присылать «сказку на ночь» — видео- или аудиосообщение с тематическим напутствием в 21.00.
Все задания должны приходить согласно часовому поясу пользователя.
Не буду рассказывать о процессе регистрации в BotFather, получении токена и написании скрипта с логикой. Об этом уже написано множество статей в интернете. Вместо этого я поделюсь проблемой, с которой столкнулась.
Отъезжаем под нагрузкой в четыре пользователя
Проверив работу основных действий (бот высылает сообщения по расписанию дня, реагирует на действия пользователя, сохраняет нужные данные), на радостях отдала бота на тестирование коллегам. У нас ожидалось около 1 000 пользователей, поэтому следовало проверить поведение бота под нагрузкой. Через 5 минут тестирования всего четырьмя пользователями бот выдал ошибку 429 (Too Many Requests).
Удивлению моему не было предела. Я знала, что на отправку сообщений Bot API есть лимиты.
Нельзя отправлять конкретному пользователю сообщения чаще чем раз в секунду и не более 30 сообщений в секунду при массовой рассылке разным пользователям.
Поскольку в моей тестовой группе не было Флэша, четыре человека физически не могли получить такую ошибку. Однако получили.
Попыталась устранить ошибку так:
настроила очередь отправки сообщений, чтобы точно соответствовать лимитам;
уменьшила размер анимаций;
высылала отдельно гиф и текст.
Итог: не помогло.
Пошла гуглить дальше. Нашла, что лимиты на конкретные вызовы API могут быть разные. Собственно, у меня уже были подозрения насчет этого, потому что отправка простых сообщений без вложений проходила без ошибок.
В интернетах по этому вопросу ничего не обнаружила и стала выяснить всё самостоятельно.
Готовьтесь, сейчас, наконец-то, будет мясо моей статьи.
Опытным путем были найдены ограничения по основным вызовам
Метод | кол-во вызовов | период без ошибок |
send_message | 60 | 15 сек |
send_animation | 10 | 5 мин |
send_photo | 60 | 15 сек |
send_video | 35 | 60 сек |
send_audio | 40 | 60 сек |
edit_message_text no btn | 140 | 40 сек |
edit_message_text with btn | 100 | 30 сек |
edit_message_reply_markup | 100 | 30 сек |
Оказалось, что все проблемы были из-за отправки анимации (в нашем случае любого размера от 10 до 1500 кб). Без ошибок бот может выполнить только 10 вызовов send_animation за 5 минут. На 11-й вызов бот выдает ошибку. Именно на это действие такое жесткое ограничение. Сначала я подумала, что отправляю слишком тяжелые файлы, но и анимация на 10 кб приводила к ошибке.
Для решения проблемы пришлось поменять «send_animation» на «send_video», и — о, чудо! — всё заработало.
Дорогие писатели документации Bot API, если вы читаете это, добавьте информацию про лимиты, а пока они не добавили, ребята, вот вам мои ограничения.
Спасибо за прочтение, успеха вашим ботам.