2016 年 4 月 16 日,又拍云 Open Talk NO.21 期活动落地上海,本期活动主题为“在线教育:技术让知识触手可及”,Edusoho  架构师杨帅作了《Edusoho 教育云在好知网的应用》的分享,以下是分享实录:

image.png

今天跟大家分享在线教育的话题,我打算结合我们公司的发展历程,从技术、平台、业务这些方面来进行讲述,希望能由此开展一些交流。

阔知简史

image.png

首先介绍一下,我们是杭州阔知网络有限公司。2011 年,我们的创始团队在受益于教育的同时,也希望让其他的人获得教育,获得知识,所以就创建了「好知网」这样一个在线教育分享的学习平台。在这个平台上,你既可以分享自己的知识,同样也可以通过别人分享的知识来进行学习。

这个产品一发布就受到了大家的欢迎,然后在 2012 年 5 月份成为四大学习社区之一。到了 2013 年,很多线下教育机构可能看到了在线教育的趋势,于是他们就会想做一个跟系统很像的平台,把线下教育的业务移到线上来。接着,我们就在「好知网」的基础上进行重构,做出了 Edusoho 的第一个版本,在 2013 年 10 月份正式发布。

2014 年 9 月,我们的用户就已经接近 8 千家。同年,我们又推出了教育云的服务。截至目前,我们 Edusoho 的客户已经超过了 2 万 2 千家。

这就是我们的发展历程。

选择开源

image.png

我们 Edusoho 网校是开源的,在说开源之前,我不得不提一下,有很多公司对自己的代码都很保护。Edusoho 为什么要开源呢?我们创始人 Kent 在接受采访的时候说到两个事情,一是开源可以让教育机构以更小的成本建立自主掌控的网校系统,二是开源可以让教育机构在 Edusoho 主系统的功能基础上,通过自由安装不同的教育应用,来适应自身不断发展的教育需求。

 同时,我们还提出了一个设想,希望在 Edusoho 开源网络课堂的基础上,聚集网络基础设施提供商,比如服务器、视频托管、域名等,还有软件开发商、视频制作公司、运营推广服务商等,然后搭建一个完整的在线教育平台,为教育机构提供各种功能或者插件,让大家在建立教育网站的时候就像搭积木一样简单。

敏捷开发,快速迭代

image.png

我们的开发方式遵循敏捷开发和快速迭代的原则。在过去一年中,Edusoho 系统总共更新了 113 次,新增了 23 项大功能,进行了 198 次优化,总计修复了 197 次,平均 3.23 天更新一个版本,速度非常快。而且,我们的更新和优化都是根据客户应用上的问题,或者系统上的问题进行调整。

持续集成

image.png

我们在快速更新的同时,也会通过持续集成来对代码进行保护。我们在这一块的工作形式比较多样,比如每日例会、敏捷任务板,还有每周一和周三的知识分享会,以及黑客马拉松这样的技术交流活动。

关于「好知网」

image.png

我们的 Edusoho 发源于「好知网」,所以这边也要简单介绍一下。「好知网」是一个专注于兴趣和生活领域的在线学习平台,我们知道在线教育有很多领域,「好知网」就是专注于兴趣和生活领域。我们希望的是,大家能在「好知网」上找到学习的乐趣,把「好知网」当成终身学习的平台。我们目前涵盖的课程已经有很多了,包括创意、设计、音乐、运动健身、互联网、语言学习、公开课等等,基本上偏重于兴趣和生活领域。

image.png

2011 年 5 月,「好知网」正式上线,然后在 2015 年 7 月份的时候,我们进行了全新改版,开始基于 Edusoho 进行开发定制,而在此之前都是自己独立开发。

Edusoho 网校系统和 Edusoho 教育云

image.png

我们知道在线学习或者在线教育的形式是非常多种的,比如说有课程、笔记、问答、数据分析,以及各种 APP 的客户端等等,这些只是一个前端的展现,而后端提供服务的都是 Edusoho 教育云,比如我们有开发云平台,你可以在上面选择你需要的插件、功能,还有云视频、云直播和云文档等等。

架构特点

image.png

