Content Steering: стандартный способ делать multi-CDN

Автор: Николай СапуновОбновлено: август 202621 мин чтения
Содержание статьи +

TL;DR

Content Steering – это небольшой набор дополнений к спецификациям HTTP Live Streaming и MPEG-DASH, который позволяет плееру спросить у удалённого сервера – steering-сервера – какой Content Delivery Network (CDN) использовать для следующего сегмента видео. Он заменяет старые трюки с Domain Name System и плеер-специфичные списки failover одним совместимым механизмом, который для HLS описан в Apple HLS Content Steering Specification v1.2 (с правками вплоть до 2025 года) поверх IETF draft-pantos-hls-rfc8216bis-22 (от 1 мая 2026 года), а для DASH – в ETSI TS 103 998 V1.1.1 (январь 2024 года), причём обе спецификации намеренно согласованы, так что один и тот же steering-сервер может управлять обоими клиентами. Архитектура простыми словами – это один дополнительный HTTP-запрос раз в несколько минут: плеер скачивает крошечный JSON-файл со списком идентификаторов CDN в порядке приоритета и по этому списку решает, куда отправить запрос за каждым сегментом, обновляя его по Time-To-Live, которым управляет steering-сервер. Сила content steering в том, что список приоритетов можно менять прямо посреди сессии, steering-сервер видит телеметрию сразу от множества плееров через спецификацию Common Media Client Data (CTA-5004), а один и тот же путь кода работает в hls.js, Shaka Player, dash.js, нативном Apple AVPlayer, Video.js v10, ExoPlayer и современных smart-TV-плеерах – а слабость в том, что steering-сервер становится единственным критическим компонентом на пути, требующим той же операционной дисциплины, что origin и лицензионный сервер.

Почему это важно

Десять лет multi-CDN-индустрия была набором вендор-специфичных решений, которые не говорили друг с другом: DNS-based steering у Cedexis (теперь Citrix Intelligent Traffic Management) и NS1, статические манифесты на стороне плеера на каждой видеоплатформе и разнообразные проприетарные протоколы сигнализации внутри плеерных SDK. Ни один из этих подходов не мог перевести зрителя между CDN посреди сессии без перезапуска плеера, и ни один не давал данные, которые мог бы использовать CDN-нейтральный аналитический продукт. Content steering – это починка на уровне протокола того десятилетия фрагментации. По состоянию на 2026 год каждый крупный open-source-плеер (hls.js, dash.js, Shaka Player, Video.js v10 со Streaming Processor Framework, ExoPlayer на Android Media3) поставляется с поддержкой content steering, каждый крупный CDN (Akamai, Cloudflare, Fastly, AWS CloudFront, Google Media CDN, Edgio) поддерживает модель pathway, а несколько специализированных вендоров steering-серверов (THEO, MediaMelon, einbliq.io, Touchstream, Broadpeak) предлагают продукты, спроектированные под спецификацию. Продакт-менеджер заканчивает эту статью с возможностью спросить «мы используем HLS Pathway ID или DASH ServiceLocation, и какой TTL у steering-манифеста?» – не блефуя. Архитектор заканчивает её с четырёхкомпонентным блюпринтом, ясным пониманием того, как PATHWAY-CLONES позволяет steering-серверу анонсировать совершенно новый CDN плееру, который работает уже час, и однозначной картой того, какое поле спецификации отвечает за какое поведение. Лид эксплуатации заканчивает её с каталогом режимов отказа, планом телеметрии и чек-листом готовности, который идёт вместе с этой статьёй. Content steering – не новая оптимизация; это lingua franca, которого multi-CDN не хватало.

Определение в один абзац (пока без номеров спецификаций)

Представьте, что ваш плеер – это посетитель кафе. Кафе – это манифест, маленький текстовый документ, в котором перечислено, где лежит каждый кусок видео. До 2021 года манифест сообщал посетителю ровно один адрес каждого куска и одну цепочку fallback. Content steering добавляет второй документ: короткий список на доске объявлений, которую кафе обновляет каждые пять минут, – список того, какие поставщики (CDN) сейчас доставляют лучший кофе. Посетитель смотрит на доску, выбирает поставщика наверху списка и заказывает следующий кусок у него. Если порядок поставщиков меняется между проверками, следующий заказ посетителя уходит к другому поставщику – без нового меню, нового визита и нового разговора с кафе. Доска объявлений – это steering-манифест. Проверка её по таймеру – это steering. Всё остальное – JSON-ключи, атрибут PATHWAY-ID, параметры запроса CMCD – это просто водопровод.

