Новий посібник, орієнтований на Laravel, показує розробникам, як запобігти таймаутам, дублюванню дій або збоям Telegram-ботів під навантаженням шляхом захисту вебхуків, використання Redis для ідемпотентності та перенесення важких завдань у черги.
Чому вебхукам Telegram потрібно більше, ніж просто звичайний маршрут
Telegram надсилає кожну взаємодію користувача з ботом як HTTP POST запит на вказану розробником URL-адресу. Платформа очікує відповідь 200 OK протягом кількох секунд; якщо відповідь затримується, вона повторює запит. Повторні запити означають, що той самий update_id може надійти кілька разів, і якщо бот записує дані в базу даних або викликає зовнішні API всередині запиту, це може призвести до створення дубльованих рядків, повторних повідомлень або станів гонитви (race conditions). Для ботів, які обробляють десятки або сотні повідомлень на секунду, така затримка швидко стає критичною перешкодою.
1. Захистіть ендпоінт за допомогою секретного заголовка
Telegram додає заголовок X-Telegram-Bot-Api-Secret-Token до кожного виклику вебхука. Порівняйте цей заголовок із секретним ключем, збереженим на сервері — використовуючи функцію PHP hash_equals, щоб уникнути атак за часом (timing attacks), — і відхиляйте будь-який запит, що не походить від Telegram. У Laravel розмістіть цю перевірку в middleware, щоб верифікація відбувалася до того, як контролер почне обробляти корисне навантаження (payload).
2. Зробіть кожне оновлення ідемпотентним за допомогою Redis
Кожне вхідне навантаження містить унікальний update_id. Посібник пропонує записувати цей ID у Redis із прапорцем NX (set-if-not-exists). Операція успішна лише для першого випадку; при повторному запиті ключ уже буде присутнім, і вебхук зможе негайно повернути 200 OK, сигналізуючи Telegram, що оновлення оброблено. Оскільки Redis працює в оперативній пам'яті, перевірка майже не додає затримки, а ключ залишається для виявлення дублікатів.
3. Передайте важку роботу фоновим завданням
Навіть із швидкою перевіркою в Redis, бізнес-логіка бота — запис у базу даних, виклики сторонніх API, формування повідомлень — ніколи не повинна виконуватися всередині запиту вебхука. Відправляйте чергу завдань Laravel (queued job), як тільки вебхук буде верифіковано, а update_id збережено. Негайно надсилайте HTTP-відповідь, дозволяючи воркеру (worker) обробляти завдання у власному темпі. Це дозволить боту вкластися в ліміт часу відповіді Telegram і зупинить повторні спроби платформи.
Покращення для продакшну
- Дотримуйтесь лімітів запитів. Telegram повертає помилку 429 Too Many Requests із заголовком
Retry-After, коли бот перевищує свої ліміти запитів на секунду. Воркери черги повинні зчитувати цей заголовок і робити паузу перед повторною спробою виконання невдалого завдання. - Зберігайте дані перед відповіддю. Спочатку записуйте будь-які дані користувача в базу даних; лише після успішного коміту (commit) бот має надсилати підтверджувальне повідомлення. Такий порядок дозволяє уникнути ситуацій, коли повідомлення доходить до користувача, але відповідний запис у базі так і не з'являється.
- Обмежуйте розмір корисного навантаження callback. Telegram обмежує
callback_dataдо 64 байтів. Зберігайте великі об'єкти в базі даних і передавайте в навантаженні кнопки лише ідентифікатор посилання (reference ID), щоб не перевищувати ліміт.
Підсумок: Автентифікація запиту, дедуплікація за допомогою Redis та перенесення роботи в черги дозволяють розробникам Laravel створювати Telegram-ботів, які відповідають миттєво, дотримуються лімітів запитів і легко масштабуються зі зростанням попиту користувачів.
