Skip to content

Параметр nodrStrategy

Описание

Параметр nodrStrategy определяет стратегию взаимодействия Teleport SDK со специализированными серверными узлами сети — NODR (Node Delivery Resource).

NODR — это выделенные кэширующие серверные узлы (edge nodes) в инфраструктуре Teleport Media, которые выступают в качестве промежуточного звена между пиринговой WebRTC-сетью (браузерными пирами) и CDN/Origin-сервером вещателя. Нодры могут работать как высокопроизводительные участники P2P-обмена, так и в качестве кэширующих HTTP-прокси перед обращением к CDN.

Параметр nodrStrategy представляет собой битовую маску (целое число), составленную из флагов перечисления teleport.NodrStrategy. Это позволяет гибко активировать отдельные механизмы или комбинировать их между собой.

Поведение по умолчанию

По умолчанию nodrStrategy равен teleport.NodrStrategy.NO (0). Взаимодействие с узлами NODR отключено, SDK обменивается сегментами только с обычными браузерными пирами по WebRTC и обращается напрямую к CDN/Origin при отсутствии данных в P2P.

Перечисление teleport.NodrStrategy

Перечисление teleport.NodrStrategy доступно в глобальном пространстве имен teleport и содержит следующие флаги:

Имя флагаЗначениеБитовый сдвигОписание
NO00Все механизмы работы с NODR отключены (по умолчанию).
NODR_LOW_PRIORITY11 << 0Пониженный приоритет NODR-пиров: сначала опрашиваются браузерные участники.
NODR_EXTRA_CYCLE21 << 1Дополнительный P2P-цикл загрузки с узла NODR, если обычный P2P-цикл не вернул данных.
NODR_PROXY41 << 2Использование NODR в качестве HTTP-прокси перед переходом к CDN.
NODR_BYTE_RANGE81 << 3Докачка недозагруженного сегмента по байтовому диапазону (range).
NODR_PUT_SEGMENT161 << 4Отправка (HTTP PUT) скачанного сегмента на NODR для кэширования.
NODR_SEND_EVENT321 << 5Отправка телеметрии о загрузках через NODR на бэкенд Teleport.
NODR_FORCE_CHECK641 << 6Предварительный healthcheck узла NODR перед выполнением запроса.
ALL127Включение всех механизмов взаимодействия с NODR (1 | 2 | 4 | 8 | 16 | 32 | 64).

Подробное описание флагов

NODR_LOW_PRIORITY (1)

Управляет приоритетом выбора пиров при P2P-загрузке.

  • Включен: При подборе пира для очередного сегмента SDK сначала ищет среди обычных браузерных пользователей (meta.type === "browser"). Узлы NODR (meta.type === "nodr") выбираются только в том случае, если среди клиентских пиров не найдено источников сегмента. Это позволяет экономить трафик серверных нодров и максимально утилизировать P2P-емкость клиентских устройств.
  • Выключен: Выбор происходит на общих основаниях среди всех доступных пиров без разделения на клиентские и серверные.

NODR_EXTRA_CYCLE (2)

Активирует дополнительный раунд P2P-загрузки, нацеленный исключительно на нодры.

  • Если основной цикл обращения к браузерным пирам завершился неудачно и сегмент не был получен, SDK перед обращением к внешним источникам инициирует дополнительный цикл загрузки напрямую с узла NODR (по DataChannel или прямому URL нодра).

NODR_PROXY (4)

Включает режим HTTP-проксирования через нодры перед переходом на CDN.

  • Включает фоновое обновление пула доступных нодров (запрос /v1/nodr/search каждые 10 минут).
  • Если сегмент не удалось получить из P2P-сети, SDK не сразу обращается к CDN/Origin, а предпринимает попытку скачать сегмент по HTTP с одного из доступных узлов NODR.
  • В случае таймаута нодр с вероятностью 1/3 временно исключается из ротации; при ошибке 301 нодр отключается принудительно.

NODR_BYTE_RANGE (8)

Поддержка докачки частично загруженных сегментов.

  • Если соединение прервалось, но часть данных сегмента уже была скачана (payloadSize > 0), SDK не сбрасывает полученный буфер, а добавляет к запросу параметр range со смещением в байтах (url?range=<payloadSize>).
  • Нодр отдает только недостающую часть сегмента, что снижает нагрузку на сеть и исключает дублирование трафика.