Рис. 1. Архитектура content steering на одной картинке. Один origin, несколько CDN, один steering-сервер. Задача steering-сервера – публиковать маленький JSON-документ, содержимому которого плеер подчиняется на следующем запросе за сегментом.

Почему content steering заменяет то, что было до него

Ментальную модель проще всего строить через контраст.

До content steering multi-CDN-индустрия поставляла три архитектуры, у которых была одинаковая форма и разные режимы отказа. DNS-based steering – самая старая – отвечала на запрос плеера к имени хоста манифеста разным IP в зависимости от того, какой CDN предпочитала политика steering. Точкой управления был рекурсивный резолвер Domain Name System, а время реакции ограничивалось кэшем Time-To-Live этого резолвера, который часто был дольше номинального TTL, потому что Internet Service Provider'ы навязывают минимумы. Player-side static failover поставлял список базовых URL CDN внутри конфигурации плеера; плеер шёл по списку, когда запрос падал. Каждый плеер реализовывал это чуть по-своему, и архитектура не видела глобальное здоровье – только локальные ошибки. Проприетарная сигнализация – самописные подходы у Netflix, Twitch, YouTube – работала на собственном протоколе контроллера каждой платформы; портируемого – ничего.

Хроническая проблема, общая для всех трёх архитектур, – граница посреди сессии. Как только зритель уже смотрел поток, перевод его на другой CDN требовал либо перезапуска плеера (DNS – ждать TTL резолвера или рвать сессию), либо ошибки плеера (статический failover – ждать, пока запрос упадёт). Ни одна архитектура не могла отправить глобальное изменение приоритета плееру, чья сессия уже шла.

Content steering переносит точку управления на прикладной уровень и отвязывает её от отказов запросов. Steering-манифест – это крошечный JSON-файл, который плеер опрашивает по расписанию, заданному steering-сервером. Когда список приоритетов меняется, следующее обновление – обычно в пределах 60–300 секунд – подхватывает новый порядок. Плееру не нужно перезапускаться, не нужно валить сегмент и не нужно ждать истечения DNS TTL.

Если коротко: DNS steering реагирует за минуты (TTL резолверов), статический failover реагирует за секунды-на-отказ (ошибки плеера), content steering реагирует за steering-серверные секунды (TTL на JSON, который steering-сервер может выставить хоть на 30 секунд и который dash.js и Shaka Player честно соблюдают).

АрхитектураТочка управленияВремя реакцииОбновления посреди сессииСтандартизировано
DNS-based steeringРекурсивный DNS-резолверTTL резолвера (минуты)Только для новых сессийНет (вендор-специфично)
Player-side static failoverПлеерный SDKНа каждый отказ (секунды)Ограниченно (перезагрузка манифеста)Нет (на каждый плеер)
HLS/DASH Content SteeringSteering-серверSteering TTL (секунды)Да, на каждом обновленииДа (Apple v1.2 + ETSI TS 103 998)

Сторона HLS – спецификация Apple, тег за тегом

Apple ввели HLS Content Steering в редакции HLS Authoring Specification от сентября 2021 года, а сессия WWDC21 «Improve global streaming availability with HLS Content Steering» стала практическим анонсом для разработчиков. Спецификацию переработали на WWDC22 (сессия 10144), добавив семантику Pathway Cloning и PATHWAY-PRIORITY, а текущая версия – HLS Content Steering Specification v1.2 (предварительная v1.2b1 в публикации), согласованная с draft-pantos-hls-rfc8216bis-22 от 1 мая 2026 года. Основную работу делают три понятия из словаря.

EXT-X-CONTENT-STEERING – тег на multivariant-плейлисте

Multivariant-плейлист – манифест верхнего уровня, в котором перечислены все варианты, между которыми плеер может выбирать, – получает один новый тег. EXT-X-CONTENT-STEERING опционален, встречается ноль или один раз на multivariant-плейлист и несёт два важных атрибута: SERVER-URI (URL steering-манифеста, JSON-документа) и PATHWAY-ID (идентификатор pathway, который плеер должен использовать на старте, пока не пришёл первый steering-манифест).

Разберём пример. Допустим, издатель доставляет через два CDN с идентификаторами cdn-a и cdn-b. Multivariant-плейлист содержит:

