Long Polling и Webhooks. Обработка событий в Telegram-ботах
В Telegram есть два метода, позволяющие ботам получать обновления от серверов: long polling и вебхуки. Рассмотрим, как они работают и какие у них преимущества и недостатки.
Разница между long polling и вебхуками заключается в механизме доставки событий от Telegram к приложению. При использовании long polling бот самостоятельно запрашивает обновления у сервера Telegram через определённые промежутки времени. В случае с вебхуками Telegram отправляет события на указанный URL.
Из-за этого процесс развёртывания и настройки окружения проходит по-разному. Long polling можно запустить практически где угодно, включая локальную среду. Для вебхуков же требуется публичный адрес и поддержка HTTPS.
**Как работает long polling**
Принцип работы long polling можно сравнить с посещением кафе, где вы спрашиваете о наличии любимого десерта. Если его нет, вы приходите на следующий день и снова спрашиваете. Когда десерт появляется, вам его подают.
Аналогично работает и long polling. Приложение регулярно отправляет запросы на сервер, чтобы узнать, появились ли новые обновления. Если их нет, сервер возвращает пустой ответ. Если сообщения есть, они возвращаются массивом (до 100 сообщений за один ответ).
После получения ответа бот отправляет новый запрос. Схема взаимодействия выглядит следующим образом:
* Бот спрашивает у Telegram, есть ли новые сообщения.
* Если их нет, сервер отвечает «нет».
* Процесс повторяется до тех пор, пока не появятся новые сообщения.
* Как только они появляются, сервер отправляет их боту.
У такого подхода есть недостатки. Бот получает новые сообщения только в момент запроса, то есть раз в несколько секунд. Чтобы получать их быстрее, можно отправлять запросы чаще, но это создаст ненужную нагрузку на систему и приведёт к бессмысленному трафику.
Существует и другой способ реализации — отправить запрос на сервер и ждать. Если новых обновлений нет, Telegram не будет закрывать соединение, а будет удерживать запрос открытым. Когда обновления приходят, сервер сразу отправляет их в ответе.
Важно отметить, что по умолчанию в Telegram API timeout равен 0. Если не задать таймаут явно положительным числом, будет реализован короткий поллинг без ожидания, и сервер не будет удерживать соединение открытым. В реальности соединение не будет висеть открытым часами, у таких запросов есть таймаут (обычно около...).