云边协同的 RTC 如何助力即构全球实时互动业务实践

作者:即构科技

由 51 CTO 主办的“WOT 全球技术创新大会 2023·深圳站”于 11 月 24 日 - 25 日召开,即构科技后台技术总监肖潇以“边缘容器在全球音视频场景的探索与实践”为主题进行分享。 边缘计算作为中心云计算的补充,通过边缘容器架构和云边协同,为音视频、云游戏、元宇宙等场景带来了更好的用户体验和业务价值。

图片

讲师现场风采

肖潇提到,即构这种实时互动的业务场景,天然就是边缘计算很契合的方式,原因就是边缘计算在降低时延、成本优化、提升并发、降低故障影响等方面有十分明显的优势。即构科技基于在实时互动领域的多年技术积累与实践,落地了云边协同的全球音视频云架构:多云基础设施、边缘容器、全球多中心、MSDN (Massive Serial Data Network)海量有序数据网络全球传输网络。这也帮助即构建立了 “生于云、长于云”的云原生音视频云服务,提升实时音视频云服务质量和运维效率,通过多云 serverless 做好容灾, 并进一步优化成本。

下面是肖潇在现场演讲的内容回顾:

边缘计算遇到的问题及落地挑战

即构使用边缘计算多年,在最开始我们的主要策略是租赁全球各种大规模的虚拟机和物理机。不同业务、不同的客户集群各自独占边缘算力,进行自己系统内部的资源冗余,导致边缘整体的利用率不高,成本压力大。其次,面向边缘没有统一的运维体系,各业务建设自己的业务支持系统,容量管理、扩缩容不统一效率比较低下。另外,中心部署的服务已经全面云原生化,运维团队在管理中心和边缘的服务需要在两种思维方式以及在两套运维设施中切换,这很割裂,期待有一些新的变化。

我们希望云原生的边缘容器能带来三方面的变化:

  • 通过底层计算资源复用最大化的利用算力和带宽实现成本的极致优化;
  • 通过云原生的弹性伸缩、多容器管理、版本更新机制大幅提升运维效率和可靠性;
  • 通过边缘容器的落地,构建一个统一的云边一体化的云原生基础设施。

然而,企业在落地边缘容器时会面临诸多挑战,首先,业界没有统一的边缘容器标准,从产品维度,他们都拥有相同的产品关键字:云边协同、边缘自治、单元化部署。我们预研梳理落地边缘容器的一些挑战,例如,音视频业务是强有状态服务,如何云原生化?不同服务规格差异较大,如何调度?音视频服务经常是两个进程协同完成工作,如何做到 pod 多进程完全独立的灰度发布?云边网络中断业务如何处理?云边通信的流量成本能否降到很低?如何提升运维效率等等挑战。

实时互动业务的落地实践

带着这些挑战进行思考,即构基于在实时互动领域的多年技术积累与实践,落地了云边协同的全球音视频云架构:多云基础设施、边缘容器、全球多中心、MSDN 全球传输网络。即构没有做成完全分布式去中心化的架构,是因为我们的业务是全球实时互动场景,500+ 机房之间 full mesh 进行同步效率太低,有中心的参与能大幅提升信息同步效率。

图片

云边协同的全球音视频云架构

1、音视频服务云原生化

音视频服务是强有状态业务

音视频服务有点类似游戏服务器,有玩家在玩游戏,不能轻易更新和缩容。音视频服务器除了有海量的用户接入,还有服务器之间的级联。服务器级联形成了一个流的分发网络,服务器节点的变化会导致分发网络的重建。虽然会通过 SDK 重试等策略降低这个网络重建的成本和对用户体验的影响,但是还是希望发布、扩缩容这些运维操作能尽量降低对音视频业务的影响。

具体来看,希望做到 IP 端口固定的无损直连;镜像更新,pod 不重建,降低 pod 重建重新调度耗时对业务影响;希望容器更新过程中,镜像拉取耗时是极短的,来降低推拉流的中断。有状态业务的扩容需要有多种业务指标来触发,缩容需要很精确的控制。一个 pod 内有两个容器,引擎容器和配套业务处理容器,希望这两个容器能够做到各自独立发布。有一些定向运维操作的需求。

主机网络减少网络损耗