#EXTM3U
#EXT-X-VERSION:9
#EXT-X-CONTENT-STEERING:SERVER-URI="https://steering.example.com/manifest?session=xyz",PATHWAY-ID="cdn-a"

#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,PATHWAY-ID="cdn-a"
https://cdn-a.example.com/master/1080p.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,PATHWAY-ID="cdn-b"
https://cdn-b.example.com/master/1080p.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,PATHWAY-ID="cdn-a"
https://cdn-a.example.com/master/720p.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,PATHWAY-ID="cdn-b"
https://cdn-b.example.com/master/720p.m3u8

Обратите внимание на три вещи. Во-первых, один и тот же вариант – 1080p на 5 Mbps – встречается дважды, по разу на pathway, с двумя разными URL. Каждая строка – полноценный вариант; группирует их именно PATHWAY-ID. Во-вторых, плеер на старте использует начальный PATHWAY-ID из тега EXT-X-CONTENT-STEERING – здесь cdn-a – пока не придёт первый steering-манифест. В-третьих, SERVER-URI может содержать токен сессии или идентификатор ассета; steering-сервер использует их, чтобы привязать свои решения к конкретному зрителю.

Steering-манифест – JSON-документ

Steering-сервер отвечает на GET плеера небольшим JSON-объектом. Поля, которые определяет спецификация:

{
  "VERSION": 1,
  "TTL": 300,
  "RELOAD-URI": "https://steering.example.com/manifest?session=xyz",
  "PATHWAY-PRIORITY": ["cdn-b", "cdn-a"],
  "PATHWAY-CLONES": []
}

VERSION равен 1 в текущей спецификации; плееры, прочитавшие более высокую версию, обязаны прекратить steering и откатиться на pathway по умолчанию. TTL сообщает плееру, сколько секунд ждать до следующего обновления – 300 секунд (5 минут) – значение Apple по умолчанию; для live-событий обычны 60 секунд, а 30 секунд – практический пол, ниже которого частота запросов к самому steering-серверу становится проблемой нагрузки. RELOAD-URI позволяет steering-серверу сменить URL опроса плеера – удобно для stickiness, для шардирования steering-нагрузки или для вывода steering-эндпоинта без обрыва сессий. PATHWAY-PRIORITY – упорядоченный список pathway ID, которые плеер должен пробовать, от высшего приоритета к низшему.

Семантика: когда плеер получает свежий steering-манифест, он смотрит на PATHWAY-PRIORITY[0] – первую запись – и переключается на этот pathway для следующего сегмента. Если вариант на этом pathway, соответствующий текущему rendition плеера, доступен, плеер использует его; если нет – плеер идёт вниз по PATHWAY-PRIORITY, пока не найдёт доступный. Разрешение и уровень битрейта текущего варианта не меняются только из-за того, что сменился pathway – плеер меняет CDN, а не rendition.

PATHWAY-CLONES – трюк, который позволяет steering-серверу анонсировать совершенно новый CDN посреди сессии

Это та функция, которая обеспечила content steering его место поверх DNS-based steering. Допустим, издатель начал сессию с двумя CDN, cdn-a и cdn-b, и где-то посреди сессии решает добавить третий – cdn-c. С DNS-based steering это задача редактирования манифеста; URL нового CDN просто не существуют в уже запущенном multivariant-плейлисте плеера. С content steering steering-сервер может положить cdn-c в следующий steering-манифест через PATHWAY-CLONES:

{
  "VERSION": 1,
  "TTL": 300,
  "PATHWAY-PRIORITY": ["cdn-c", "cdn-b", "cdn-a"],
  "PATHWAY-CLONES": [
    {
      "BASE-ID": "cdn-a",
      "ID": "cdn-c",
      "URI-REPLACEMENT": {
        "HOST": "cdn-c.example.com",
        "PARAMS": {"region": "eu-west"}
      }
    }
  ]
}

Плеер читает массив PATHWAY-CLONES, видит, что cdn-c – это клон cdn-a (тот самый BASE-ID) с заменённым хостом и добавленным query-параметром, и конструирует URL для вариантов cdn-c, применяя замену URI к каждому URL варианта на cdn-a. С точки зрения плеера, cdn-c становится полноценным pathway, на который можно переключиться, – без скачивания нового multivariant-плейлиста.

