🐢 Троттлинг¶
Ограничивайте частоту хендлеров, чтобы пользователи не заваливали бота. В Raito есть глобальный лимит, лимиты на отдельный хендлер и три режима области действия.
Глобальный троттлинг¶
add_throttling() ставит один лимит на все сообщения и колбэк-запросы:
raito = Raito(dispatcher, "handlers")
raito.add_throttling(1.2, mode="user")
Теперь один и тот же пользователь может вызывать любой хендлер не чаще раза в 1,2 секунды. Режим по умолчанию "chat".
Лимиты на хендлер¶
Для конкретного хендлера примените @rt.limiter:
from aiogram import filters, types
from raito import rt
@router.message(filters.Command("export"))
@rt.limiter(rate_limit=5.0, mode="user")
async def export(message: types.Message) -> None:
...
Его режим по умолчанию "user". Хендлер с @rt.limiter использует только собственный лимит и обходит глобальный, поэтому одну тяжёлую команду можно сделать строже (или мягче) остальных, не трогая общее правило.
Режимы¶
Режим |
Кулдаун общий для… |
|---|---|
|
одного пользователя (во всех чатах). |
|
одного чата (кулдаун общий для всех участников). |
|
всех сразу: единый глобальный кулдаун на всего бота. |
Поведение и ограничения¶
Заглушённый апдейт молча отбрасывается: хендлер не вызывается, а пользователь не получает ошибки. Держите лимиты достаточно короткими, чтобы это не выглядело поломкой.
Лимиты держатся на
cachetools.TTLCache;add_throttlingпринимаетmax_size(по умолчанию10_000), ограничивая число отслеживаемых ключей.Лимит на хендлер запоминается по его идентичности, поэтому частота фиксируется при первом использовании: смена
rate_limitдля того же хендлера на лету вступит в силу только после перезапуска.