我们选择主机网络模式来减少网络损耗,这样的好处是不需要经过容器额外的网络虚拟化层,但是也带来了端口冲突的问题。我们新建了一个 Daemonset,端口管理的服务,在节点上 pod 启动的时候负责进行端口的分配。

工作负载的选择、更新策略

前面我们提到 K8s 自带的 workload 不满足音视频业务的生命周期管理,在这里我们选择了 openKruise 的 cloneset 作为我们的工作负载,关注它主要是看中它如下几块的能力:原地升级、指定 pod 缩容、sidecarset 实现 sidecar 容器部署的能力、镜像预热的能力。

图片

如上图所示,音视频引擎作为主容器、配套业务处理容器作为 sidecar 容器 ,sidecar 容器通过 webhook 注入到 pod 中,通过 cloneset 和 sidecarset 两种资源实现两个容器的独立灰度发布。社区的版本 sidecarset 并不支持 env from metadata 的原地升级,我们完善了这个能力,后续也会提 PR 贡献给到社区。基于 cloneset 和 sidecarset,我们能进行下图所示的基于 partition 的百分比多阶段灰度发布。

图片

原地升级不能解决所有的更新问题

我们知道原地升级的触发条件主要是 spec container 的镜像变化以及 env from metadata 中 label 和注解的变化,但是 cloneset yaml 的其他字段需要修改的时候我们怎么能做到避免 pod 的重建从而使对业务的影响接近于零呢,即还能保持 IP 端口的稳定?对这种情况我们实现了一个 clonesetmigration 的 operator 来协调这个过程。

图片

镜像预热

我们在方案选型的时候对比分析了镜像预热和边缘 P2P 镜像分发这两种方式。对比的过程中我们发现 dragonfly 这种 P2P 镜像分发对于边缘场景运维还是偏复杂,因为它要求一个 P2P 网络中服务网络必须是互通的,那对于较大的边缘机房 P2P 网络是内网能有很好的效果,但对于多个较小的边缘机房又需要分区域组成一个外网的 P2P 网络,但是音视频又是高带宽的服务,为了不影响业务在节点和任务的维度都会要求有限速,明显的限速又影响到 P2P 镜像的拉取效果。于是回到了我们的核心诉求,原地升级时镜像拉取的耗时足够低,那 OpenKruise 每一阶段灰度发布时 node 的提前镜像预热+镜像仓库多地域部署已经能满足我们的诉求。

音视频场景下的弹性伸缩

音视频场景下弹性伸缩我们区别于社区的 HPA 方案,我们做的是带音视频业务状态的伸缩方案,扩容会多维度指标综合评估,从带宽、PPS、推拉流数、CPU、内存等多指标进行计算,缩容有点特殊,在有用户在推拉流的时候不能直接进行缩容操作,需要做业务的无损清理,不然容易带来用户的黑屏、卡顿。如果我们设计了 pod 业务状态的状态机,有初始化、已分配、墓碑态和等待被删除几种状态。其中墓碑态是关键的状态,进入这个状态会从业务层面不进行新请求和流量被调度进来等待流量的自然消亡,以及超时后的接近无损的驱赶和清理,当然如果墓碑态的过程中流量上涨会将业务状态回退到已分配状态继续服务业务。

2、质量和运维效率提升

在边缘容器的质量和运维效率提升方面,即构在成立之初就自研了“海量有序数据网络 MSDN”,实时探测网络质量,可以实现全球范围内优质的智能调度及路由,链路故障秒级恢复,大幅降低云边断网概率,提升数据传输速度及可靠性。即构还基于机器学习算法预测边缘机房未来利用率,生成扩容、缩容资源 node 数,然后基于这个推荐数据自动进行边缘节点购买/纳管、cordon/drain/节点退订,实现边缘资源池的智能化推荐、扩缩。此外,即构通过全球边缘容器控制面的多集群管理,实现全球资源统一管理。

肖潇还提到,关于云边协同的另一种有趣的方式——多云 Serverless 容灾。

当边缘容器控制面所在的中心 region 故障的时候,因为边缘自治的原因,边缘容器依旧可以正常运转,但是会影响到服务的扩容能力和容量水位。这个时候我们的一种容灾方式是通过在多云商不同中心机房的 serverless 集群的扩容进行这部分弹性容量的补齐。其次,用中心机房 Serverless 承载边缘资源池的突发溢出流量也非常有价值。这种溢出往往是临时性的突然打高,通过边缘带宽承载日常流量加 Serverless 流量计费承载突发流量,可以实现网络成本的最优组合。这里也充分用到了中心机房 Serverless 极致的弹性能力。

