> For the complete documentation index, see [llms.txt](https://docs.tumbler.app/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tumbler.app/ru/funkcii/balancing.md).

# Балансировка

## Для кого

Провайдеры, которые хотят распределять трафик между несколькими узлами или регионами и управлять тем, какой узел клиент выберет первым.

## Что такое node group

* Логическая метка для узлов, которые разделяют одну ёмкость или регион (например, один кластер/ДЦ).
* Используется клиентом для группировки, а в ACC — для счётчиков с областью `group`.
* Узлы без `group` считаются независимыми.

### Как задать group

* **VLESS ссылка:** query `group=<string>` → попадает в `node.meta.group`.
* **JSON узел:** `meta: { "group": "eu-west" }`.
* Делайте строку стабильной и осмысленной (регион, ДЦ, тариф). Одинаковая строка = одна группа.

## Методы балансировки (`balancer-method`)

Поле в `meta` или заголовке (`balancer-method: ping|connections`). При пустом значении перестановка узлов не делается.

### Когда выбирать `ping`

* Ноды в разных регионах/каналах, главная цель — минимальный RTT для пользователя.
* Готовы присылать метрики пинга от клиента (`ping_result` события).

**Как работает:**

* Клиент измеряет RTT до конкретной ноды и шлёт `ping_result` с `rtt_ms`; backend хранит EMA (альфа 0.3) с TTL \~24ч.
* Перестановка происходит только при улучшении >20% и минимум на 30 мс, плюс есть кулдаун \~10 минут между переключениями.
* Если метрик нет, порядок остаётся как в ответе провайдера.

### Когда выбирать `connections`

* Ноды в одном регионе/латентность похожа, важнее равномерная загрузка.
* Не требуется телеметрия от клиента: backend сам считает активные сессии на ноду.

**Что считается активным соединением:**

* Сессия создаётся через API, получает лиз со сроком действия \~90 секунд; heartbeat продлевает, явный `end` или истечение уменьшают счётчик.
* Счётчики по нодам держатся в Redis \~24ч. Переключение лидера требует улучшения >20% (минимум 1 соединение) и тоже уважает кулдаун \~10 минут.

## Совместимость с ACC (paid)

* ACC с областью `group` использует те же значения `meta.group`; задавайте их одинаково на всех нодах группы.
* Балансировщик лишь меняет порядок нод, счётчики ACC продолжают работать по выбранной области (`subscription`/`config`/`group`).
* При per-group лимитах не смешивайте разные физические площадки под одной `group`, чтобы лимиты отражали реальную ёмкость.

## Анти-паттерны и флаппинг

* Часто менять `group`/query-параметры/имя ноды → меняется `node_id`, теряются накопленные метрики и порядок «прыгает».
* Включить `ping`, но не слать `ping_result` или слать по редким нодам → порядок не обновится, клиент останется на исходной ноде.
* Смешивать удалённые регионы без групп: при `ping` клиент будет «перескакивать» между континентами; метите регионы через `group` и держите предсказуемый приоритет (основные → резерв).
* Постоянно перетасовывать список вручную при включённом балансере: кулдаун (10 мин) и пороги значимости защитят от части флапов, но стабильный `node_id` и статичный базовый порядок надёжнее.

## Краткие рекомендации

* Явно задайте `balancer-method` и используйте один сигнал: RTT (`ping`) или фактическая загрузка (`connections`).
* Размечайте узлы `group`, если делите ёмкость на кластеры/регионы или планируете per-group лимиты ACC.
* Для резервов оставляйте тот же `group`, но ставьте их ниже в списке/с меньшим весом; обновляйте `version_id` при изменении состава.
* Указывайте регионы/зоны в названии, если они важны для выбора пользователем.

## См. также

* [features/overview.md](/ru/funkcii/overview.md)
* [features/advanced-connection-control.md](/ru/funkcii/advanced-connection-control.md)
* [operations/reliability-and-timeouts.md](/ru/uluchsheniya-posle-pervogo-zapuska/reliability-and-timeouts.md)
* [subscription/examples.md](/ru/kontrakt-podpiski/examples.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.tumbler.app/ru/funkcii/balancing.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
