草庐IT

直播CDN调度技术关键挑战与架构设计

Jcloud 2023-03-28 原文

作者:胡济麟

1、背景介绍

1.1 直播业务特点

互联网视频直播是一种消息媒介形态,提供时产时消的内容,经过多年,已经发展出秀场、游戏、电商、体育等多种业务形态。主要特点是:内容实时产生实时消费,对时效性要求更高;流媒体内容占用带宽大,对网络质量要求更苛刻;一人生产、多人消费,带宽规模大。直播 CDN 目前是解决这种大规模分发场景最有效的技术途径,主要特点是就近接入以提供良好的接入网环境,多层汇聚以降低中心资源的分发压力,以此达到直播业务规模化和时效性的要求。

1.2 直播 CDN 面临的困难

由于直播业务本身对于质量和时效性的要求,CDN 就需要在短时间内要找到并建立一条完整可靠的传输链路,对于链路稳定性有一定的要求。传统依赖于旁路更新的、基于链路质量的策略,寻路算法简单,不消耗太多时间,时效性有保障。但随着成本压力越来越大和可用性的要求越来越高,基于链路质量的策略的缺点就逐渐体现出来:

一个是这种旁路策略第一策略时效性上存在一定的延迟,延迟大约 2-3 分钟,对于偶发性的质量恶化或资源偏压无法快速做出相应的策略调整;

第二是基于一套统一的链路质量数据,无法兼顾资源能效,对于一些能效低的内容无法基于成本考虑做出相应的寻路策略调整,对浮动成本的控制不够精确。

1.3 解决方案

基于资源信息、链路状态、流媒体信息等多维度数据,精确计算每一路流的分发效能,将计算粒度精确到流一级。通过对能效、质量的综合计算,为每一路流动态计算接入和回源策略是解决困难的关键。

图 1. 干系方

 

调度系统通过收集、结合资源信息、链路状态、流媒体信息等,对直播接入和寻路进行控制,快速精确的调整策略,提供质量优先、成本优先、质量成本平衡等多种策略,对于在质量指标评价体系下提升分发系统的可用性和能效比提供更加精准和细粒度的控制。

  • 内容平台:内容平台的核心目的就是提高质量,只有提高质量流量才有保障,一套精细化的调度系统,能够做到精确接入,提升网络覆盖的准确度,快速处理短时故障,降低流量流失风险。
  • CDN:CDN 主要目标是提高质量,降低成本。调度系统能够精确控制接入网准确度,提高接入质量,对流量进行精细化调度,提高资源复用率,降低浮动成本,进而执导建设规划,降低固定成本。

 

2、主要问题及挑战

2.1 时效性的要求

  • 接入调度要求对业务阻塞时长不超过 50ms
  • 寻路调度要求全路径上阻塞时长不超过 50ms
  • 流媒体信息同步延迟不超过 100ms
  • 设备信息、网络质量同步延迟不超过 10s

2.1.1 调度延迟控制

延迟不超过 50ms,考虑到公网的网络本身的传输延迟,基本上不会有多余的时间进行其他系统调用和计算,需要预先准备好响应的策略,并且调度接入位置要尽量靠近调用侧。设计了策略推送、策略缓存、异步更新三种功能。

  • 策略推送功能在资源调度系统生成好调度策略之后,通过推送方式直接推送到接入层,接入层不主动调用其他系统,直接使用推送的调度计划返回给业务方,接入层没有业务处理延迟。
  • 策略缓存功能在接入层收到推送调度计划之后做内存缓存,本地不落磁盘,只有推送或者异步更新触发缓存更新,调度请求直接返回缓存数据。
  • 异步更新是在接口主动定时向资源调度发起请求获取调度数据,防止推送失败。

2.1.2 信息同步延迟控制

由于流媒体信息同步延迟要求 100ms,考虑公网网络传输的延迟,定时采集上报的方式无法满足延迟要求,采用事件触发实时 API 上报的方式同步数据。设备信息、节点信息为接口调用方式取回,对于时效性要求不高,采用任务分派机制,防止数据重复取回。

  • 事件触发在开始、停止等事件边沿上,同步调用 API 上送流媒体信息,保障流媒体信息同步的及时性。
  • API 直连触发后端业务处理,不再经过中间件,节省中间件处理延迟。
  • 任务分派机制将数据查询任务通过 MQ 分派给不同的服务实例,每个实例在认领完任务之后负责将数据取回。

2.2 可用性要求

  • 客户之间互不影响
  • 询源调度和接入调度互不影响
  • 响应异常退化策略保障

2.2.1 接口可用性

隔离

用户隔离

  • 客户一般采用 id 来区别身份,部分大客户可能有独立的接入域名。以 id 和域名为维度,部署独立的计算资源,防止单个客户访问对全体客户造成影响。
  • 考虑到成本和可用性,大客户除了独立部署资源外,还需要在常规集群中也部署相应功能,提供主备资源保障。

