Ограничения запросов (англ. rate limits) — это механизмы, устанавливаемые сервисами API для контроля количества запросов, которые может выполнять определённый пользователь или приложение в течение определённого временного интервала
Discord использует rate limits для предотвращения чрезмерной нагрузки на свои серверы и обеспечения стабильности и доступности своего API.
Асинхронные библиотеки для Discord API, такие как discord.py (и его форки типа disnake или hikari), discord.js, Eris, и другие, имеют встроенные механизмы для обработки rate limits. Эти механизмы обычно работают следующим образом:
1. Отслеживание `rate limits`:
Библиотека отслеживает заголовки HTTP-ответов от Discord, которые содержат информацию о текущем состоянии ограничений запросов, такую как X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, и собственно Retry-After для времени ожидания перед отправкой нового запроса.
2. Кеширование и ожидание:
Когда бот наступает на порог rate limits, библиотека обычно кеширует дальнейшие запросы и автоматически вводит задержку, соответствующую времени, указанному в Retry-After, перед тем как снова выполнять запросы.
3. Повтор запросов:
После окончания задержки, библиотека пытается повторно отправить закешированные запросы. Процесс является асинхронным и не блокирует основной цикл выполнения бота.
4. Обработка ошибок:
Если бот превысил rate limits и Discord возвращает ошибку, библиотека обрабатывает её, информируя разработчика, и, если это возможно, пытается повторить запрос позже.
Пример кода, демонстрирующего, как асинхронная библиотека disnake может автоматически обрабатывать rate limits:
import disnake
from disnake.ext import commands
bot = commands.Bot(command_prefix='!')
@bot.command(name='spam')
async def spam_command(ctx, *, message: str):
for _ in range(10):
# Отправка сообщений в цикле может вызвать rate limits
await ctx.send(message)
# Если rate limits достигнут, библиотека автоматически введёт задержку
@bot.event
async def on_ready():
print(f'Logged in as {bot.user.name} ({bot.user.id})')
bot.run('YOUR_TOKEN')
В этом коде, если бот достигнет rate limits во время выполнения команды «!spam», библиотека disnake автоматически обработает ограничение, добавив задержку перед отправкой оставшихся сообщений. Разработчику не нужно беспокоиться о ручной обработке rate limits, поскольку это уже входит в функционал библиотеки.