Приоритеты и очереди
Пакет поддерживает асинхронную отправку сообщений через очереди Laravel с системой приоритетов, что обеспечивает быструю обработку ответов на входящие обновления.
Режимы работы
Заголовок раздела «Режимы работы»Sync режим (по умолчанию)
Заголовок раздела «Sync режим (по умолчанию)»В sync режиме все запросы отправляются синхронно:
TELEGRAM_QUEUE_ENABLED=falseЗапросы выполняются сразу, но без rate limiting. Подходит для разработки и небольших проектов.
Queue режим
Заголовок раздела «Queue режим»В queue режиме запросы ставятся в очереди:
TELEGRAM_QUEUE_ENABLED=trueДля работы очередей нужно запустить воркеры:
# Обработка всех очередейphp artisan queue:work --queue=telegram-high,telegram-low
# Или отдельно по приоритетамphp artisan queue:work --queue=telegram-highphp artisan queue:work --queue=telegram-lowПриоритеты
Заголовок раздела «Приоритеты»Пакет использует два уровня приоритета:
HIGH (по умолчанию)
Заголовок раздела «HIGH (по умолчанию)»- Ответы на входящие обновления
- Критичные сообщения
- По умолчанию все запросы имеют этот приоритет
use HybridGram\Telegram\Priority;
// Явное указание (не обязательно, это по умолчанию)$telegram->withPriority(Priority::HIGH) ->sendMessage($chatId, 'Быстрый ответ');- Рассылки
- Фоновые задачи
- Не критичные сообщения
$telegram->withPriority(Priority::LOW) ->sendMessage($chatId, 'Рассылка');Конфигурация
Заголовок раздела «Конфигурация»В файле config/hybridgram.php:
'sending' => [ 'queue_enabled' => env('TELEGRAM_QUEUE_ENABLED', false),
// Лимит запросов в минуту на бота (по умолчанию 1800 ≈ 30/сек) 'rate_limit_per_minute' => env('TELEGRAM_RATE_LIMIT_PER_MINUTE', 1800),
// Резерв слотов для HIGH приоритета 'reserve_high_per_minute' => env('TELEGRAM_RESERVE_HIGH_PER_MINUTE', 300),
// Имена очередей 'queues' => [ 'high' => env('TELEGRAM_QUEUE_HIGH', 'telegram-high'), 'low' => env('TELEGRAM_QUEUE_LOW', 'telegram-low'), ],],Резерв для HIGH приоритета
Заголовок раздела «Резерв для HIGH приоритета»Параметр reserve_high_per_minute гарантирует, что определенное количество слотов всегда доступно для HIGH приоритета. LOW приоритет не может использовать эти слоты.
Пример:
rate_limit_per_minute = 1800reserve_high_per_minute = 300
Это означает:
- До 1800 запросов в минуту
- Минимум 300 слотов всегда доступны для HIGH
- LOW может использовать до 1500 слотов в минуту
Использование
Заголовок раздела «Использование»В обработчиках роутов
Заголовок раздела «В обработчиках роутов»В обработчиках роутов автоматически используется HIGH приоритет:
TelegramRouter::onCommand('/start', function(CommandData $data) { $telegram = app(TelegramBotApi::class);
// Автоматически HIGH приоритет $telegram->sendMessage($data->getChat()->id, 'Привет!');});Для рассылок
Заголовок раздела «Для рассылок»Явно указывайте LOW приоритет для рассылок:
// Рассылка всем пользователям$users = User::all();
foreach ($users as $user) { $telegram->withPriority(Priority::LOW) ->sendMessage($user->telegram_id, 'Новость!');}Смешанное использование
Заголовок раздела «Смешанное использование»use HybridGram\Core\Routing\RouteData\TextMessageData;
TelegramRouter::onTextMessage(function(TextMessageData $data) { $telegram = app(TelegramBotApi::class);
// Высокоприоритетный ответ $telegram->sendMessage( $data->getChat()->id, 'Ваше сообщение получено!' );
// Низкоприоритетная задача (например, логирование) $telegram->withPriority(Priority::LOW) ->sendMessage( config('telegram.admin_chat_id'), "Новое сообщение от {$data->getUser()->id}" );});Запуск воркеров
Заголовок раздела «Запуск воркеров»Базовый запуск
Заголовок раздела «Базовый запуск»php artisan queue:work --queue=telegram-high,telegram-lowС настройками
Заголовок раздела «С настройками»php artisan queue:work \ --queue=telegram-high,telegram-low \ --tries=3 \ --timeout=60 \ --max-jobs=1000 \ --max-time=3600Использование Supervisor (рекомендуется)
Заголовок раздела «Использование Supervisor (рекомендуется)»Создайте конфигурацию /etc/supervisor/conf.d/telegram-worker.conf:
[program:telegram-worker]process_name=%(program_name)s_%(process_num)02dcommand=php /path/to/artisan queue:work --queue=telegram-high,telegram-low --sleep=3 --tries=3 --max-time=3600autostart=trueautorestart=truestopasgroup=truekillasgroup=trueuser=www-datanumprocs=2redirect_stderr=truestdout_logfile=/path/to/storage/logs/worker.logstopwaitsecs=3600Затем:
sudo supervisorctl rereadsudo supervisorctl updatesudo supervisorctl start telegram-worker:*Rate Limiting в Queue режиме
Заголовок раздела «Rate Limiting в Queue режиме»В queue режиме rate limiting применяется на воркерах:
- Job попадает в очередь
- Воркер берет job из очереди
- Проверяется rate limit
- Если лимит превышен, job возвращается в очередь (
release()) - Воркер не блокируется
sleep()-ом, может обрабатывать другие jobs
Это обеспечивает:
- Не блокирующую обработку
- Эффективное использование ресурсов
- Соблюдение лимитов Telegram
Мониторинг очередей
Заголовок раздела «Мониторинг очередей»Проверка размера очередей
Заголовок раздела «Проверка размера очередей»use Illuminate\Support\Facades\Queue;
$highQueueSize = Queue::size('telegram-high');$lowQueueSize = Queue::size('telegram-low');Мониторинг через Laravel Horizon
Заголовок раздела «Мониторинг через Laravel Horizon»Если используете Laravel Horizon:
php artisan horizonВ веб-интерфейсе будут видны очереди telegram-high и telegram-low.
Важные замечания
Заголовок раздела «Важные замечания»-
InputFile с resource не поддерживаются в queue режиме. Используйте пути к файлам или base64.
-
Служебные методы (getUpdates, setWebhook, getMe) всегда выполняются синхронно.
-
Приоритет по умолчанию: В обработчиках роутов автоматически используется HIGH.
-
Fallback: Если queue не настроена, запросы выполняются синхронно.
Что дальше?
Заголовок раздела «Что дальше?»- Rate Limiting — детали работы rate limiting
- Режимы работы — настройка webhook и polling