云边协同的 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 调度从而实现更全的业务覆盖;其次,通过更多工具链系统的建设和更多的能力抽象,进一步降低业务接入边缘容器的成本, 实现分钟级的部署;第三,把更多的能力在边缘侧进行提供。
即构将会继续推动边缘容器在全球音视频场景的进一步探索和应用!
相关文章:
云边协同的 RTC 如何助力即构全球实时互动业务实践
作者:即构科技 由 51 CTO 主办的“WOT 全球技术创新大会 2023深圳站”于 11 月 24 日 - 25 日召开,即构科技后台技术总监肖潇以“边缘容器在全球音视频场景的探索与实践”为主题进行分享。 边缘计算作为中心云计算的补充,通过边缘容器架构和…...
使用python连接elasticsearch
有一个困惑了好久的问题,那就是从python里面连接elasticsearch总是报错。大致长这样 一开始我是看网上把es的安全功能关闭,也就是下面的内容,这个要进入到es的docker中去改config/elasticsearch.yml配置文件,但是这样改了以后kib…...
使用elasticsearchdump迁移elasticsearch数据实战
目录 1.安装nodejs 2.安装elasticsearchdump 3.迁移 4.核对数据 5.注意事项 1.安装nodejs https://ascendking.blog.csdn.net/article/details/135509838 2.安装elasticsearchdump npm install elasticdump -g 3.迁移 elasticdump --inputhttp://用户:密码源ES地址/源…...
指向未来: 量子纠缠的本质是一个指针
指向未来: 量子纠缠的本质是一个指针 概述基本概念理解量子纠缠PythonJavaC 理解波粒二象性PythonJavaC 理解量子隧穿理解宇宙常量PythonJavaC 概述 量子纠缠 (Quantum Entanglement) 是量子系统重两个或多个粒子间的一种特殊连接, 这种连接使得即使相隔很远, 这些粒子的状态也…...
Zookeeper启动报错常见问题以及常用zk命令
Zk常规启动的命令如下 sh bin/zkServer.sh start 启动过程如果存在失败,是没办法直接看出什么问题,只会报出来 Starting zookeeper … FAILED TO START 可以用如下命令启动,便于查看zk启动过程中的详细错误 sh bin/zkServer.sh start-for…...
【数据结构 】哈夫曼编译码器
数据结构-----哈夫曼编译码器 题目题目描述基本要求算法分析 代码实现初始化编码解码打印代码打印哈夫曼树 总结 题目 题目描述 利用哈夫曼编码进行信息通信可大大提高信道利用率,缩短信息传输时间,降低传输成本。 要求:在发送端通过一个编…...
大屏项目:react中实现3d效果的环形图包括指引线
参考链接3d环形图 3d效果的环形图 项目需求实现方式指引线(线的样式字体颜色) 项目需求 需要在大屏上实现一个3d的环形图,并且自带指引线,指引线的颜色和每段数据的颜色一样,文本内容变成白色,数字内容变…...
【STM32】STM32学习笔记-FlyMCU串口下载和STLINK Utility(30)
00. 目录 文章目录 00. 目录01. 串口简介02. 串口连接电路图03. FlyMCU软件下载程序04. 串口下载原理05. FlyMCU软件其它操作06. STLINK Utility软件07. 软件下载08. 附录 01. 串口简介 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简…...
oracle rac 12.2.0.1CPU使用率100%
oracle rac 12.2.0.1 CPU使用率100% 查看是集群的java进程"oracle.ops.opsctl.OPSCTLDriver config database"占用cpu 根据进程号查找父进程,发现是/oracle/GRID/122/perl/bin/perl /oracle/GRID/122/tfa/gcmproddb01/tfa_home/bin/tfactl.pl rediscover -mode full …...
LeetCode、2542. 最大子序列的分数【中等,排序+小顶堆】
文章目录 前言LeetCode、2542. 最大子序列的分数【中等,排序小顶堆】题目及类型思路及代码实现 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领…...
Linux_Docker图形化工具Portainer如何安装并结合内网穿透实现远程访问
文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 本文主要介绍如何本地安装Portainer并结合内网穿透工具实现任意浏览器远程访问管理界面。Portainer 是一个轻量级…...
【Spring Boot 3】【Redis】集成Jedis
【Spring Boot 3】【Redis】集成Jedis 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费…...
C++设计模式(李建忠)笔记3
C设计模式(李建忠) 本文是学习笔记,如有侵权,请联系删除。 参考链接 Youtube: C设计模式 Gtihub源码与PPT:https://github.com/ZachL1/Bilibili-plus 豆瓣: 设计模式–可复用面向对象软件的基础 文章目录 C设计模…...
计算机考研408的准备
计算机考研408的准备 一:专硕和学硕 计算机的学硕叫做计算机科学与技术,而计算机的专硕叫计算机技术。这么区分的意义就在于我们的就业形势和科研形式。 二:就业形势 由于本科的严重扩招以及课程设置的问题,相当大量的人在毕业…...
2.【Linux】(进程的状态||深入理解fork||底层剖析||task_struct||进程优先级||并行和并发||详解环境变量)
一.进程 1.进程调度 Linux把所有进程通过双向链表的方式连接起来组成任务队列,操作系统和cpu通过选择一个task_struct执行其代码来调度进程。 2.进程的状态 1.运行态:pcb结构体在运行或在运行队列中排队。 2.阻塞态:等待非cpu资源就绪&am…...
【管理篇 / 升级】❀ 13. FortiOS 7.4固件升级新规则 ❀ FortiGate 防火墙
【简介】飞塔防火墙的固件升级一直是所有厂家中最好的。只要有注册官方帐号,有注册设备,并且只要有一台设备在服务期内,即可下载所有型号的所有版本的固件。即使其它设备服务期已过,也可以通过固件文件手动升级,避免防…...
【前端】vue.js从入门到项目实战笔记
文章目录 第三章3.1 插值绑定({{}}, v-html)3.1.1 文本插值3.1.2 HTML插值 3.2 属性绑定 v-bind3.2.1 指令v-bind3.2.3 类名和样式绑定 【前端目录贴】 第三章 3.1 插值绑定({{}}, v-html) 文本插值中的代…...
flex布局(3)
九、骰子 *{margin:0;padding: 0;box-sizing: border-box; } .flex{display: flex;flex-flow: row wrap;justify-content: space-between;align-items: center;align-content: space-between;padding:20px; } .touzi{width: 120px;height: 120px;background-color: aliceblue;…...
JVM知识总结
1.概述 JVM指的是Java虚拟机,本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件,作用是为了支持跨平台特性。 功能: 装载字节码,解释/编译为机器码 管理数据存储和垃圾回收 优化热点代码提升效率 …...
读书笔记-《数据结构与算法》-摘要8[桶排序]
桶排序和归并排序有那么点点类似,也使用了归并的思想。大致步骤如下: 设置一个定量的数组当作空桶。Divide - 从待排序数组中取出元素,将元素按照一定的规则塞进对应的桶子去。对每个非空桶进行排序,通常可在塞元素入桶时进行插入…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
