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-polling | Webhook | |
|---|---|---|
| Инфра | Любая | Public HTTPS |
| Задержка | 1-2 секунды | менее 100мс |
| Горизонтальное масштабирование | Нет | Да |
| Сложность разработки | Низкая | Средняя (нужен туннель локально) |
| Прод-готовность | OK для small | Recommended |
Переключение
Webhook и long-polling взаимоисключающие. Если webhook установлен — getUpdates вернёт ошибку. Чтобы переключиться:
curl https://api.telefon.chat/bot<TOKEN>/deleteWebhook
После этого можно использовать getUpdates.