3、成本优化

边缘资源的最大化共享。使用边缘容器的边缘资源池能够做到不同的业务集群或业务角色能共享相同的资源池,通过整个资源池的资源冗余来避免在业务集群和服务维度各自的资源冗余。其次我们有全局多级资源池调度,上一级满了会溢出到下一级,实现在资源池全局资源的复用,和任意区域 N-2 机房资源的冗余。

资源调度策略。基于实时音视频场景思考,我们把默认的 Spread 调度策略改成 Binpack 调度策略,它会优先将 pod 调度到资源消耗较多的节点,多个 pod 会优先使用同一节点来提高整个资源的利用率,相较于虚拟机和物理机时代工作负载提升了一倍。

关于成本,即构关注如何大幅降低云边通信的流量的成本。以 OpenYurt 为例,首先要尽量减少 Service 和 EndpointSlice 的使用;第二,kubelet、daemonset list-watch 资源要 label 筛选本节点的数据,减少关注度;第三,以 Openyurt 为例,通过 Pool-Coordinator 和 Yurthub 的协同,实现单一节点池内云边只有一份 pool scope data 数据通信,当然 pool-coordinator 机制带来的好处,能区分出云边断网和节点宕机。

未来展望

未来即构会从三方面入手,一是探索更适合业务的调度算法, 对计算密集型的业务开放 CPU 拓扑感知调度的能力、提供 GPU 调度从而实现更全的业务覆盖;其次,通过更多工具链系统的建设和更多的能力抽象,进一步降低业务接入边缘容器的成本, 实现分钟级的部署;第三,把更多的能力在边缘侧进行提供。

即构将会继续推动边缘容器在全球音视频场景的进一步探索和应用!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/338816.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

配置DNS主从服务器,实现真反向解析

主服务器 [rootbogon ~]# systemctl stop firewalld.service #关闭防火墙 [rootbogon ~]# setenforce 0 #关闭selinux [rootbogon ~]# systemctl restart named #启动dns服务 [rootbogon ~]# vim /etc/named.conf #进入dns配置文件 options {#监听…

进程内协同:原子操作、互斥、同步和通信的原理

进程内协同,简单来说,就是在一个进程内部,多个执行体(如线程、协程)如何共享资源,如何协同工作以完成一项任务。这涉及到一系列的机制和技术,包括原子操作、互斥、同步和通信等。 那么&#xf…

微前端-无界wujie

无界微前端方案基于 webcomponent 容器 iframe 沙箱,能够完善的解决适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户的核心诉求。 主项目安装无界 vue2项目:npm i wujie-vue2 -S vue3项目…

Qt5.15.2中加入图片资源

系列文章目录 文章目录 系列文章目录前言一、加入图片资源二、代码 前言 以前用的Qt5.15.2之前的版本,QtCreator默认的工程文件是*.pro,现在用5.15.2创建工程默认的工程文件是CMameList.txt,当然在创建项目时,仍然可以使用pro工程文件用QtCr…

C#,入门教程(24)——类索引器(this)的基础知识

上一篇: C#,入门教程(23)——数据类型转换的一点基础知识https://blog.csdn.net/beijinghorn/article/details/124187182 工业软件首先要求高可靠性、高可维护性。 作为工业软件的开发者,我们对语言重载的需求是:“不可或缺”。 …

第6章 SpringBoot缓存管理

学习目标 了解SpringBoot的默认缓存 熟悉SpringBoot中Redis的缓存机制及实现 掌握SpringBoot整合Redis的缓存实现 缓存是分布式系统中的重要组件,主要解决数据库数据的高并发访问问题。在实际开发中,尤其是用户访问量较大的网站,为了提高服…

12、Kafka ------ Kafka 生产者API 用法(代码演示生产者发送消息到指定主题)

目录 Kafka 生产者API 用法(代码演示)生产者API 介绍依赖:介绍:使用生产者API发送消息步骤: 生产者发送消息代码演示:1、创建一个Maven项目2、依赖3、代码4、演示结果5、一些参数理解 Kafka 生产者API 用法…

乐意购项目前端开发 #4