Механизм вознаграждает аккуратный дизайн URL на origin: если URL вариантов каждого CDN следуют одной и той же структуре пути-и-имени-файла, различаясь только хостом и несколькими query-параметрами, клонирование pathway – однострочная операция на steering-сервере, и весь парк плееров мигрирует в пределах одного TTL steering-манифеста. Если дизайн URL несогласован – разная структура путей на каждый CDN, разные имена файлов на каждый CDN – клонирование pathway невозможно, и издатель застревает на пересборке multivariant-плейлиста при каждом добавлении CDN.

![Sequence-диаграмма с тремя дорожками: плеер, steering-сервер, CDN-A, CDN-B. Плеер скачивает multivariant-плейлист (содержащий оба pathway), затем скачивает steering-манифест, получает JSON с PATHWAY-PRIORITY=[cdn-a, cdn-b] и начинает запрашивать сегменты у cdn-a. Через пять минут плеер перескачивает steering-манифест; в ответе приоритет перевёрнут на PATHWAY-PRIORITY=[cdn-b, cdn-a]; следующий сегмент уходит к cdn-b без перезапуска плеера.](./images/06_5-content-steering-multi-cdn__02-handshake-sequence.svg) Рис. 2. Полный handshake content steering. Один начальный bootstrap, затем ровная частота маленьких JSON-опросов, содержимому которых плеер подчиняется на самом следующем запросе за сегментом.

Сторона DASH – ETSI TS 103 998 простыми словами

Версия content steering от DASH-IF началась как документ Community Review в конце 2022 года, разрабатывалась в тесном согласовании с работой Apple над HLS и была опубликована как формальная спецификация European Telecommunications Standards Institute – ETSI TS 103 998 V1.1.1 – в январе 2024 года. Цель проектирования была явной: один и тот же steering-сервер должен уметь управлять и HLS-плеером, и DASH-плеером без изменений кода на стороне сервера. Две спецификации не идентичны – слова различаются, потому что различаются форматы манифеста, – но словарь на уровне JSON намеренно совместим.

Где живёт steering-тег в MPD

Манифест DASH, Media Presentation Description (MPD), – это XML. Тег content-steering – элемент ContentSteering, дочерний для корня MPD:

<MPD ...>
  <ContentSteering
      defaultServiceLocation="cdn-a"
      queryBeforeStart="true">
    https://steering.example.com/manifest?session=xyz
  </ContentSteering>
  <Period>
    <AdaptationSet>
      <BaseURL serviceLocation="cdn-a">https://cdn-a.example.com/</BaseURL>
      <BaseURL serviceLocation="cdn-b">https://cdn-b.example.com/</BaseURL>
      <Representation .../>
    </AdaptationSet>
  </Period>
</MPD>

Работу делают три понятия. Сам ContentSteering содержит URL steering-сервера как своё текстовое содержимое. defaultServiceLocation играет роль стартового PATHWAY-ID из HLS – это CDN, который плеер использует до скачивания первого steering-манифеста. queryBeforeStart (булево) сообщает плееру, блокировать ли старт воспроизведения на первом ответе steering-сервера (true) или стартовать оптимистично со значением по умолчанию и применить steering на следующем обновлении (false). Паттерн с двумя BaseURL и разными значениями serviceLocation – это то, как DASH выражает то, что HLS выражает двумя записями EXT-X-STREAM-INF с разными атрибутами PATHWAY-ID.

Steering-манифест DASH

JSON, который возвращает DASH steering-сервер, намеренно близок к HLS:

{
  "VERSION": 1,
  "TTL": 300,
  "RELOAD-URI": "https://steering.example.com/manifest?session=xyz",
  "SERVICE-LOCATION-PRIORITY": ["cdn-b", "cdn-a"],
  "PATHWAY-PRIORITY": ["cdn-b", "cdn-a"]
}

SERVICE-LOCATION-PRIORITY – нативный ключ DASH; он соответствует атрибуту serviceLocation на элементах BaseURL в MPD. PATHWAY-PRIORITY – алиас, согласованный с HLS, включённый ради кросс-спецификационной совместимости: сервер может публиковать либо тот, либо оба, либо только SERVICE-LOCATION-PRIORITY, и клиенты по спецификации DASH подчинятся. Ключи VERSION, TTL и RELOAD-URI несут семантику, идентичную HLS.

Практическое следствие для вендоров steering-серверов: один HTTP-эндпоинт, один JSON-payload, оба семейства клиентов обслужены. Стоимость поддержки DASH в дополнение к HLS на стороне сервера по сути нулевая. Стоимость на стороне плеера реальна, но ограниченна: dash.js, Shaka Player и DASH-движок Video.js v10 реализуют content steering через свой парсер MPD; hls.js, HLS-движок Shaka Player и нативный плеер iOS / tvOS реализуют его через свой парсер HLS multivariant-плейлиста.