NODR_PUT_SEGMENT (16)

Сохранение сегмента в кэш нодра методом HTTP PUT.

  • Если при обращении к нодру был получен редирект (301 или 302 с заголовком x-source: CDN), SDK скачивает сегмент с CDN, после чего отправляет HTTP PUT запрос с телом сегмента и его хэшем (?h=<hash>) обратно на нодр.
  • Благодаря этому узел NODR кэширует данный сегмент и сможет раздавать его другим клиентам. Механизм активируется только при разрешенной отдаче данных (isCanUpload).

NODR_SEND_EVENT (32)

Отправка валидационных событий на бэкенд.

  • При каждой успешной HTTP-загрузке сегмента с нодра SDK формирует событие с идентификаторами отправителя, получателя, потока, сегмента и размером данных (sender_id, receiver_id, stream_id, segment_id, size) и отправляет его на сервер Teleport для сбора аналитики и валидации пирингового трафика.

NODR_FORCE_CHECK (64)

Быстрая проверка доступности нодра перед запросом сегмента.

  • Перед передачей URL нодра в пайплайн загрузки SDK выполняет контрольный HTTP GET запрос с коротким таймаутом (1 секунда).
  • Если нодр не ответил или вернул ошибку, он немедленно помечается недоступным (disablePeer), а запрос сегмента перенаправляется без ожидания длительного таймаута на основном потоке загрузки.

ALL (127)

Удобная константа, объединяющая все флаги:

javascript
teleport.NodrStrategy.ALL = 
    teleport.NodrStrategy.NODR_LOW_PRIORITY |
    teleport.NodrStrategy.NODR_EXTRA_CYCLE |
    teleport.NodrStrategy.NODR_PROXY |
    teleport.NodrStrategy.NODR_BYTE_RANGE |
    teleport.NodrStrategy.NODR_PUT_SEGMENT |
    teleport.NodrStrategy.NODR_SEND_EVENT |
    teleport.NodrStrategy.NODR_FORCE_CHECK;

Способы настройки

1. При инициализации Teleport SDK

Стратегию можно передать в поле config параметров метода teleport.initialize():

javascript
let tlprt = await teleport.initialize({
    apiKey: "YOUR_API_KEY",
    config: {
        // Включение всех возможностей NODR
        nodrStrategy: teleport.NodrStrategy.ALL
    },
    loader: {
        type: "PLUGIN_ID",
        params: { /* ... */ }
    }
});

2. Комбинирование отдельных флагов

Флаги комбинируются с помощью оператора побитового ИЛИ (|):

javascript
// Активировать только HTTP-проксирование с поддержкой докачки и валидации
let tlprt = await teleport.initialize({
    apiKey: "YOUR_API_KEY",
    config: {
        nodrStrategy: teleport.NodrStrategy.NODR_PROXY
            | teleport.NodrStrategy.NODR_BYTE_RANGE
            | teleport.NodrStrategy.NODR_SEND_EVENT
    },
    loader: {
        type: "PLUGIN_ID",
        params: { /* ... */ }
    }
});

3. Динамическое изменение в рантайме

Экземпляр Teleport предоставляет геттер и сеттер nodrStrategy:

javascript
// Чтение текущей стратегии
console.log("Текущая стратегия NODR:", tlprt.nodrStrategy);

// Проверка включения конкретного флага
let isProxyActive = (tlprt.nodrStrategy & teleport.NodrStrategy.NODR_PROXY) !== 0;

// Изменение стратегии на лету
tlprt.nodrStrategy = teleport.NodrStrategy.NODR_PROXY | teleport.NodrStrategy.NODR_FORCE_CHECK;

// Отключение работы с нодрами
tlprt.nodrStrategy = teleport.NodrStrategy.NO;

4. Управление через серверную конфигурацию

Teleport поддерживает централизованное управление параметром nodrStrategy через панель управления или бэкенд (код параметра 89). При получении обновленного конфига с сервера SDK автоматически применяет стратегию без необходимости перезагрузки страницы или изменения клиентского кода.