金山视频云:直播平台的高并发架构设计 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Recommended Services
Amazon Web Services
LeanCloud
New Relic
ClearDB
ksyun
V2EX    云计算

金山视频云:直播平台的高并发架构设计

  •  1
     
  •   ksyun 2016-06-29 15:57:18 +08:00 6129 次点击
    这是一个创建于 3449 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Part 1 :兴起及现状


    日常生活用手机来看视频的次数越来越多,时间越来越长,看的内容也是种类越来越多。包括最近从 3 月份美国开始火起来之后,国内也在火的移动视频社交类。这个也是我们现在在重点切的一个垂类,这个垂类为什么现在会火?我们总结下来一部分原因是因为它的娱乐性很强,延迟很低,和主播有强互动的可能,所以越来越多的人在关注。国内现在起码有几家已经上线,有几十家正在联系准备上线,其中总归会有几个火起来的。 t 这就是对我们现在接触到的这些行业做了一些分类,有综合类的,就是用户产生内容,以娱乐为主,不对用户产生的内容做强的划分。会有一些建议,但是不会强制要求。还有一部分行业性比较强的,像财经、体育,教育这些类。

    还有就是最广泛的秀场类的,这个盈利模式也是最清晰的,它的量特别大,主播依赖特别强的这种业务。这部分厂商的核心需求很明确,大部分来自于他们的业务需求,他们擅长做的是装机量,保持高日活,保持主播和用户之间的黏性,然后怎么做商业化,商业化已经让很多人头疼了,这些事情够他们忙,而且是他们擅长的。

    但是在多媒体的这部分,门槛很高,以前做点播业务,像两年前我在做媒体云的时候,当时都是点播的业务。做到后面,我觉得点播业务其实并不像想象的那么难,你想你有一个稳定的存储,找一家靠谱的 CDN ,然后找一个大概能用的播放器就做出来了,这有什么难的呢?你可以找云服务公司,也可以找外包,或者你自己招一个人都能做。但是现在发现到了移动,尤其是 3 月份移动直播火起来之后,这个门槛突然变高了。因为内容产生方变成了移动端,后面会详细说。

    Part 2 :核心需求


    先说一下这个核心需求为什么会出现。大家在看移动直播的时候,如果有人关注的话,会发现那些主播经常问的一句话就是“卡不卡,是不是又卡了,我要疯了,又卡住了”。你们看点播的时候,看短视频的时候,不会有人这么问吧?不会说你们看短视频,它又卡了,这种问题是最近才出现的。真正的客户都已经返回这种问题了,说明流媒体的门槛又变高了,所以他们对流媒体的需求是在增长的。那我们就看一下这些需求都有哪些。

    1 、首先内容产生方就是推流端,现在主流的 IOS 、安卓, IOS 比较简单,就是那个几个机型,基本大家适配都很好。但是安卓的碎片化是非常严重的,大量的精力都需要做对安卓的适配,而且软编耗电量普遍非常高,手机用了一会就会发烫,都担心会不会爆炸。用户体验就是在不同的网络情况下,上传的视频有可能会卡,有可能不连贯,报各种各样的错误,这个是作为一个开发者他自己不可能去适配的。说白了从用户那边提的需求就是推流端不能卡,画质要好,不能太烫,这是我们接触到的客户真正提的问题,是我们从有点偏技术的角度抽取出来的,它背后对应的是哪些事情。

    2 、然后是分发网络。分发网络其实躲在一个很后面的地方,用户其实看不见的。真正对分发网络提需求用户也提不出来,所以基本这部分需求都会提给播放端,提的需求也是不能卡,不能花屏,首屏一定要快,一点就要看到,还不能把延时弄的太大。其实这些很多都是和源站分发网络有关系的,只是用户看不到这个需求会跟后面的播放器接在一起。

    对这个需求我们做一些抽象来说就是用户的可触达性要好,我们的 CDN 节点要在全区域、全运营商有覆盖,包括教育网。有很多人,像那些小运营商都会忽视教育网,我们也遇到过这样的例子,教育网确实不好接,因为节点不够多,这其实不是什么难点,只是一个坑,注意到了就能做到。低延时的操作大部分来自端的配合,服务端只要是做好缓存,保证这个数据是连贯的。如果要丢数据的话,把关键帧保留好,丢 GOP 中间那些 PB 帧,主要是在端上会收到。

    首屏时间,就是用户点开就要看,以前那些开源架构就是 rtmp server ,它是做不到一点开就能看的,现在一些开源的国内资源写得也比较好了,可以看到。我们是自己开发的,所以也花了一些工作,能保存之前的关键帧的信息,用户一点开就能看,这个就是很细节的东西了。如果这个做不好的话,会黑屏、绿屏,或者是半天看不着图像。

    3 、在播放器这边也是我们在接业务的时候,遇到用户投诉最多的,因为所有的问题都是在观看的时候体现的,所有的雷都得是播放器的同学去扛。这个需求也是不能卡,不能延迟太高。如果延迟高了,要追回来,追的时候声音不能变,最好是追的策略也能自己控制,这是用户真正提出来的需求。

    对于我们来说,要满足这些需求,我们需要做好多分辨率的适配,保证好流畅性,保证好我们追赶的策略不会出现任何异常。所以这三个端很多是相互耦合的,像推流和分发在一起,要保障好用户的流畅性和画质,分发和播放器在一起要保证好低延时和播放的流畅。所有的这些需求里共同的一点就是不能卡,后面我们在设计方案的时候,也是重点考虑怎么能做到不卡。

    Part 3 :解决方案


    t

    这个是我们这边的系统架构图。最下层是依托金山的云服务,因为我们已经有了很好的平台,提供了我们计算资源,提供了存储,提供了很多自建的节点,当然还不够多,我们还是个融合 CDN ,然后提供了数据分析的能力。我们依托它做了橙色的这一层,就是我们自己的核心,流媒体直播,然后围绕这个核心我们再做的回看点播、在线转码、鉴权、内容审核。

    为什么要做回看点播?因为这不是一个短视频录播的项目,而是一个直播,直播就决定它的并发不会很高,内容不会很多,热点比较少。如果你不回看的话,用户很难维持它的日活,很难维护用户黏度,所以用户一定会要求做回看的。

    为什么要做在线转码?推流端其实做了很多把更好的画质想尽办法传上来的工作,投了很多人力来做。传上来之后,观看也在移动端,它不一定看得了。如果他看不了怎么办?我们就需要在线转,在线转码其实承担的更多更重要的事情。

    鉴权,用户都不想被盗链,尤其是推流的时候,如果我不鉴权,谁都可以来推,推个法 lun 功怎么办?这是必须要有的。内容审核,现在我们没有办法帮他做到自动审核,技术还不够。现在做到的是截图,按用户指定的时间定期截图,这样的话,用户就可以请一些外包来看是不是有敏感内容,是不是要下线,这个对于现在这种三四秒延迟的直播来说非常重要。你做不到的话,没准政策因素你就做不下去了。

    数据分析一部分是依托金山已有的,一部分是我们自己做的,因为我们延迟性,时效性要求更高。客户会经常大半夜突然提出一个主播看起来特别卡,问你为什么,要是像以前那种方式,一个小时生成报表,然后出体验图,告诉他为什么卡了,客户可没有这个耐心。

    我们现在基本能做到 5 秒间隔就出之前的各种问题定位,这个定位包括从源站收集的数据画的曲线。还有从端上,如果端上用户允许的话,推流和拉流端我们都会有上报数据,几个曲线一拟合,我们就知道问题出在哪里。所以现在不止是 RD 可以来查这个问题,我们很多售前都在承担着帮用户出这个图的工作。

    t

    这个是介绍业务具体的流程图,这个流程图并没有什么特别,只是一般的流媒体的数据走向、各种请求。但是其中有一些坑我可以跟大家重点说一下,首先看一下直播发起流程,这肯定是由应用向自己的服务端去请求一个推流地址,这个推流地址他就用来向我们的流媒体服务器推,然后我们给它鉴权。

    鉴权之后,它可以在参数里选择是不是要录像。如果需要录像截图,或者需要 HLS 的分发,我们都可以帮他做,做完之后存到我们的存储里,这也是后面会提到的,我们各个业务之间在做隔离、分不同的优先级,这种后端的多媒体的处理尽量都会依赖别的服务,然后就是正常的结束流程。

    这个是实际中遇到的一个问题,现在做流媒体,用户推流,他想知道这个流结没结束,一般互联网公司做云服务都怎么做?都是给回调,如果这个推流结束了,我来回调业务方,让业务方知道我结束了,你可以做你的逻辑了。

    但实际操作中我们遇到了问题,就是业务方的服务器没那么可靠,我们可能过去时间特别久,有延时,有丢,或者他们的服务稳定性我们也确认不了,这其实就是一个双方的耦合了。而且它的服务器,由于是我们来调,它的鉴权功能没有办法做得很复杂,他自己的服务器也存在安全漏洞。如果有人来攻击他的话,他的整个业务流程的状态全是乱的。

    在试了几家客户之后,我们就改成另外一种方式,也是大家普遍都接受的,就是由 APP 和自己的 Server 发心跳,如果 APP 的网络不异常的话,它自己结束它的 Server 肯定是知道的。如果异常的话心跳断了,他也会判断出是结束了的。而且我们这边源站服务也会保证,你 5 秒钟没有数据就一定是结束的了,我们会把你的流给踢掉,这样就能达到用户的业务状态也是稳定的,我们的流媒体服务也是稳定的,而且耦合也会比较少。

    这是我们实际遇到的一个坑,这个其实不难,只是看现在普遍云服务提供商还都是在用回掉的方式,所以我特别提一下另外还有一种可选的方式,效果更好。

    播放的流程,播放器会先向他自己的服务请求播放地址,然后来我们这拉流,可以是鉴权也可以不鉴权,取决于它的业务形态。如果拉流失败,我们有一些定制化的操作,他用 RTMP 来拉流的话,我们会告诉他具体是什么错,包括鉴权失效,鉴权参数错误,还是这个流有问题,我们都会在状态告诉他的。这是之前用户提到的需求,说是播放需要知道哪里出了问题,所以我们尽量把状态码都特别详细的返回给用户。包括我们源站也有查询接口,如果他需要那种统一查询也可以来查。

    文章作者:郝明非,金山云视频技术总监
    6 条回复    2016-12-18 23:18:51 +08:00
    McContax
        1
    McContax  
       2016-06-29 18:11:01 +08:00 via Android
    我能否问下你家的 github 库是否 abuse
    leonayy
        2
    leonayy  
       2016-06-29 20:44:28 +08:00
    Mark
    techme
        3
    techme  
       2016-06-30 00:36:39 +08:00
    学习一下,对于云服务还是没有深入的使用体会
    great2soul
        4
    great2soul  
       2016-07-01 17:17:05 +08:00
    一些最近都在讲的点,难得看到一篇说的这么细致 清晰的
    great2soul
        5
    great2soul  
       2016-10-03 21:13:19 +08:00
    @McContax 不太了解。我个人的应该不会。
    chenjin3
        6
    chenjin3  
       2016-12-18 23:18:51 +08:00 via iPhone
    清晰易懂
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2055 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 16:11 PVG 00:11 LAX 08:11 JFK 11:11
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86