Skip to content

Rate Limiting

Telegram Bot API имеет лимит ~30 запросов в секунду на бота. Пакет автоматически управляет этими лимитами с помощью системы rate limiting.

В sync режиме rate limiting не применяется. Все запросы отправляются сразу. Это подходит для разработки, но может привести к ошибкам 429 (Too Many Requests) в production.

В queue режиме rate limiting применяется на воркерах:

  1. Проверяется текущий лимит для бота
  2. Если есть свободные слоты — запрос отправляется
  3. Если лимит достигнут — job возвращается в очередь
  4. Воркер не блокируется, обрабатывает другие jobs
'sending' => [
// Лимит запросов в минуту на бота
'rate_limit_per_minute' => 1800, // ~30/сек
// Резерв для HIGH приоритета
'reserve_high_per_minute' => 300,
],

Rate limiting считается отдельно для каждого бота. Если у вас несколько ботов, каждый имеет свой лимит.

Используется скользящее окно 60 секунд через кеш. Это означает:

  • Лимит проверяется за последние 60 секунд
  • Старые запросы автоматически выходят из окна
  • Более точное соблюдение лимитов

Приоритеты и резервирование

Section titled “Приоритеты и резервирование”

Система резервирует слоты для HIGH приоритета:

'rate_limit_per_minute' => 1800,
'reserve_high_per_minute' => 300,

Это означает:

  • HIGH может использовать все 1800 слотов в минуту
  • LOW может использовать максимум 1500 слотов (1800 - 300)
  • Минимум 300 слотов всегда доступны для HIGH

Пример сценария:

  • 1500 LOW запросов в очереди
  • Приходит 400 HIGH запросов
  • LOW будут ждать, пока не обработаются HIGH
  • 300 HIGH слотов зарезервированы и всегда доступны
TELEGRAM_RATE_LIMIT_PER_MINUTE=1800
TELEGRAM_RESERVE_HIGH_PER_MINUTE=300

Рекомендуемые значения:

# Консервативный подход (меньше риск ошибок 429)
TELEGRAM_RATE_LIMIT_PER_MINUTE=1500
# Агрессивный подход (максимальное использование)
TELEGRAM_RATE_LIMIT_PER_MINUTE=1800

Если все же возникает ошибка 429, пакет логирует её:

// В логах будет:
// Telegram outgoing request failed
// error_code: 429
// description: Too Many Requests

В queue режиме job автоматически вернется в очередь и будет обработан позже.

Включите логирование ошибок в конфиге:

'sending' => [
'log_failures' => true,
'log_response_body' => true, // Включать тело ответа в логи
],

Rate limiter хранит данные в кеше Laravel. Вы можете проверить текущую нагрузку:

use Illuminate\Support\Facades\Cache;
// Ключи для проверки (пример)
$cacheKey = "telegram_rate_limit_{$botId}";
$data = Cache::get($cacheKey);

Настройка для разных сценариев

Section titled “Настройка для разных сценариев”

Высокая нагрузка (рассылки)

Section titled “Высокая нагрузка (рассылки)”
// Увеличить лимит, если уверены
'rate_limit_per_minute' => 1800,
'reserve_high_per_minute' => 500, // Больше резерва для ответов
// Консервативные значения
'rate_limit_per_minute' => 1200,
'reserve_high_per_minute' => 200,

Каждый бот имеет отдельный лимит, но учитывайте общую нагрузку на сервер.

Включение детального логирования

Section titled “Включение детального логирования”
'sending' => [
'log_failures' => true,
'log_response_body' => true,
],

Проверка размера очередей

Section titled “Проверка размера очередей”
use Illuminate\Support\Facades\Queue;
$highSize = Queue::size('telegram-high');
$lowSize = Queue::size('telegram-low');
logger()->info('Queue sizes', [
'high' => $highSize,
'low' => $lowSize,
]);
  1. Используйте queue режим в production для соблюдения лимитов

  2. Настройте мониторинг размера очередей и ошибок 429

  3. Используйте LOW приоритет для рассылок

  4. Резервируйте достаточно слотов для HIGH приоритета (ответы на входящие)

  5. Тестируйте лимиты перед production деплоем