谈起 Serverless 计算,在技术圈热度很高 —— 所有人都在说 Serverless,大家都声称在做 Serverless,但每个 Serverless 又不一样。我们不禁想问,Serverless 是不是只是一个炒热度的空洞热门词?
其实不然,Serverless 作为一种更易用、低成本、免运维的通用计算服务,已经在互联网核心业务中承担重要的算力角色,适用于各种计算应用场景。也正是因为其作为通用计算支撑,场景众多,业内使用 Serverless 计算的场景覆盖广泛,随处可见。
纵观国内 Serverless 领域,腾讯云 Serverless 已在众多互联网计算服务场景中发挥重要的作用。腾讯云 Serverless 技术已广泛应用于数百家企业,成为企业核心业务的支撑,是早已经成熟的技术。我们熟知的 58 短信、百视通、新东方、腾讯地图等企业的视频转码计算的业务,已经完全基于腾讯云 Serverless 计算服务支撑。
在新东方的核心业务 —— 课程视频转码计算的业务中,已经基于腾讯云 Serverless 计算服务落地。一般的业务场景对资源的需求通常有两类,一类是计算密集型,需要强大的计算力支持;一类是 I/O 密集型,偏重于网络和存储。对于新东方来说,随着在线教育行业的火热,线上教育正逐渐成为新东方的核心业务。而新东方的核心业务中的视频转码部分就是计算密集型业务,需要性能强大又经济耐用的算力解决方案。
在视频应用、社交应用等场景下,用户上传的图片、音视频的总量大、频率高,对处理系统的实时性和并发能力都有较高的要求。传统的容器服务,需要用户自己维护容器集群,弹性伸缩效率较低。
如果使用腾讯云 Serverless 云函数,当用户上传的视频短片,可以使用多个云函数对其分别处理,对应不同的清晰度,例如:1080p 、720p 等,可以满足不同场景下用户的需求,同时,也满足移动网络带宽较小且不稳定的特性。
腾讯云 Serverless 云函数在视频应用、社交应用等场景下的核心价值:
使用云函数 + ffmpeg 和 COS 联动做音视频转码的运行原理如下图:
对比优势(和传统容器服务)
如上图所示:在实现方面,两者差别不大;开发流程上,云函数更加简单高效;云函数自带能力较完善,如果需要对接自建平台,起 agent 不如容器方案简单。在运维方面,云函数更加易用和省心,在费用方面,云函数相比容器服务可节省费用 30% 以上。
使用腾讯云 Serverless 云函数实现音视频转码服务的优势:
当然,当现有业务引入云函数时,需要注意以下两点:
下面我们以新东方为例,看看新东方是如何实现业务迁移,使用腾讯云 Serverless 云函数的。
在每年暑期的时候,都会有大量的学生在新东方的平台学习。以前新东方都是在自建的机房里基于服务器和 NFS 来实现音视频课程的存储和转码逻辑。但是由于暑期流量比较大,IDC 里的服务器不一定能满足计算需求,同时自建服务的硬件采购周期较长,于是期望寻找一种弹性的方法,既能够支持快速业务部署,又能高效的完成转码功能。
凭借腾讯云云函数 (SCF) 的强大联动能力,新东方将视频上传、视频处理、图片处理、存储场景有机地整合为一体。腾讯云 Serverless 云函数支持自定义转码函数,帮助新东方快速搭建定制化任务处理能力,弥补当前单独云服务的功能盲点,把 ffmpeg 业务方便地从物理机、云主机或容器中移植到云函数。
技术方案上,在云上采用云函数+ COS 的方式,可以支持弹性伸缩,即使把本地流量全部切到云上,也能有全部承载。那么新的业务流程,就会加入任务调度模块,当业务流量过来的时候,可以自动或者手动把流量分别导入自研服务和云上服务,并在流程里加入了很多高可用的技术,比如通过任务 TraceID 进行全链路追踪、云端计算失败本地重新计算一次等。新的方案里,云端服务开发起来很简单,且不需要投入太多的运维精力。
最后,费用方面相对也很低,用多少付多少的云函数计费方式,帮助新东方节省了成本。
下面通过一个简单的实践 Demo,一起来体验一下吧!
以广州地域为例:
参考文档
- CFS 配置及使用文档可参考:挂载 CFS 文件系统,如果视频文件小于 500MB,可以不用操作该步骤。
- 云函数运行角色使用说明可参考:创建函数运行角色。
登录云函数控制台,选择地域后,新建函数,选择运行环境 Python 3.6,搜索「转码」,选中模板函数后,点击「下一步」。
在页面末尾左下方,点击「高级设置」
配置环境变量,并启用运行角色。 target_bucket:转码后的视频,上传到已创建好的对象存储 bucket 中。 target_path: 转码后的视频,上传到 bucket 的指定目录中。 运行角色:云函数在运行时,会使用运行角色换取临时秘钥,操作读取和写入 COS Bucket 的资源。
点击「完成」,完成函数创建。
在函数侧边栏「触发器管理」,创建 COS Bucket 触发器,如果用的同一个 Bucket 存储源视频和转码后的视频,一定要在触发器这里配置前缀过滤规则,如 demo/。
如果已经开通了 CFS 挂载服务,则可以在侧边栏「函数管理」->「函数配置」-> 编辑,同时启用私有网络和文件系统挂载能力。如果启用了 CFS 挂载,则需要在代码中修改文件上传路径,注释掉 76 行代码,添加 77 行,把 /tmp/new-
改成 /mnt/new-
,如下所示:
在 COS 控制台对应的 Bucket 目录下,上传视频文件,并到对应的转码目录下查看是否生成压缩的视频文件。
根据视频大小不同,压缩时间也不同,如果视频过大,压缩时间会比较久,需要较长的时间才能查看到新视频。
在云函数控制台查看函数运行日志,如下:
在函数控制台上还可以查看监控和配置告警,如下:
基于本 Demo,还可以扩展支持自动化 CDN 刷新 /预热的能力,比如转码后的视频在回传 COS Bucket 时,还可以触发新函数执行 CDN 刷新 /预热功能,该功能可以在 COS 控制台上一键开启。
ffmpeg 是非常强大的转码工具,除了转码、视频压缩等,还可以做视频切片等,通过修改代码里的命令参数,可以非常方便的实现该能力。甚至和云上的 AI 接口结合,实现视频加字幕等功能。
感兴趣的同学还可以借助云函数的高并发能力,实现快速转码或者切片功能。如函数 A 做任务调度,函数 B 做实际的转码 /切片工作。这里可以借助 CFS 挂载能力,轻松实现跨函数的文件共享功能。