Перейти к основному содержимому

Long-polling vs Webhook

Два способа получать обновления — выбор зависит от инфраструктуры.

Long-polling (getUpdates)

Как работает: бот периодически вызывает getUpdates с параметром timeout. Сервер удерживает соединение до прихода нового обновления или таймаута, потом отдаёт массив.

curl 'https://api.telefon.chat/bot<TOKEN>/getUpdates?offset=0&timeout=30'

Параметр offset = последний обработанный update_id + 1.

Плюсы:

  • Нулевая инфраструктура — не нужен публичный IP/HTTPS.
  • Подходит для разработки на ноутбуке.
  • Не теряются обновления при рестарте бота — следующий getUpdates их заберёт.

Минусы:

  • Лишний трафик: бот периодически дёргает сервер даже если ничего нет.
  • Задержка на 1 RTT при отдаче.
  • Невозможно горизонтально масштабировать (один offset на бот).

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

Webhook

Как работает: бот регистрирует HTTPS URL через setWebhook. Сервер сам шлёт POST на этот URL при каждом обновлении.

curl -X POST https://api.telefon.chat/bot<TOKEN>/setWebhook \
-d 'url=https://your-server.com/webhook'

Плюсы:

  • Мгновенная доставка.
  • Нет лишнего трафика.
  • Можно ставить за load balancer.
  • Поддерживает secret_token для проверки источника.

Минусы:

  • Нужен публичный HTTPS домен с валидным сертификатом.
  • При рестарте бота нужно вернуть 200 за 60 сек, иначе — повтор.
  • Сложнее отлаживать (нужны туннели типа ngrok для localhost).

Когда выбирать: прод, высоконагруженный бот, нужны мгновенные ответы.

Сравнение

Long-pollingWebhook
ИнфраЛюбаяPublic HTTPS
Задержка1-2 секундыменее 100мс
Горизонтальное масштабированиеНетДа
Сложность разработкиНизкаяСредняя (нужен туннель локально)
Прод-готовностьOK для smallRecommended

Переключение

Webhook и long-polling взаимоисключающие. Если webhook установлен — getUpdates вернёт ошибку. Чтобы переключиться:

curl https://api.telefon.chat/bot<TOKEN>/deleteWebhook

После этого можно использовать getUpdates.