业务隔离

  • 回源调度和接入调度的业务方不同,对调度的响应能力和异常处理方式也不相同,调度失效的影响范围和收益也不相同。因此按照业务方进行隔离,内容平台和 CDN 分别在不同的接入实例上,方便对单个业务进行扩展,也可控制业务异常影响范围。

限流

当系统负载过高时,保护系统服务,提升系统恢复速度,降低系统负载,需要对系统业务流量进行限制。

熔断

并发熔断

  • 系统中存在很多接口调用的场景,比如统一接入调用资源调度接口获取调度计划,资源调度调用信息采集获取基础数据等。为保障后端业务服务稳定性,防止后端业务被突发增量打死,需要对后端业务并发数进行熔断,超过额定并发之后,不再允许调用后端接口,监控系统抛出异常,前端业务依据故障处理机制容忍一定的故障请求,超过容忍额度则退化到兜底策略。

失败率熔断

  • 后端业务可能短时处于不可用状态,降低后端业务在短时不可用时的请求量,能够加速后端业务恢复。当调用后端接口失败率高于阀值后,一段时间内不再调用后端接口,超过额定时间则继续探测后端业务可用性,直到业务恢复。

2.2.2 退化策略

无法在进行接入和询源调度服务时,需要退化为默认兜底策略,接入退化为 DNS 解析方式,询源退化为 CDN 固定询源策略,不再依赖调度系统做策略选择。

 

3、调度系统架构

3.1 业务架构

图 2. 业务架构

调度系统分为统一接入、运管平台、资源调度、信息采集、日志系统五个部分。

  • 统一接入:为内容平台提供中心化标准接入能力。考虑性能及延迟消耗,为 CDN 的边缘实例、二级源实例提供下沉 agent 接入能力。
  • 运管平台:运管平台作为人工界面,主要提供配置能力和数据大屏。
  • 资源调度:资源调度作为调度系统的核心单元,依据多种输入条件,针对接入和询源两种业务模式,输出不同的调度计划。
  • 信息采集:信息采集作为数据底座,为资源调度提供必要的质量、能力、位置等输入信息。
  • 日志系统:日志系统提供时序化的记录方式用于记录调度信息,主要用于复盘和评价调度策略。

 

3.2 信息采集系统

图 3. 信息采集系统业务架构

信息采集系统作为调度系统的数据底座,主要功能是从运维系统收集设备资源情况、从业务系统收集流媒体信息,经过数据整合之后提供给资源调度使用。

信息采集系统通过主动定时调用运维系统接口采集设备运行数据,包括 CPU 使用率、内存使用率、磁盘 IO、网络 IO 等信息,用于评价设备的服务能力。采集节点带宽用量等信息,用于评价节点承载能力。

通过主动定时调用监控系统接口采集链路质量数据,包括 RTT,丢包率等信息,用于评价网络质量。

通过被动等待 CDN 业务实例上报流媒体资源位置、下行并发、卡顿率等信息,用于评价服务质量和服务收益。

这些信息被收集上来之后通过分类整合,按照节点、地区、运营商、业务形式等不同维度,形成服务能力、服务质量、服务收益的聚合数据。

聚合数据最终会通过查询接口提供给资源调度系统。

3.3 资源调度系统

图 4. 资源调度系统业务架构

资源调度作为调度系统核心业务模块,主要从信息采集收取必要调度依据,通过一套调度策略,输出调度计划提供给接入和询源业务。

资源调度系统主要通过运管平台将个性化调度配置信息落到资源调度系统。通过查询信息采集接口,查询所需要的服务能力、服务质量、服务收益等信息。通过匹配不同的调度策略,生成静态调度计划。

通过查询信息采集接口,查询流媒体资源位置及描述信息。通过匹配调度策略,生成动态调度计划。

最终调度计划会以接口方式提供给业务方使用。

3.4 技术架构

图 5. 技术架构

3.5 部署方案

图 6. 部署方案

有关直播CDN调度技术关键挑战与架构设计的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  4. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  5. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  6. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  7. ruby - Ruby 的 AST 中的 'send' 关键字是什么意思? - 2

    我正在尝试学习Ruby词法分析器和解析器(whitequarkparser)以了解更多有关从Ruby脚本进一步生成机器代码的过程。在解析以下Ruby代码字符串时。defadd(a,b)returna+bendputsadd1,2它导致以下S表达式符号。s(:begin,s(:def,:add,s(:args,s(:arg,:a),s(:arg,:b)),s(:return,s(:send,s(:lvar,:a),:+,s(:lvar,:b)))),s(:send,nil,:puts,s(:send,nil,:add,s(:int,1),s(:int,3))))任何人都可以向我解释生成的

  8. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  9. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

  10. ruby-on-rails - 设计通过 reset_password_token 获取用户 - 2

    我正在尝试创建密码规则来设计可恢复的密码更改。我通过passwords_controller.rb做了一个父类(superclass),但我需要在应用规则之前检查用户角色,但我所拥有的只是reset_password_token。 最佳答案 假设您的模型是用户:User.with_reset_password_token(your_token_here)Source 关于ruby-on-rails-设计通过reset_password_token获取用户,我们在StackOverflow

随机推荐