ПонятиеПоле спецификации HLSПоле спецификации DASH
Steering-тег на манифестеEXT-X-CONTENT-STEERING<ContentSteering>
URL steering-сервераАтрибут SERVER-URIТекстовое содержимое элемента
Начальный используемый CDNАтрибут PATHWAY-IDdefaultServiceLocation
Идентификатор CDN на вариантеPATHWAY-ID на EXT-X-STREAM-INFserviceLocation на BaseURL
Список приоритетов в JSONPATHWAY-PRIORITYSERVICE-LOCATION-PRIORITY (алиас HLS тоже принимается)
Новый CDN посреди сессииPATHWAY-CLONESПрямо не специфицировано; достигается через обновление MPD

Как steering-сервер на самом деле принимает решение

До этого момента steering-сервер был чёрным ящиком, выдающим JSON-список в некотором порядке. Интересный вопрос: как он решает порядок? Честный ответ – «зависит от вендора и от того, какую телеметрию плееры отдают назад». В данных развёртываний 2024–2026 годов видны три широких подхода.

Подход 1 – здоровье-и-вес. Простейший steering-сервер. Оператор настраивает статический порядок приоритетов и набор health-check'ов против каждого CDN; если health-check CDN падает, тот опускается в низ списка. Взвешенные варианты позволяют простые поregional'ные сплиты – 70% зрителей США на CDN-A, 30% на CDN-B, вычисляемые детерминированным хешом токена сессии. Большинство DIY-steering-серверов поставляются с этим подходом, потому что он работает без какой-либо телеметрии со стороны плеера. Ограничение в том, что steering-сервер не видит, что на самом деле испытывают отдельные зрители.

Подход 2 – на базе CMCD. Спецификация Common Media Client Data от Consumer Technology Association – CTA-5004, опубликованная в 2020 году – определяет небольшой набор ключей (длина буфера, throughput, ID контента, ID сессии, dropped frames, запрошенный битрейт), которые плеер прикрепляет к каждому запросу медиа-объекта либо как кастомный HTTP-заголовок, либо как query-параметр. Steering-сервер, стоящий перед CDN, может прочитать эти ключи на самом запросе за steering-манифестом – спецификация HLS от Apple определяет query-параметры _HLS_pathway (текущий pathway плеера) и _HLS_throughput (измеренный плеером throughput на этом pathway), которые steering-сервер может прочитать напрямую, – и агрегировать их по тысячам одновременных зрителей. Получающиеся решения управляются данными: увести зрителей с CDN, который деградирует в конкретном регионе, до того, как события rebuffering случатся на более широком парке. Работа Mile-High Video 2024 по референсной реализации в dash.js и пилот quality-aware-multi-CDN от einbliq.io оба демонстрируют измеримые улучшения QoE (в среднем сокращение rebuffer на низкие единицы процентов, больший выигрыш на нижнем дециле зрителей) по сравнению с health-and-weight-steering на той же нагрузке.

Подход 3 – на базе обучения. Недавние академические работы (CADENCE на ACM Multimedia Systems Conference 2026; StreamWise на MMSys 2025; IMAC на MHV 2025) демонстрируют multi-agent- и reinforcement-learning-решения steering, которые в контролируемых экспериментах обходят и health-and-weight, и подходы с агрегацией CMCD. Ни один из них широко не развёрнут в 2026 году; операционный риск и требования к обучающим данным пока достаточно высоки, чтобы продакшен-команды держались за CMCD-эвристики. Ожидайте первые коммерческие steering-продукты на базе обучения в 2026–2027 годах от тех же вендоров, что поставляют нейронный ABR – Bitmovin, Mux, Visionular.

Подход к решению не имеет ничего общего со спецификацией – спецификация молчит о том, как производится JSON. Спецификация диктует только формат JSON. Интеллект – это проблема оператора и тот самый дифференциатор между вендорами steering-серверов.

Разобранный пример – математика переключения на базе CMCD

Допустим, издатель проводит крупное live-событие с 800 000 одновременных зрителей, разделённых между двумя CDN хешем 50/50. TTL steering-манифеста – 60 секунд. На T=0 минут оба CDN здоровы. На T=8 минут edge CDN-A во Франкфурте начинает троттлить пиринговый линк, из-за чего средний throughput по сообщаемому плеером параметру _HLS_throughput падает с 18 Mbps до 6 Mbps для 60 000 зрителей, направленных туда.

