1.VIPKID介绍2.核心业务场景3.技术实现4.总结
VIPKID是一家在线青少儿英语教育平台,成立七年以来,公司坚持以赋能教育,启迪未来为使命,专注于一对一的线上教学模式,采用100%的纯北美外教,学员遍布63个国家和地区。
截止目前,仅付费学生规模超70万人,单日一对一课量超10万节,高峰时段课程并发最高达到3.5万节。拥有覆盖了全球35个国家的5条跨海专线,在16个国家、55个城市完成数据中心传输节点布局,能够根据实时动态在一分钟内完成智能切换[1]。
在一对一(一个老师和一个学生)模式的上课过程中,老师通过直播的形式以课件为辅助进行授课,互动的形式不仅包括直观的声音和视频还有聊天室以及在课件上写字划线拖动动作等,整个课程中涉及多个组件模块。
各模块以协同依赖的方式提供服务,其中任意环节发生的事件对老师和学生都要做到可见和同步,如老师可看见学生在教室才能开始上课、学生可听见老师说话、学生可看到老师翻页课件等才能继续正常上课直到结束。
在大规模网络教学中,流媒体实时互动直播和消息实时数据传输严重依赖用户设备和网络,数据体量大,尤其我们是跨海传输的情况下变得非常棘手,对于网络稳定性有着非常苛刻的要求。
与大班网课直播相比,1v1更注重互动,所以对问题的容忍度极低,任何一方的问题都会影响上课体验。其中场景之一为当出现网络等异常问题时,用户就会点击”Help“按钮进行求助,此时需要监课人员(以下简称“FM”,来自Fireman缩写)立刻介入处理,这对服务人员的规模和操作实时性有较大的需求。
目前在只有人工处理用户Help的模式下,由于日均Help请求量大(约占总课程的10%),人均监课量大,同时从接收到请求到监课人员介入处理问题也需要辗转多个流程,会有以下问题:
为了解决上文提到的业务痛点问题,经过各环节业务特征提取及梳理,我们设计了一种通过实时计算来产出业务标签,并应用标签数据进行自动监课来解决用户Help的方案。下文将重点描述整个方案的技术实现细节:涉及到数据体系建设、自动化业务系统建设、核心问题与优化以及最终收益效果:
整个数据体系建设的初衷是解决数据从哪里来、数据的业务逻辑是什么、如何计算、如何统一管理以及赋能更多场景,解决更多业务问题。
Vlink数据平台是基于在FlinkStreamingJob开发过程中一些问题的反思后,借鉴服务端开发上线流程,以研发人员为中心的提高开发效率,降低维护成本为出发点而设计研发的系统,并支持数据采集管理、打点接入管理、打点测试集成等功能。
1.交互式运行作业:
2.批量执行操作:
在部分场景下需要部分或全量作业重启,当作业量很大时,是个费时费力的过程,而且比较容易出错,那批量构建、停止与运行就变得很轻松,如:
3.SP功能:交互式创建运行SavePoint。
4.血缘关系图:体现数据从打点到最终产出这一链路的上下游关系。
从图中可以清楚地知道处理程序P1、P2和P3的输入输出。
5.其他功能:
1.提供'AbstractJobModel',统一Schema化输入数据:
2.提供统一的灵活的KafkaSource初始化方式
4.支持常用的三方连接组件
数据采集是整个数据处理架构的基础且重要环节,数据采集的实时性和准确性将直接影响到上层业务,采集方式有间接上传文件的方式和直接Http打点的方式。
事件数据埋点涉及到移动端、PC端和服务端,以进教室为关键事件点:
整体而言埋点上有问题标签也有正常标签,按照进教室事件和组件类型,由粗到细可分一级、二级和三级。
本次业务计算对实时性要求极高,在技术选型上以Flink为主[2],天级别的离线数据分析会以Spark为主。
标签计算是整个自动化处理的关键点,指标计算的速度代表着系统能处理的速度,数据来自多个业务流,结合当前的业务场景下,比较典型的计算场景有:
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)valstream=env.addSource(singleSource).name("signal").union(env.addSource(avSource).name("av")).union(env.addSource(dbySource).name("dby")).union(env.addSource(enterSource).name("enter")).filter(_.f).filter(_.unNature).assignTimestampsAndWatermarks(newDummyEventTimePunctuWaterMarks[InlineInputEventForm](6*1000)).filter(m=>***).name("***")val***Streaam=stream.filter(f=>***).keyBy(key=>***).window(TumblingEventTimeWindows.of(Time.milliseconds(30*1000L))).sideOutputLateData(***lateOutputTag).apply(***WindowFunction)sink***ToKafka(***Streaam,***name,recordFilter60s,***kafkaSink,recordTmKafkaSink)注:*表示业务脱敏处理(下同)
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)AsyncDataStream.unorderedWait(stream,syncGet***Function(),500L,TimeUnit.MICROSECONDS)另外,维度数据计算时,根据实效性通过GuavaCacheBuilder[4]进行热数据缓存。
我们通过梳理上课中各关键环节点遇到的问题,从业务上,提出在用户发起Help后,且FM介入前做一层实时自动化服务的业务解决方案。
从技术上,该自动化业务系统构建在整个数据体系之上,以上课过程中实时标签数据为基础,然后由标签系统应用标签数据流通过预检、自检等手段自动化或半自动化来处理问题。对于系统不能处理的问题,则转人工处理。
首先,课程中的问题有两种上报方式:
然后验证逻辑模块过滤掉无效问题,如无效Help、重复Help、请求过期、FM已经介入以及特殊问题等,还有对于标签体系无法覆盖的问题(比如噪音),则直接转FM人工处理。
若请求通过了验证模块且系统可自动处理,则自检处理系统可尝试进行切线,然后进行切线验证并将切线标记放入待处理队列Pending,Pending验证阶段实时获取正常标签流以内反馈的方式检测是否恢复正常。
截止目前,整体课中用户请求量下降了近3%,没有造成其他业务指标上涨,有效提升监课人员工作效率,处理延迟低,支持多并发处理量,有效提升了课程体验。
本次以提升课程质量和用户上课体验为出发点,应用实时计算技术构建基础标签数据系统,在业务上取得了硕大的成果,也得到了公司的高度认可,除此之外也有很多意外收获,如提升了课中体验的同时也提升了人工效率、基于本次业务构建的标签系统同样也可以应用到其他业务上,如全链路故障引擎、结课类型中心等。
因为在线教育的两大技术特征为流媒体实时互动直播和消息实时数据传输,其本身就带有实时属性,在很多业务场景上如课程实时进行、人员实时跟进服务等实时计算有诸多的用武之地。
作者简介
甄国有,VIPKID在线教室技术研发中心高级数据工程师,负责在线教室实时计算体系的落地和场景化,专注于数据体系建设和架构。