我们整个系统的话是全部用 PHP 写的,同时也使用了一些像是 swoole、yar、phalcon 这样的高性能框架。然后我们采用的是开源技术,因为我们自己本身也是开源的,所以我们用框架的时候,会尽量选择一些开源的,它们一般都比较好用,也够用。还有就是一些技术服务,我们会基于第三方的基础云来做,比如云存储、云直播之类。

架构要点

image.png

首先,在分层体系上,我们的架构按照三层来做,表现层、服务层、数据库持久层,就是上图右半边的这个部分。

image.png

其次,是响应式界面设计,我们「好知网」的 Web 页面会根据访客的设备自动调整布局,为访客提供更佳的用户体验。比如上面这张图,在 PC 端的话它可以显示成竖排三栏,也可以是四栏,而在手机端的话,它就会自动调整成一栏或者两栏。如果你不考虑用户体验,这一部分的用户就很容易流失掉。

image.png

接下来,是插件设计,这是我们扩展机制中的一项。「好知网」的系统可以针对你的不同需求,让你在云平台中选择一些插件来使用。这里简单介绍一下菜单插件的功能,如果说你的导航里面要显示一个新的菜单,那么就需要在后台增加一个新模块,而这时候就能用我们的插件来自动配置,动态地把功能加进去。

 同时,我们这边会有一个菜单的 MenuBuilder,会读取指定的菜单文件,然后把菜单拉出来,当新的功能出来之后,就需要调用注册服务,把你开发的功能加载到我们的 Plugin Installed.php 里面。

 我们的网校有非常强大的定制功能,比如说语言学习对音频的处理和识别需求比较高,但是像其他的一些学习,比如说设计学习,对音频的需求就没有那么强烈,所以,我们提供差异机制,如果你做语言学习,那么你就可以在我们的平台上选择一些特意为语言学习制作的插件,其他类型的学习也是一个道理。

image.png

关于主题机制,我们网站的大部分头部都是统一的,底部也是统一的,如果全部重复写代码的话,非常不可取。我们使用的引擎支持页面继承,也就是说,你在父页面定义好以后,不同的子页面直接实现不同的东西就可以了。

 下面我们把模板的优先级介绍一下,比如 A 页面在根目录下面,我们现在根据需求,需要重新写一下,重新展现,这个也写在 A 页面上,然后放在主题文件夹下,之后当我们需要找这个页面的时候,就会根据优先级先在主题文件夹下搜索,一旦搜索到就展现出来,搜索不到就再转去系统默认路径。此外,重写页面的话,你可能就要调取不同的数据,这里我们会提供数据标签,你可以通过数据标签把页面需要的数据直接渲染出来。

image.png

在架构要点这一部分,我们的二次开发、定制,还有相应的扩展。

 对于一些核心业务的扩展,我们提供了 Service 和 Dao 的定制重写机制,具体来说就是,在需要调动 Service 的时候,你得用 Service kernel 返回一个具体实例,或者你们根据自身业务重新写的一个 Service 实例,然后我们就会通过 Service kernel 来获取,由于 Service kernel 有一个缓存的概念,所以如果把每个 Service 实例都放到里面去,就能够降低 Service kernel 的开销,我们也能够通过 Service 代理的方式,对 Service 和 Dao 实例进行包装,非常方便地对服务进行扩展。

 其实在架构的扩展机制上,可以分为横向扩展和纵向扩展,这里我简单举例介绍一下,比如说我们想象一个场景,你去养鱼,如果只是几条小鱼的话,你用小水缸就可以养起来,但是时间长了之后,这些鱼可能会长大,会增多,然后你的小水缸就养不下了,得想办法把水缸进行扩展或者怎么样,这时候有两种方案,一是买一个更大的水缸,把之前小水缸里的鱼、水草、沙子都迁移到大水缸里,二是买一个一样大的水缸放在旁边,把水缸互相打通,让鱼在两个水缸之间进行分配。刚才说买个大水缸就是纵向扩展,它是非常不方便的,你要把沙、水草都搬进去,而打通两个小水缸则是横向扩展。

