Параметр 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 и содержит следующие флаги:
| Имя флага | Значение | Битовый сдвиг | Описание |
|---|---|---|---|
NO | 0 | 0 | Все механизмы работы с NODR отключены (по умолчанию). |
NODR_LOW_PRIORITY | 1 | 1 << 0 | Пониженный приоритет NODR-пиров: сначала опрашиваются браузерные участники. |
NODR_EXTRA_CYCLE | 2 | 1 << 1 | Дополнительный P2P-цикл загрузки с узла NODR, если обычный P2P-цикл не вернул данных. |
NODR_PROXY | 4 | 1 << 2 | Использование NODR в качестве HTTP-прокси перед переходом к CDN. |
NODR_BYTE_RANGE | 8 | 1 << 3 | Докачка недозагруженного сегмента по байтовому диапазону (range). |
NODR_PUT_SEGMENT | 16 | 1 << 4 | Отправка (HTTP PUT) скачанного сегмента на NODR для кэширования. |
NODR_SEND_EVENT | 32 | 1 << 5 | Отправка телеметрии о загрузках через NODR на бэкенд Teleport. |
NODR_FORCE_CHECK | 64 | 1 << 6 | Предварительный healthcheck узла NODR перед выполнением запроса. |
ALL | 127 | — | Включение всех механизмов взаимодействия с 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)
Удобная константа, объединяющая все флаги:
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():
let tlprt = await teleport.initialize({
apiKey: "YOUR_API_KEY",
config: {
// Включение всех возможностей NODR
nodrStrategy: teleport.NodrStrategy.ALL
},
loader: {
type: "PLUGIN_ID",
params: { /* ... */ }
}
});2. Комбинирование отдельных флагов
Флаги комбинируются с помощью оператора побитового ИЛИ (|):
// Активировать только 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:
// Чтение текущей стратегии
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 автоматически применяет стратегию без необходимости перезагрузки страницы или изменения клиентского кода.