背景

公司目前主要聚焦于视频这个领域,利用视频为媒体、文旅、会议等行业进行赋能。

既然聚焦于视频领域,那么视频转码则是绕不开的话题。

为了降低成本,以及保证产品的核心能力,公司自建了一套转码系统。

转码服务除了尽可能多的兼容业界的视频格式外,转码的速度是另一个非常重要的指标。

因为视频转码对用户来说,感知最强的就是视频转码速度。

假如用户上传了一个1分钟的视频,转码花了10分钟甚至更久的话,用户肯定就不愿意使用我们的产品了。

对于用户来说等待的时间越短越好,对于转码服务来说转码速度越快越好。

我们先从转码流程说起,在聊一聊目前系统存在的问题,以及为serverless改造所做的努力。

转码流程

众所周知,转码是CPU密集型任务,一个长视频在单机上可能要转很久。但如果能用尽可能利用多的CPU去进行转码,那么转码速度将会大大加快。而现在丰富的云产品能够在短时间内提供大量的计算能力,以阿里云为例,阿里云提供了函数计算、Serverless应用引擎等serverless产品能够支撑起我们所需要的计算能力。

于是为了提高转码倍速,我们将

  1. 视频进行切片,每一个切片都是一个转码任务。一个长视频经过切片以后就会被切分成大量转码子任务。
  2. 将转码子任务调度到不同的机器上执行,充分利用不同机器上的CPU资源,提高转码速度
  3. 当所有的转码子任务都执行完毕以后,再进行汇总合并输出转码后的视频

流程如下:


切片 转码 合并
输入视频 ------> (n个)转码任务 ------> (n个)转码结果 -----> 输出视频

改造前的系统架构

再来看看我们的系统架构。

之前转码服务是一个应用,同时肩负着调度和转码的职责,其中:

  1. 调度主要是跟MySQL、Redis打交道:用Redis维护任务队列;MySQL则用来保存任务的执行状态
  2. 转码则是执行任务:读取文件系统中的源视频,转码后再将视频写入到文件系统中

大规模集群面临的问题

上面有提到为了提高转码速度,我们会有多个转码服务实例进行转码,但是上面的系统架构会限制转码集群的实例数。

上面的系统架构中,转码服务既承担了转码职责,也承担了调度的职责(获取任务、以及更新任务状态)。不符合存储(Redis、MySQL等数据层)与计算分离,无法大规模快速获取计算能力。

因为承担了调度的职责就不可避免的要与Redis、MySQL打交道,启动服务时就要与Redis、MySQL建立连接,且不说建立大量的连接Redis、MySQL能不能承受的住,光是建立连接所需要花费的时间就是一笔很大的浪费。

serverless改造

为了提供大规模的转码计算能力,我们决定对转码服务进行改造。

方案

改造的方案主要思路是将存储与计算分离,说大白话就是讲调度职责与转码职责进行分离,这样就可以只对转码计算能力进行扩容。

这里主要聊转码(计算)节点的改造点,主要有2个:

  1. 移除数据层的访问操作(剥离调度服务能力),避免建立连接
  2. 优化启动速度,尽可能缩短应用启动时间

移除数据层的访问操作

将转码(计算)节点的数据层访问操作全部都移除后,如何与调度服务进行通信呢?比如获取任务、提交转码结果需要通过调度服务访问Redis和MySQL。

一般有2种选择:dubbo或者http。我最终选择使用http进行通信。

这里先说一下为什么没有选择dubbo:还是上面所提到的、需要建立连接的问题,如果使用dubbo,那么就需要与zk等注册中心建立连接。而且如果发生大规模上下线(如发布)操作,那么势必给注册中心带来巨大的推送压力。

选择http进行通信,摆在眼前的第一个问题是:转码(计算)节点怎么知道调度节点的访问地址?

因为我们的服务部署在k8s集群中,借助k8s内部域名天然的解决了获取调度节点访问地址的问题。我们只需要访问调度节点在k8s中内部域名地址就可以访问到调度节点接口,而无需关系发布所带来的ip变化等情况。

使用http进行通信,调度节点除了需要做好优雅下线,避免http请求被意外终止;还需要做好数据幂等的措施。

提高应用启动速度

作为云原生应用,不会常备很多计算资源,但是需要的时候希望马上就有,这就要求应用启动越快越好。

影响应用启动速度的主要有下面2点:

  1. 拉镜像
  2. 应用启动

拉镜像的速度

我们选择了阿里云 sae job作为serverless载体,sae job刚好有一个镜像加速的能力:拉镜像到启动镜像可以做到15s,还可以接受,这块就不展开了。

应用启动

这块主要是尽可能的将非必须的代码移除,减少springboot扫描的bean,目前启动时间在6s左右。

另外也在尝试使用graalvm编译成本地可执行文件,测试的启动时间约1s左右。因为涉及到SpringBoot大版本变更以及JDK版本变更,这个方案还在测试,没有发布到生产环境。

改造后的系统架构

效果

serverless改造后的转码服务,带来的效果有2个:

  1. 带来更高的转码速度:在面对大量转码也不用担心转码慢的问题,一个字-扩!
  2. 成本的显著降低:得益于按量付费的模式,只需要为实际使用的计算资源付费,无需预留计算资源。

