Что делать, если бот на Discord попадает в Rate Limited?

Какой оптимальный способ настроить количество шардов для своего бота Discord с учетом формулы КОЛИЧЕСТВО СЕРВЕРОВ / 1000 = КОЛИЧЕСТВО ШАРДОВ? У меня бот почти на 4000 серверах, и при попытке запустить его на 4-5 шардах возникает таймаут и ошибка Rate limited. Как правильно настроить количество шардов, чтобы избежать проблемы Rate limited?
  • 27 марта 2024 г. 21:19
Ответы на вопрос 2
При возникновении ошибки Rate Limited на Discord, рекомендуется следовать некоторым шагам для решения проблемы:

1. Проверьте, не превышен ли лимит запросов на серверы Discord. При превышении лимита возникает ошибка Rate Limited.

2. Попробуйте уменьшить количество запросов, которые отправляет бот на сервер Discord. Может быть, некоторые запросы не являются необходимыми и можно их убрать.

3. Увеличьте время ожидания между запросами. Это поможет снизить нагрузку на серверы Discord.

Что касается оптимального количества шардов для вашего бота Discord, то формула КОЛИЧЕСТВО СЕРВЕРОВ / 1000 = КОЛИЧЕСТВО ШАРДОВ является лишь рекомендацией, и иногда может потребоваться большее количество шардов для обработки большого количества серверов.

Если у вас бот почти на 4000 серверах, попробуйте увеличить количество шардов до 6-8 и посмотрите, как система будет работать. Может потребоваться провести некоторые тесты для определения оптимального количества шардов для вашего бота. Помните также, что при увеличении количества шардов следует учитывать нагрузку на серверы Discord и возможные ограничения, чтобы избежать ошибки Rate Limited.
Давайте по порядку. В документации дискорда очень четко прописаны лимиты для вебсокета и чуть менее четко для HTTP . Цитировать оттуда не буду, думаю там все понятно. 

В общем виде ошибка 429 говорит, что в один из двух лимитов вы не укладываетесь. Чтобы не происходила ошибка можно перед выполнением действий проверять блокировку через AutoShardedClient.is_ws_ratelimited , но это не лечение проблемы, а только обработка.
Для лечения нужно перехватывать ошибку в глобальном обработчике и по стеку вызовов смотреть на каком действии она происходит. Если приложите стектрейс к запросу, можно будет по нему сказать конкретнее. Только убедитесь чтобы логи не обрезались как у вас выше. Может быть и так было бы понятно, но эндпоинт https://discord.com/api/v10/channels/1215300998588... весь не видно. Учитывайте что она может и в разных когах происходить об этом ниже.

В целом дискорд не любит, когда боты делают что-либо без явных действий пользователя. Причем чем больше бот, тем строже, поскольку для них это больше нагрузки. К примеру в коде, который вы приложили есть обновление статуса каждые 10 секунд. Будем объективны, пользователям плевать что у бота в статусе, но эти запросы так же идут в общий рейт лимит. Я бы советовал поставить или большое значение (5-10 минут) или вообще избавиться от этой карусели.
Аналогично пройдите по остальному коду, который не приложен и посмотрите есть ли периодические запросы без явных команд: например обновления каких-нибудь сообщений по таймерам. Если есть увеличивайте таймеры в 2 раза (повторять до исправления) или подумайте как предоставлять функционал без этого.
Похожие вопросы