关于横向扩展,首先我们这边有一个 web 的负载均衡,主要解决的问题是高并发的性能问题,它可以通过一种算法把用户的请求分摊到不同的 web 集群,然后对用户访问进行响应,对数据缓存进行集群,对数据库进行切片。其次是分布式文件存储系统,我们知道,文件如果存在一个服务器上,只有一个服务器响应会慢的,所以我们会调动 Master 访问,告诉你请求在哪里,怎么去读。再次是备份的 Metalogger Server 服务,当 Master 遇到问题的时候,它自己就可以处理 Master 的工作,解决当中的问题。然后是堡垒机,因为在集群的环境下,你要维护的服务器非常多,所以如果每个都自己登陆,应用起来会非常不方便,安全也会很成问题,但是有了堡垒机的话,所有远程网络登录都会通过堡垒机进行服务,既方便,也相对安全。

教育云

image.png

我们的后台是通过教育云来支撑的,我们提供针对教育应用技术的云,里面有云视频、云点播、云文档、PPT、DOC,由于这里的 PPT 和 DOC 不能在浏览器打开,所以我们就通过云代码等直接解决,下面还有云直播、云短信,比如你要进行交流,可以通过云来互动,发送云短信等等,此外,云搜索、云分析也可以帮助用户更好地学习,这些都是由教育云提供

image.png

这是教育云的架构图,在我们的平台上,各个网校通过 Restful API 的统一接口进行访问,通过 RPC 的方式对外提供服务,比如说短信服务、文档服务,还有视频服务,可以对视频进行切片。同时,这边会有一个监控,一旦发现某个服务节点有问题,会自动报警或者自动刷新,保证为我们的用户提供正常的服务响应。

image.png

在 RPC 的实现方式上,我们采用了 YAR 的框架,它是基于 HTTP 的,开发起来效率非常高,非常简单,写一下代码就可以搞定。然后,负载均衡的是 RPC 客户端轮询,它会对每个服务器节点进行轮询,如果服务器 N 次连接超时,服务就会自动下线,并且报警。j我们通过 PHP 实时实现了所有的 RPC 服务,并且对服务器状态进行实时监控。

垃圾用户防范

image.png

之前介绍了一下 Edusoho 网校系统的流动性,所以这边就想再介绍一下我们服务器上线之后遇到的问题,比如说垃圾用户,我想这个问题很多互联网应用都会遇到,或多或少。

 简单来说,当用户请求注册服务的时候,我们会进行验证,如果通过就允许启动注册,否则就告诉用户是非法的。这里使用的是关键词过滤,比如找医院或者乱七八糟的东西不允许注册,但这个验证其实非常滞后,因为你不知道用户会选择哪些关键词来注册,跟不上用户的节奏,所以经常发现商业用户来批量刷我们的系统。

 后来,我们做了一些调整,首先是 Iptables 的频率限制,比如说我们规定了某个 IP 地址在一段时间内只能注册几个用户,然后我们还通过敏感词过滤来扫描用户信息,扫描通过才允许注册,用户行为判定,因为垃圾用户都是相似的,批量的,会带有一些电话等联系信息,一旦判定为垃圾用户,我们就会通知管理人员,对用户进行封禁。此外,在整个过程中,我们都会通过事件来监听用户行为,并进行判定,主要就是关键词过滤,包括很多人可能会用的一些特殊符号,比如不可见字符,或者用 Q 来表示 9,用 O 来表示 0等等。

让知识变得性感

image.png

知识是有一个过程的,我们希望用心地走这个过程,把知识做得更加具象化、可视化。比如说我们「好知网」做的一个事情,大家知道,我们上学的时候听完老师讲课,下课可能会交流讨论老师讲的内容,而我们这边做的就是在你每学完一个课后,针对你当天所学的课程,提供一些话题让大家讨论。

image.png

还有就是,知识点的及时反馈是很重要的,对于加深知识点的理解有非常大的帮助,针对这个问题,我们这里有视频弹题,会显示一个小白点,在老师讲解知识点的时候,可以在这个点上把题目放出来,当学员在看的时候,也可以弹出来这个题目,能够有实时的反馈。

我们还做了一个功能,叫模拟相机。现在摄影教学比较多,会经常涉及到光圈、快门、感光度这些参数,如果你不去操作,可能就不知道这些参数是什么概念,而我们这里的模拟相机,可以让老师在讲的同时操作一下 PC,通过画面来告诉大家光圈是什么意思,快门是什么意思,感光度是什么意思等等。

我今天分享的主题就是这样,我们是杭州阔知网络有限公司,好知网是我们的一个在线教育平台,大家有兴趣可以看一下课程,谢谢!