转码服务serverless探索的更多相关文章

  1. FPGA加速:面向数据中心和云服务的探索和实践

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由columneditor 发表于云+社区专栏 作者介绍:章恒--腾讯云FPGA专家,目前在腾讯架构平台部负责FPGA云的研发工作,探索 ...

  2. Android源码服务专家(申明:来源于网络)

    Android源码服务专家(申明:来源于网络) 地址:http://www.javaapk.com/topics/demo/page/20/

  3. 使用 Docker 和 Nginx 打造高性能的二维码服务

    使用 Docker 和 Nginx 打造高性能的二维码服务 本文将演示如何使用 Docker 完整打造一个基于 Nginx 的高性能二维码服务,以及对整个服务镜像进行优化的方法.如果你的网络状况良好, ...

  4. DotNet 使用阿里云媒体转码服务

    公司项目中一部分文件放到了阿里云 OSS 上,其中有些音频文件是 amr 类型的,在后期使用的时候比较麻烦,所以需要转换成 mp3 的文件,方便以后使用.本来想使用 ffmpeg 处理,但由于文件都存 ...

  5. 别再问WiFi密码了,HMS Core统一扫码服务让手机一键联网

    现代生活离不开网络.在餐厅.商场等公共场所,手机连接WiFi一直是高频使用场景.虽然公共场所的免费WiFi越来越多,但网络连接过程却很麻烦.有的需要打开网页注册或点击广告链接才能上网,还有的要求下载特 ...

  6. Netty(6)源码-服务端与客户端创建

    原生的NIO类图使用有诸多不便,Netty向用户屏蔽了细节,在与用户交界处做了封装. 一.服务端创建时序图 步骤一:创建ServerBootstrap实例 ServerBootstrap是Netty服 ...

  7. RPC服务框架探索之Thrift

    前言架构服务化后,需要实现一套方便调用各服务的框架,现在开源如日中天,优先会寻找开源实现,如果没有合适自家公司业务的,才会考虑从零开发,尤其是一切以KPI为准绳的公司,谁会跟钱过不去?N个月之前,公司 ...

  8. eureka源码--服务的注册、服务续约、服务发现、服务下线、服务剔除、定时任务以及自定义注册中心的思路

    微服务注册后,在注册中心的注册表结构是一个map: ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>& ...

  9. 关于基于Nexus3和Docker搭建私有Nuget服务的探索

    背景简介 NuGet是Microsoft开发平台的程序集包管理器,它由客户端工具和服务端站点组成,客户端工具提供给用户管理和安装/卸载软件程序包,以及打包和发布程序包到NuGet服务端站点等功能,服务 ...

  10. 口袋微博android源码服务端和客户端

    刚刚在源码天堂看到了一个不错的安卓SNS应用源码,而且也比较完整的,它基本具备了新浪微博的所有功能,包括查看最新的微博.微博评论.好友资料.回复评论以及发私信等,除此之外,还提供了许多独有的特色功能: ...

随机推荐

  1. Thrift RPC添加access log

    前言: 当我们在部署web服务的时候,web容器通常都会记录来自客户端的访问日志.而当我们使用Thrift RPC服务的时候,Thrift服务则不会给我们自动记录客户端的访问日志. 通过这篇文章,你可 ...

  2. view-design tabpane禁用后renderHeader失效问题

    需求是这样的 在tabPane的renderHeader里面添加hover事件(使用组件自带的Poptip)能显示提示 其实这个不算是问题,设置disabled属性后,原本的元素上面添加了 ivu-t ...

  3. [数学建模]层次分析法AHP

    评价类问题. 问题: ① 评价的目标? ② 可选的方案? ③ 评价的指标? 分层 目标层.准则层.方案层 层次分析法可分为四个步骤建立: 第一步:标度确定和构造判断矩阵: 第二步:特征向量,特征根计算 ...

  4. python前言

    目录 一.typora软件以及markdown语法介绍 1.输入标题的两种方法 2.无序列表 3.有序列表 4.在typora里插入多行代码块 5.制作表格 6.表情包 7.链接 8.Typora查看 ...

  5. easygui的简单使用——实现猜字谜小游戏

    游戏:随机生成个谜底,每轮有3次机会,猜对了结束本轮游戏,猜错了提示猜大了还是猜小了,并显示剩余次数,3次用完后本轮字谜游戏结束,可重新开始猜字谜,也可结束游戏 # 使用 easygui 实现猜字谜游 ...

  6. 推荐给Amy的书单

    目录 皮囊 推荐等级 ※ ※ ※ ※ ※ 白夜行 推荐等级 ※ ※ ※ ※ ※ 人生 推荐等级 ※ ※ ※ ※ 活着 推荐等级 ※ ※ ※ ※ 许三观卖血记 推荐等级 ※ ※ ※ ※ 皮囊 推荐等级 ...

  7. 使用插件式开发称重仪表驱动,RS232串口对接各类地磅秤数据实现ERP管理

    在ERP系统中,采集一线的生产数据是重要工作之一,而称重计量是企业的核心资产数据,人工计重费时费力,还容易出错,重量数据是否正确,直接影响企业的采购或销售额.基于此,由系统对接电子秤实现自动抓取数据是 ...

  8. 网络流棋盘模型 | P3355 骑士共存问题 P4304 [TJOI2013]攻击装置

    题面(骑士共存问题) 在一个 \(n \times n\) 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入. 对于给定的 \(n \times n ...

  9. 文本纠错:提升OCR任务准确率的方法理解

    ​文本纠错:提升OCR任务准确率的方法理解 摘要:错字率是OCR任务中的重要指标,文本纠错需要机器具备人类水平相当的语言理解能力.随着人工智能应用的成熟,越来越多的纠错方法被提出. 近年来深度学习在O ...

  10. Task记录1.CancellationToken 取消Task任务的操作

    //1.创建取消令牌数据 CancellationTokenSource tokenSource = new CancellationTokenSource(); //2.创建取消令牌 Cancell ...