CMCD-агрегатор steering-сервера обнаруживает падение throughput в пределах одной минуты – среднее по франкфуртской когорте пересекает порог алерта к T=9 минут. Steering-сервер переворачивает список приоритетов для этих 60 000 зрителей: PATHWAY-PRIORITY меняется с ["cdn-a", "cdn-b"] на ["cdn-b", "cdn-a"]. На следующем обновлении steering-манифеста (между T=9 и T=10 минутами) каждый затронутый плеер подхватывает новый приоритет и переключается на CDN-B для следующего сегмента.

Арифметика спасённых событий rebuffering:

  • До переключения: 60 000 зрителей × ~9,5 средний видеобитрейт / 6 Mbps throughput = устойчивое голодание загрузки; rebuffer'ы ожидаются в пределах 30 секунд после исчерпания буфера при 30-секундном буфере плеера.
  • Задержка обнаружения переключения: 60 секунд (окно агрегации CMCD).
  • Распространение steering: до 60 секунд (TTL steering-манифеста).
  • Полная задержка реакции: ≤ 120 секунд.
  • Буфер плеера: 30 секунд для live (LL-HLS) или 30 секунд для стандартного HLS при типовых конфигурациях.

Гонка некомфортная. В развёртывании со статическим CDN все 60 000 зрителей получили бы rebuffer. В развёртывании с DNS-steering и 60-секундным TTL на рекурсивном резолвере (лучший случай) новые сессии переехали бы на CDN-B, но существующие сессии, держащие кэшированные DNS-ответы, всё равно получили бы rebuffer. В развёртывании с content steering steering-сервер может отправить изменение приоритета каждой существующей сессии в пределах TTL steering-манифеста – и полная задержка реакции в 120 секунд едва успевает обогнать 60-секундный буфер плеера для тех зрителей, кто ещё не начал его проедать к моменту распространения переключения.

Пример намеренно зажат; в реальных развёртываниях TTL steering-манифеста выставляется со знанием длины буфера плеера, окна агрегации CMCD и типового режима отказа CDN. 30-секундный TTL даёт больше запаса; нагрузка на steering-сервер вдвое выше. Компромиссы накапливаются.

Рис. 3. Переключение steering на базе CMCD в действии. Испытываемый когортой throughput восстанавливается на первом обновлении steering-манифеста после того, как CMCD-агрегатор пересекает порог алерта.

Покрытие плееров и CDN – кто реально это поставляет в 2026 году

Покрытие спецификацией и покрытие в поставке – разные вопросы. Вот ландшафт 2026 года, собранный из release notes, документации вендоров и выхлопа рабочей группы SVTA Architectures-for-Multi-CDN-Switching.

Плееры, поставляющие content steering для HLS, DASH или обоих. Нативный Apple AVPlayer поддерживает HLS Content Steering с iOS 15 / tvOS 15 / macOS Monterey (2021) и был первой реализацией в поставке. Референсный плеер DASH-IF dash.js добавил content steering в pull request #4031 в 2023 году и достиг полной поддержки v1 к dash.js 4.5. Shaka Player (Google) поддерживает content steering v1 и для DASH, и для HLS – это была первая кросс-протокольная реализация. hls.js добавил content steering в 1.3+ в апреле 2023 года, с продолжающимися фиксами вплоть до 1.5.x и 1.6.x (1.6.15 исправил обработку хоста в URI-REPLACEMENT; 1.6.x также исправил порядок PARAMS для клонов pathway). Video.js v10 со Streaming Processor Framework поставляет content steering через свой движок videojs/http-streaming; страница документации в репозитории videojs/http-streaming описывает статус реализации. Android Media3 / ExoPlayer поставляет content steering начиная с линейки релизов Media3 1.4. Нативные плееры smart-TV – Tizen, webOS, Vidaa – поставляют content-steering-совместимые движки на прошивках последних моделей; старые прошивки в install-base не всегда обновляются, и практическое покрытие на smart-TV в 2026 году ближе к 60–80% install-base.

CDN, поддерживающие модель pathway. Все крупные коммерческие CDN – Akamai, Cloudflare, Fastly, AWS CloudFront, Google Media CDN, Edgio (бывший Limelight + EdgeCast) – работают с content steering, потому что content steering не требует никаких изменений на стороне CDN. CDN отдаёт сегменты по тем URL, которые запрашивает плеер; логика pathway живёт целиком между плеером и steering-сервером. Некоторые CDN (Akamai, Cloudflare) предлагают готовые продукты-steering-серверы как часть своих multi-CDN-сьютов; другие (Fastly, AWS) оставляют steering-сервер клиенту или третьей стороне.

Вендоры steering-серверов. Рынок 2026 года включает Cedexis / Citrix Intelligent Traffic Management, NS1 (теперь часть IBM), CDNetworks, MediaMelon (CDN-X), Touchstream Brewer, einbliq.io, THEO Technologies (HLS/DASH content steering как часть THEOplayer) и Broadpeak. Несколько клиентов держат собственные steering-серверы – спецификация достаточно мала, чтобы компетентная backend-команда поставила рабочую реализацию за пару недель, причём тяжёлая работа лежит на стороне агрегации телеметрии, а не на стороне формата JSON.

Рис. 4. Матрица покрытия плеер–функция 2026 года. Используйте её, чтобы определить объём минимально жизнеспособного steering-развёртывания.

Типовые ошибки

Multi-CDN-развёртывания падают повторяющимися способами, и content-steering-развёртывания наследуют большинство этих режимов отказа плюс небольшое число уникальных для спецификации.

Ошибка 1 – steering-сервер становится единой точкой отказа. Вся архитектура зависит от достижимости steering-сервера. Если steering-эндпоинт падает – отказ DNS, истечение сертификата, выкатка деплоя, что угодно – плееры не могут обновиться и либо замирают на том pathway, что выбрали последним, либо откатываются на порядок pathway из multivariant-плейлиста. Спецификации обрабатывают это аккуратно (плеер продолжает играть на текущем pathway), но выгода multi-CDN испаряется в тот момент, когда steering-сервер становится недостижим. Митигация – держать steering-эндпоинт минимум в двух регионах с health-check'ами и хостить его на CDN-устойчивой инфраструктуре, которая сама не зависит ни от одного CDN, между которыми вы пытаетесь делать steering.

Ошибка 2 – TTL выставлен слишком длинным для профиля отказа. 300-секундный TTL хорош для ребалансировки по производительности на установившейся нагрузке; он слишком длинный для отказа уровня CDN во время важного live-события. Правильный TTL – функция буфера плеера (≤ 30 секунд для live), окна агрегации CMCD (~60 секунд в большинстве реализаций) и стоимости работы steering-сервера на повышенной частоте запросов. Повторяющийся урок из post-mortem'ов: выбирайте TTL по худшему случаю, который вам нужно пережить, а не по среднему случаю, который вы хотите оптимизировать.

Ошибка 3 – несогласованный дизайн URL между CDN блокирует PATHWAY-CLONES. Если варианты CDN-A лежат по https://cdn-a.example.com/streams/{contentid}/1080p_8.m3u8, а варианты CDN-B – по https://cdn-b.example.com/v1/{contentid}/master/1080p.m3u8, steering-сервер не может анонсировать новый CDN как клон – URL структурно разные. Лечение – стандартизировать структуру URL между CDN на этапе origin-упаковки. Цена сделать это поздно – пересборка манифеста и сброс сессии плеера.

Ошибка 4 – идентификаторы CMCD протекают в ключи кэша. Query-параметрический режим CMCD добавляет CMCD=... к каждому URL сегмента. Если ключ кэша CDN включает полный URL вместе с query string (значение по умолчанию для большинства CDN), кэш фрагментируется на каждую сессию – каждый зритель скачивает уникальный URL, и hit ratio кэша обваливается. Лечение хорошо известно и хорошо задокументировано (настроить CDN на удаление CMCD-query-string до вычисления ключа кэша или использовать HTTP-заголовочный режим CMCD вместо query-режима), но это самая частая ошибка, которую команды делают при первой настройке CMCD upstream.

Ошибка 5 – install-base smart-TV не совпадает со спецификацией. Устройства Tizen, webOS и Vidaa последних моделей поставляют content-steering-совместимые нативные плееры. Install-base старых устройств – нет. Multi-CDN-стратегия, предполагающая, что 100% аудитории можно steering'ить, недоставит на сегментах со старой прошивкой. Митигация – мониторить по строке user-agent, какая доля live-аудитории способна к steering, и держать DNS-based или статический failover для остальных.

Ошибка 6 – отношение к steering-серверу как к маркетинговой поверхности. Решения steering-сервера критичны для доставки; это не место для алгоритма рекомендаций контента. Держите логику решений steering-сервера узкой (производительность, стоимость, отказоустойчивость). Всё остальное – в манифесте, в плеере или в отдельном сервисе.

Где здесь Фора Софт

В OTT- и live-стриминговых продуктах, которые мы поставляли, – включая платформы видеоконференций с WebRTC-fallback на HLS, e-learning-системы, отдающие записанные лекции плюс живые классы, телемедицинские продукты, которым нужна устойчивость сессии между регионами, – multi-CDN становился необходим не из-за стоимости, а из-за отказоустойчивости. Стандарты HLS / DASH Content Steering изменили то, как мы это поставляем. Там, где мы раньше поставляли плеер-специфичные failover-SDK и DNS-управляемые конфигурации, работавшие по-разному на iOS, Android, web и smart-TV-приложениях, теперь мы поставляем один эндпоинт steering-манифеста, один кросс-платформенный JSON-контракт и одну трубу телеметрии через CMCD. Операционная дисциплина, которая имеет значение, – на самом steering-сервере: его uptime, его TTL, его наблюдаемость, его логика решений. Статья, идущая следующей в треке Learn, – о токен-аутентификации и подписанных URL, – объясняет, как не дать per-CDN-уровню аутентификации сломать слой steering.

Одностраничный чек-лист готовности

Чек-лист на следующей странице – тот самый, который мы используем при оценке content-steering-развёртывания для клиента. PDF-загрузка содержит версию, готовую к печати.

В сжатой форме:

  1. Дизайн URL origin – URL сегментов структурно идентичны на всех кандидатных CDN (путь, имя файла, query-параметры); различается только хост. PATHWAY-CLONES зависит от этого.
  2. Двойные pathway в манифесте – каждый вариант опубликован дважды, по разу на CDN, с PATHWAY-ID (HLS) или serviceLocation (DASH), идентифицирующим CDN.
  3. Эндпоинт steering-сервера – хостится на устойчивой инфраструктуре, не зависящей от CDN, между которыми вы делаете steering; health-check минимум из двух регионов.
  4. TTL steering-манифеста – выставлен как функция вашего буфера плеера и окна агрегации CMCD; 60–300 секунд – рабочий диапазон.
  5. CMCD upstream – плееры настроены прикреплять CMCD через заголовок (предпочтительно) или query string (с настроенным исключением из ключа кэша на каждом CDN).
  6. Проверка покрытия плееров – задокументированы минимальные поддерживаемые версии плееров: hls.js ≥ 1.4, dash.js ≥ 4.5, Shaka Player ≥ 4.5, Video.js v10 с VHS, AVPlayer iOS 15+, Android Media3 1.4+.
  7. Fallback для smart-TV – DNS- или статический failover сохранён для старой прошивки smart-TV, не поставляющей steering-совместимые движки.
  8. Наблюдаемость steering-сервера – дашборды частоты запросов, истории содержимого JSON, счётчиков зрителей по pathway, метрик агрегации CMCD.
  9. Раннбук режимов отказа – что происходит, когда steering-эндпоинт недостижим; что происходит, когда один CDN краснеет; что происходит, когда все CDN желтеют разом.
  10. План A/B-теста – выкатка steering сначала на процент аудитории, измерение rebuffer ratio, времени старта и origin-egress против non-steering-контроля до переключения 100%.

Скачать чек-лист готовности к Content Steering (PDF)

Ключевые выводы

  • Content Steering – это стандарт IETF / Apple / DASH-IF / ETSI, заменяющий вендор-специфичную multi-CDN-сигнализацию.
  • Механизм: плеер опрашивает маленький JSON-файл по TTL; JSON перечисляет идентификаторы CDN в порядке приоритета.
  • HLS использует PATHWAY-ID; DASH использует serviceLocation; один steering-сервер может обслужить оба.
  • PATHWAY-CLONES позволяет steering-серверу анонсировать новый CDN посреди сессии без пересборки манифеста.
  • Восходящая телеметрия CMCD превращает content steering в quality-aware-контур управления.
  • Steering-сервер становится компонентом на критическом пути – проектируйте его под тот же uptime, что и origin.

Что почитать дальше

Строите такую систему?

Подберём параметры кодирования под ваш контент и посчитаем стоимость доставки до старта разработки.