一、Home页面组件结构 结构拆分 创建组件 在 views/Home 目录下创建component 目录, 然后在该目录下创建5个组件: 左侧分类(HomeCategory.vue)、Banner(HomeBanner.vue)、精选商品(HomeHot.vue)、低价商品(Homecheap.vue)、最新上架(HomeNew.vue) 引用组件 修改 views/Home…

5.2 内容管理模块 - 课程发布需求分析、分布式技术方案

内容管理模块 - 课程发布 - 分布式技术方案、 课程发布需求分析 文章目录 内容管理模块 - 课程发布 - 分布式技术方案、 课程发布需求分析一、分布式事务技术方案1.1 本地事务1.2 分布式事务1.3 CAP理论1.4 分布式事务控制方案 二、课程发布2.1 需求分析2.2 数据模型2.2.1 课程…

EasyRecovery2024专业免费的数据恢复软件,支持从硬盘、光盘、U盘、移动硬盘、等所有类型的介质上恢复数据。

Ontrack EasyRecovery Home是一款企业级的数据恢复软件,支持从硬盘、光盘、U盘、移动硬盘、硬件RAID及软件RAID等所有类型的介质上恢复数据。支持恢复误删除、磁盘格式化、磁盘重新分区、磁盘逻辑坏道等原因而丢失的数据。支持RAID重建!Ontrack EasyReco…

python基础学习-01

Python 是一种简单易学并且结合了解释性、编译性、互动性和面向对象的脚本语言。Python提供了高级数据结构,它的语法和动态类型以及解释性使它成为广大开发者的首选编程语言。 Python 是解释型语言: 开发过程中没有了编译这个环节。类似于PHP和Perl语言。…

「环境配置」使用Windows自带工具清理C盘空间

​ Windows电脑操作系统一般是安装在磁盘驱动器的C盘中,一旦运行,便会产生许多垃圾文件,C盘空间在一定程度上都会越来越小。伴随着电脑工作的时间越久,C盘常常会提示显示其内存已不足。本文记录笔者清理机器的步骤。 一、使用Win…

学会这个工具,小白也可制作门窗电子画册

​随着互联网技术的发展,现在制作电子画册已经变得非常简单。如果你是一个新手,也可以通过学习一些技巧来制作门窗电子画册。 那么,如何制作门窗电子画册呢?其实,这个过程并不复杂。只需要一台电脑和一个基本的操作工具…

Flask 3.x log全域配置(包含pytest)

最近使用到flask3.x,配置了全域的log,这边记录下 首先需要创建logging的配置文件,我是放在项目根目录的, Logging 配置 logging.json {"version": 1, # 配置文件版本号"formatters": {"default&qu…

「优选算法刷题」:在排序数组中查找元素的第一个和最后个位置

一、题目 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1&a…

C#调用Newtonsoft.Json将bool序列化为int

使用Newtonsoft.Json将数据对象序列化为Json字符串时,如果有布尔类型的属性值时,一般会将bool类型序列化为字符串,true值序列化为true,false值序列化为false。如下面的类型序列化后的结果如下: public class UserInfo…

LINUX文件fd(file descriptor)文件描述符

目录 1.文件接口 1.1open 1.2C语言为什么要对open进行封装 2.fd demo代码 第一个问题 第二个问题 打开文件流程 引言:在学习C语言的时候,我们见过很多的文件的接口,例如fopen,fwrite,fclose等等,但…

Linux上软件安装

软件安装常见方式 二进制发布包 软件已经针对具体平台编译打包发布,只要解压,修改配置即可。 RPM包 软件已经按照redhat的包管理工具规范RPM进行打包发布,需要获取到相应的软件RPM发布包,然后用RPM命令进行安装,但…

2024年高校建设大数据实验室建设的意义

数据挖掘与大数据分析是以计算机基础为基础,以挖掘算法为核心,紧密面向行业应用的一门综合性学科。其主要技术涉及概率论与数理统计、数据挖掘、算法与数据结构、计算机网络、并行计算等多个专业方向,因此该学科对于实验室具有较高的专业要求…

Vue—指令

文章目录 指令初识 和 v-htmlVue指令1.v-html(动态解析标签)2.v-show(display) VS v-if(添加和删除)3.v-else和v-else-if(与v-if一起使用)4.v-on①v-on两种用法②v-on调用传参 5.v-b…
最新文章