用 HLS Content Steering 提升全球流媒体可用性
Improve global streaming availability with HLS Content Steering
2021年6月11日
一句话判断
如果你的视频服务在全球部署了多个 CDN,但用户有时会被路由到错误的节点导致卡顿,HLS Content Steering 是你一直在等的方案——它在协议层面解决了”客户端该从哪个 CDN 拉流”的问题。
这场 Session 讲了什么
Session 介绍了 HLS Content Steering 机制,这是 Apple 为全球流媒体分发设计的一套 CDN 选择方案。传统做法是 DNS 或 BGP 层面做全局负载均衡,但这层对播放器的状态(当前码率、缓冲水位、下载速度)一无所知,路由决策经常不够精准。
Content Steering 的思路是:在 master playlist 中通过 #EXT-X-CONTENT-STEERING 标签指向一个 steering server(调度服务器),播放器定期向这个服务器汇报自己的状态并获取推荐的 CDN 优先级列表。steering server 可以根据用户的地理位置、网络状况、CDN 负载等维度做出更智能的路由决策。播放器按照推荐的优先级顺序尝试下载 segment,如果首选 CDN 失败则自动 fallback 到下一个。
值得深挖的点
Steering Manifest 的动态更新机制
Steering server 返回的不是一个静态列表,而是一个可以动态更新的 manifest。通过 RELOAD-URI 字段,播放器可以定期请求更新后的 CDN 优先级。TTL(Time To Live)控制更新频率——在 CDN 故障场景下,服务器可以将 TTL 设得很短(比如 30 秒),让播放器快速感知到新的路由策略。正常情况下 TTL 可以设为几分钟,减少调度服务器的请求压力。
PATHWAY 机制与 CDN 故障隔离
Content Steering 使用 PATHWAY 作为 CDN 的标识符。每个 variant stream 都会被标记属于哪个 PATHWAY。当 steering server 返回一个不包含某个 PATHWAY 的优先级列表时,播放器就知道那个 CDN 被排除了。这个设计很巧妙——不需要额外的”CDN 下线”通知机制,只要不给某个 PATHWAY 分配优先级,播放器自然就不会用它。
代码片段
# Master playlist 中的 Content Steering 标签
# 指向调度服务器,播放器定期请求路由建议
#EXT-X-CONTENT-STEERING:SERVER-URI="https://steering.example.com/v1",
PATHWAY-ID="cdn-primary"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
cdn-primary/high/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3000000,RESOLUTION=1280x720
cdn-primary/medium/index.m3u8
# 备用 CDN 的 variant(同一个内容,不同 PATHWAY)
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
cdn-backup/high/index.m3u8
// Steering server 返回的路由建议
// 按优先级排列 CDN PATHWAY
{
"VERSION": 1,
"TTL": 300,
"RELOAD-URI": "https://steering.example.com/v1?session=abc123",
"PATHWAY-PRIORITY": [
"cdn-primary",
"cdn-backup",
"cdn-tertiary"
],
"PATHWAY-CLONES": [
{
"ID": "cdn-primary-eu",
"URI-REPLACEMENT": {
"HOST": "cdn-eu.example.com"
}
}
]
}
# PATHWAY-CLONES 允许在不重复内容的情况下
# 动态替换 CDN 主机名
# 例如欧洲用户被引导到 cdn-eu.example.com
# 而不需要在 master playlist 中单独列出欧洲 CDN 的 variant
最佳实践
- Steering server 的部署要贴近用户,延迟控制在 50ms 以内。如果调度请求本身就很慢,Content Steering 反而会增加首屏时间。
- TTL 的设置要区分正常和故障场景:正常运行时 300 秒足够,CDN 降级或区域性故障时动态缩短到 30-60 秒。
- 为 steering server 的接口设置合理的 fallback:如果调度请求超时,播放器应该继续使用上一次的 PATHWAY 列表,而不是回退到 playlist 中的原始 URL。
还有什么值得关注
- AVFoundation 在 iOS 15 和 macOS Monterey 中原生支持 Content Steering,不需要额外的播放器代码。
AVContentKeySession可以和 Content Steering 配合使用,DRM 密钥请求也会遵循 PATHWAY 优先级。- Content Steering 的规范已经提交到 IETF 作为 HLS RFC 的扩展草案,未来可能成为行业标准。