Задать вопрос

Кто-нибудь сталкивался с резким увеличением задержки при работе с Telegram API?

На одном сервере запросы идут нормально, а на другом периодически появляются таймауты. Где лучше искать причину — в маршрутизации, DNS или настройках самого клиента?
  • Вопрос задан
  • 437 просмотров
Подписаться 2 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    SMM-продвижение в Телеграме
    1 месяц
    Далее
  • Skillbox
    Профессия Интернет-маркетолог + ИИ
    12 месяцев
    Далее
  • GB (GeekBrains)
    Интернет-маркетолог
    12 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 4
opium
@opium
Просто люблю качественно работать
скорее не DNS и не клиент виноваты: похоже, провайдер того сервера подрезает трафик именно к подсетям Telegram (149.154.x.x, 91.108.x.x), DPI такое любит даже после официальной разблокировки. Сравни через mtr или curl -v --resolve на оба сервера — если маршрут и потери к одним и тем же IP разные, гипотеза подтверждается. Лечится сменой ДЦ или проксёй через нормальный аплинк.
Ответ написан
Комментировать
@brar
Причина в DPI в 99,(9) процентах случаев.
Искать что-то еще - смысла ноль. Просто поверьте.
Либо подстраиваться и постоянно быть готовым менять адреса и дц-ы (и это принципиально верный вариант), либо отказ.
Ответ написан
Комментировать
Slotly
@Slotly
Python, Telegram-боты записи, бэкенд для сайтов
Про DPI выше всё верно, добавлю то, что помогает выбрать лечение,
а не только поставить диагноз.

Смена ДЦ помогает не всегда, и это можно проверить заранее. Если режут
по IP-подсетям Telegram — да, другой аплинк спасёт. Если режут по SNI
на этапе TLS-хендшейка, переезд в другой ДЦ той же страны не даст
ничего: имя домена уходит в открытом виде и его видно везде одинаково.

Различить за минуту. Сначала адрес:

dig +short api.telegram.org

Потом два запроса — по домену и по IP с подменой Host, во втором имя
домена в открытом виде не передаётся:

curl -o /dev/null -s -w "dns:%{time_namelookup} conn:%{time_connect} tls:%{time_appconnect} total:%{time_total}\n" https://api.telegram.org/bot/getMe

curl -k -o /dev/null -s -w "%{http_code} %{time_total}\n" -H "Host: api.telegram.org" https:///bot/getMe

По IP летает, по домену висит — режут по имени, маршрут ни при чём
и менять ДЦ бесполезно. Висят оба — тогда да, IP и маршрут, версия
выше подтверждается.

Заодно смотрите, какая фаза растёт:
— большой time_connect — рвут на TCP
— нормальный time_connect при большом time_appconnect — убивают
TLS-хендшейк, это как раз про SNI
— первые две в норме, растёт только total — это уже обычная
перегрузка канала, и лечится совсем иначе

Теперь про клиент, раз вы про него спрашивали. Причина не в нём, но
именно его настройки решают, будет у вас «иногда подтормаживает» или
«бот встал».

Таймауты. В aiogram по умолчанию 60 секунд, и это очень много. Один
повисший запрос держит очередь, а когда соединение наконец отваливается,
всё накопленное вылетает разом. Симптом «бот молчал, потом ответил всем
сразу» — это почти всегда таймауты, а не сеть.

from aiogram import Bot
from aiogram.client.session.aiohttp import AiohttpSession
bot = Bot(token=TOKEN, session=AiohttpSession(timeout=20))
# у long polling таймаут задаётся отдельно:
# dp.start_polling(bot, polling_timeout=20)

Вебхук вместо long polling. Long polling держит одно долгое соединение,
а такие DPI рвёт охотнее всего. Вебхук — это короткие запросы, плюс при
неудаче Telegram повторяет доставку сам.

Ретраи с экспоненциальной паузой и случайным разбросом. Без разброса все
повторы придут одновременно и добьют то, что и так шатается.

Очередь исходящих в базе вместо «отправить и надеяться»: бот кладёт
сообщение со статусом, отдельный воркер разгребает. При обрыве сообщения
уходят позже, а не теряются. И свой ключ идемпотентности, иначе после
восстановления связи люди получат по три копии.

И залогируйте время каждого запроса с разбивкой по фазам. Ровная
задержка и рваная на глаз одинаковые, а чинятся по-разному.
Ответ написан
Комментировать
@ilya0890067
Я бы в первую очередь попробовал проверить именно маршрут. У меня в похожей ситуации задержка на одном сервере была заметно выше, хотя настройки клиента и DNS практически не отличались.

Для сравнения можно временно прогнать подключение через разные сервисы и посмотреть, меняется ли ситуация. Например, я бы проверил AdGuard VPN, hidemy name VPN и ZoogVPN(https://sites.google.com/view/vpnn3/topvpn3) - у них можно выбрать разные серверы и сравнить задержку.

Если через одно из подключений таймауты пропадают, а без него снова появляются, скорее всего, дело не в Telegram API-клиенте, а в конкретном маршруте до серверов Telegram.

Из трёх я бы просто последовательно протестировал ближайшие локации и сравнил `ping`, время ответа запросов и стабильность соединения. Это быстрее, чем сразу менять настройки клиента или переписывать код.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы