Если ваш бот сталкивается с ошибками ограничения скорости, не беспокойтесь — это распространенная проблема, которую можно решить с помощью правильного подхода. Эта статья поможет вам понять систему ограничения скорости Discord и предоставит практические решения.
Содержимое
Понимание типов ограничений скорости Discord
Глобальные ограничения скорости
Ограничения скорости по маршруту
Ограничения скорости для конкретных ресурсов
Недопустимые ограничения запросов
Как определить проблему с ограничением скорости
Лучшие практики для работы с ограничениями скорости
Глобальные ограничения скорости
Соображения по поводу шлюзов и шардинга
Понимание типов ограничений скорости Discord
Discord использует несколько типов ограничения скорости для защиты API. Определение типа проблемы, с которой вы столкнулись, имеет решающее значение для поиска правильного решения:
Глобальные ограничения скорости
Ограничение: 50 запросов в секунду для большинства конечных точек
Область действия: Применяется ко всему приложению
Идентификация: ищите X-RateLimit-Scope: global в заголовках ответа
Ограничения скорости по маршруту
Ограничение: зависит от конечной точки
Область действия: Относится к отдельным маршрутам API
Идентификация: ищите X-RateLimit-Scope: user
Ограничения скорости для конкретных ресурсов
Примечание: Ограничения по ресурсам могут быть достигнуты несколькими источниками (другими пользователями, ботами, веб-хуками и т. д.) и могут не означать, что ваше приложение несет за это полную ответственность.
Ограничение: Независимые ограничения для определенных гильдий, каналов или веб-хуков
Область действия: Применимо к действиям для определенных ресурсов.
Идентификация: ищите X-RateLimit-Scope: shared в заголовках ответа
Недопустимые ограничения запросов
Ограничение: 10 000 недействительных запросов за 10 минут
Общая причина: Необработанные ошибки (401, 403 или 429), вызывающие всплески запросов. Обратите внимание, что ошибки 429, возвращаемые с X-RateLimit-Scope: shared, не учитываются в лимите недействительных запросов
Результат: Временная блокировка Cloudflare
Как определить проблему с ограничением скорости
Наиболее надежный способ определить, какой лимит вы достигли, — это проверить заголовки HTTP-ответа при получении кода статуса 429. Ключевые заголовки для проверки:
X-RateLimit-Limit: верхний предел скорости для данной конечной точки
X-RateLimit-Remaining: количество запросов, оставшихся в текущем окне
X-RateLimit-Reset: Когда окно ограничения скорости сбрасывается (временная метка Unix)
X-RateLimit-Reset-After: количество секунд до сброса ограничения
X-RateLimit-Scope: Указывает тип ограничения скорости (глобальный, пользовательский или общий)
retry_after: время ожидания в миллисекундах перед повторным запросом
Лучшие практики для работы с ограничениями скорости
Применяйте правильные стратегии отката
Всегда соблюдайте значение retry_after в ответах об ограничении скорости. Это точно указывает, сколько времени нужно подождать перед повторной попыткой.
По возможности используйте взаимодействия
Команды приложения и компоненты сообщений являются отличной альтернативой командам с префиксом, что может предотвратить чрезмерное количество запросов API и сообщений в каналах.
Дополнительный совет: сделайте ответы на взаимодействие и последующие сообщения временными, поскольку они не учитываются при расчете ограничений по скорости.
Эффективно кэшируйте данные
Сократите количество вызовов API за счет кэширования часто используемых данных, таких как:
- Информация о гильдии
- Данные канала
- Профили пользователей
- Данные роли
Используйте ограничения запросов
Троттлинг — это проактивный подход к предотвращению превышения лимитов скорости, заключающийся в контроле темпа запросов до достижения лимита.
Например, если ваш бот должен отправить приветственные сообщения 200 новым участникам, вместо того, чтобы отправить все 200 сообщений сразу, поместите их в очередь, которая отправляет 4 запроса каждые 100 миллисекунд. Это позволяет поддерживать стабильную скорость в 40 запросов в секунду, оставаясь в пределах безопасного лимита в 50 запросов и обеспечивая отправку всех сообщений примерно за 5 секунд.
Глобальные ограничения скорости
Если вы достигли глобальных ограничений по скорости, в вашей программе может быть скрытая проблема, которую необходимо устранить.
Вот как оптимизировать код, чтобы не выходить за пределы допустимых значений:
- Реализация правильного кэширования
- Переход к функциям, основанным на взаимодействии
Если эти решения не помогают решить проблемы с глобальным ограничением скорости, мы рекомендуем вам обратиться на канал #api-help сервера Discord Developer или в службу поддержки разработчиков.
Соображения по поводу шлюзов и шардинга
Для ботов, обрабатывающих события в реальном времени через шлюз Discord (соединение websocket), шардинг становится необходимым по мере роста вашего бота.
Что такое Шардинг?
Шардинг разделяет вашего бота на несколько экземпляров, каждый из которых обрабатывает подмножество гильдий. Это распределяет нагрузку по нескольким соединениям WebSocket, помогая вам оставаться в пределах ограничений по скорости.
Рекомендуется начать планирование внедрения шардинга при приближении к 2000 гильдий, так как шардинг обязательно должен быть включен при 2500+ гильдиях. Для достижения оптимальной производительности следуйте рекомендуемой практике: поддерживайте примерно 1 шард на 1000 гильдий.
Помните, что ограничения скорости существуют для обеспечения стабильной работы всех пользователей Discord. Следуя этим рекомендациям, вы сможете создать бота, который будет эффективно масштабироваться, не превышая указанные ограничения.