Skip to content

[MTProto][Direct] Добавить cooldown/circuit breaker для direct_tcp после timeout #27

Description

@Regstar2

Проблема

При недоступности прямых Telegram IP fallback многократно повторяет direct_tcp dial к одному и тому же адресу.

В логах 2026-09-01 повторяются подключения к:

  • 149.154.167.51:443 (DC2);
  • 149.154.175.50:443 (DC1).

Каждая попытка заканчивается i/o timeout, но следующие MTProto route request снова запускают тот же TCP dial через несколько секунд.

Для direct_ws уже виден IP cooldown (reason=direct_ip_cooldown), а direct_tcp продолжает тратить время на заведомо недоступный target.

native/tgwsproxy/mtproto_direct_route.go сейчас выполняет обычный net.Dialer.DialContext() с timeout 10 секунд без target health/circuit breaker.

Последствия

  • лишняя задержка каждого reconnect;
  • много одновременно висящих TCP dial;
  • повторная нагрузка на одну и ту же заблокированную сеть/адрес;
  • шум в логах;
  • fallback цепочка медленнее возвращается к потенциально рабочим маршрутам.

Предлагаемое изменение

Добавить health/cooldown для direct TCP target, минимум по ключу:

(dc, target_ip, port)

После timeout/network unreachable/connection refused применять reason-aware backoff. Успешное подключение должно сбрасывать consecutive failures.

Желательно переиспользовать общую модель direct IP health между direct_ws и direct_tcp, если семантика ошибок позволяет, либо хранить transport-specific health.

Критерии готовности

  • после TCP timeout следующий запрос в пределах cooldown не выполняет новый dial того же target;
  • логируется понятный reason, например direct_tcp_ip_cooldown;
  • cooldown различает DC/target и не блокирует другой доступный Telegram IP;
  • success сбрасывает progressive failure state;
  • backoff ограничен сверху и не делает маршрут навсегда недоступным;
  • добавлены тесты на timeout → cooldown → retry after expiry → success;
  • fallback telemetry корректно отражает пропуск direct_tcp из-за cooldown.

Связанные файлы

  • native/tgwsproxy/mtproto_direct_route.go
  • код direct WebSocket cooldown (для возможного переиспользования)
  • MTProto route-chain/fallback telemetry

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions