今天跟大家分享在线教育的话题,我打算结合我们公司的发展历程,从技术、平台、业务这些方面来进行讲述,希望能由此开展一些交流。
阔知简史
首先介绍一下,我们是杭州阔知网络有限公司。2011 年,我们的创始团队在受益于教育的同时,也希望让其他的人获得教育,获得知识,所以就创建了「好知网」这样一个在线教育分享的学习平台。在这个平台上,你既可以分享自己的知识,同样也可以通过别人分享的知识来进行学习。
这个产品一发布就受到了大家的欢迎,然后在 2012 年 5 月份成为四大学习社区之一。到了 2013 年,很多线下教育机构可能看到了在线教育的趋势,于是他们就会想做一个跟系统很像的平台,把线下教育的业务移到线上来。接着,我们就在「好知网」的基础上进行重构,做出了 Edusoho 的第一个版本,在 2013 年 10 月份正式发布。
2014 年 9 月,我们的用户就已经接近 8 千家。同年,我们又推出了教育云的服务。截至目前,我们 Edusoho 的客户已经超过了 2 万 2 千家。
这就是我们的发展历程。
选择开源
同时,我们还提出了一个设想,希望在 Edusoho 开源网络课堂的基础上,聚集网络基础设施提供商,比如服务器、视频托管、域名等,还有软件开发商、视频制作公司、运营推广服务商等,然后搭建一个完整的在线教育平台,为教育机构提供各种功能或者插件,让大家在建立教育网站的时候就像搭积木一样简单。
敏捷开发,快速迭代
持续集成
我们在快速更新的同时,也会通过持续集成来对代码进行保护。我们在这一块的工作形式比较多样,比如每日例会、敏捷任务板,还有每周一和周三的知识分享会,以及黑客马拉松这样的技术交流活动。
关于「好知网」
2011 年 5 月,「好知网」正式上线,然后在 2015 年 7 月份的时候,我们进行了全新改版,开始基于 Edusoho 进行开发定制,而在此之前都是自己独立开发。
**Edusoho 网校系统和 Edusoho 教育云**********
我们知道在线学习或者在线教育的形式是非常多种的,比如说有课程、笔记、问答、数据分析,以及各种 APP 的客户端等等,这些只是一个前端的展现,而后端提供服务的都是 Edusoho 教育云,比如我们有开发云平台,你可以在上面选择你需要的插件、功能,还有云视频、云直播和云文档等等。
架构特点
架构要点
其次,是响应式界面设计,我们「好知网」的 Web 页面会根据访客的设备自动调整布局,为访客提供最佳的用户体验。比如上面这张图,在 PC 端的话它可以显示成竖排三栏,也可以是四栏,而在手机端的话,它就会自动调整成一栏或者两栏。如果你不考虑用户体验,这一部分的用户就很容易流失掉。
接下来,是插件设计,这是我们扩展机制中的一项。「好知网」的系统可以针对你的不同需求,让你在云平台中选择一些插件来使用。这里简单介绍一下菜单插件的功能,如果说你的导航里面要显示一个新的菜单,那么就需要在后台增加一个新模块,而这时候就能用我们的插件来自动配置,动态地把功能加进去。
同时,我们这边会有一个菜单的 MenuBuilder,会读取指定的菜单文件,然后把菜单拉出来,当新的功能出来之后,就需要调用注册服务,把你开发的功能加载到我们的 Plugin Installed.php 里面。
我们的网校有非常强大的定制功能,比如说语言学习对音频的处理和识别需求比较高,但是像其他的一些学习,比如说设计学习,对音频的需求就没有那么强烈,所以,我们提供差异机制,如果你做语言学习,那么你就可以在我们的平台上选择一些特意为语言学习制作的插件,其他类型的学习也是一个道理。
关于主题机制,我们网站的大部分头部都是统一的,底部也是统一的,如果全部重复写代码的话,非常不可取。我们使用的引擎支持页面继承,也就是说,你在父页面定义好以后,不同的子页面直接实现不同的东西就可以了。
下面我们把模板的优先级介绍一下,比如 A 页面在根目录下面,我们现在根据需求,需要重新写一下,重新展现,这个也写在 A 页面上,然后放在主题文件夹下,之后当我们需要找这个页面的时候,就会根据优先级先在主题文件夹下搜索,一旦搜索到就展现出来,搜索不到就再转去系统默认路径。此外,重写页面的话,你可能就要调取不同的数据,这里我们会提供数据标签,你可以通过数据标签把页面需要的数据直接渲染出来。
在架构要点这一部分,最后就是我们的二次开发、定制,还有相应的扩展。
对于一些核心业务的扩展,我们提供了 Service 和 Dao 的定制重写机制,具体来说就是,在需要调动 Service 的时候,你得用 Service kernel 返回一个具体实例,或者你们根据自身业务重新写的一个 Service 实例,然后我们就会通过 Service kernel 来获取,由于 Service kernel 有一个缓存的概念,所以如果把每个 Service 实例都放到里面去,就能够降低 Service kernel 的开销,我们也能够通过 Service 代理的方式,对 Service 和 Dao 实例进行包装,非常方便地对服务进行扩展。
其实在架构的扩展机制上,可以分为横向扩展和纵向扩展,这里我简单举例介绍一下,比如说我们想象一个场景,你去养鱼,如果只是几条小鱼的话,你用小水缸就可以养起来,但是时间长了之后,这些鱼可能会长大,会增多,然后你的小水缸就养不下了,得想办法把水缸进行扩展或者怎么样,这时候有两种方案,一是买一个更大的水缸,把之前小水缸里的鱼、水草、沙子都迁移到大水缸里,二是买一个一样大的水缸放在旁边,把水缸互相打通,让鱼在两个水缸之间进行分配。刚才说买个大水缸就是纵向扩展,它是非常不方便的,你要把沙、水草都搬进去,而打通两个小水缸则是横向扩展。
关于横向扩展,首先我们这边有一个 web 的负载均衡,主要解决的问题是高并发的性能问题,它可以通过一种算法把用户的请求分摊到不同的 web 集群,然后对用户访问进行响应,对数据缓存进行集群,对数据库进行切片。其次是分布式文件存储系统,我们知道,文件如果存在一个服务器上,只有一个服务器响应会慢的,所以我们会调动 Master 访问,告诉你请求在哪里,怎么去读。再次是备份的 Metalogger Server 服务,当 Master 遇到问题的时候,它自己就可以处理 Master 的工作,解决当中的问题。最后是堡垒机,因为在集群的环境下,你要维护的服务器非常多,所以如果每个都自己登陆,应用起来会非常不方便,安全也会很成问题,但是有了堡垒机的话,所有远程网络登录都会通过堡垒机进行服务,既方便,也相对安全。
教育云
这是教育云的架构图,在我们的平台上,各个网校通过 Restful API 的统一接口进行访问,通过 RPC 的方式对外提供服务,比如说短信服务、文档服务,还有视频服务,可以对视频进行切片。同时,这边会有一个监控,一旦发现某个服务节点有问题,会自动报警或者自动刷新,保证为我们的用户提供正常的服务响应。
在 RPC 的实现方式上,我们采用了 YAR 的框架,它是基于 HTTP 的,开发起来效率非常高,非常简单,写一下代码就可以搞定。然后,负载均衡的是 RPC 客户端轮询,它会对每个服务器节点进行轮询,如果服务器 N 次连接超时,服务就会自动下线,并且报警。最后,我们通过 PHP 实时实现了所有的 RPC 服务,并且对服务器状态进行实时监控。
垃圾用户防范
简单来说,当用户请求注册服务的时候,我们会进行验证,如果通过就允许启动注册,否则就告诉用户是非法的。这里使用的是关键词过滤,比如找医院或者乱七八糟的东西不允许注册,但这个验证其实非常滞后,因为你不知道用户会选择哪些关键词来注册,跟不上用户的节奏,所以经常发现商业用户来批量刷我们的系统。
后来,我们做了一些调整,首先是 Iptables 的频率限制,比如说我们规定了某个 IP 地址在一段时间内只能注册几个用户,然后我们还通过敏感词过滤来扫描用户信息,扫描通过才允许注册,最后就是用户行为判定,因为垃圾用户都是相似的,批量的,会带有一些电话等联系信息,一旦判定为垃圾用户,我们就会通知管理人员,对用户进行封禁。此外,在整个过程中,我们都会通过事件来监听用户行为,并进行判定,主要就是关键词过滤,包括很多人可能会用的一些特殊符号,比如不可见字符,或者用 Q 来表示 9,用 O 来表示 0等等。
让知识变得性感
还有就是,知识点的及时反馈是很重要的,对于加深知识点的理解有非常大的帮助,针对这个问题,我们这里有视频弹题,会显示一个小白点,在老师讲解知识点的时候,可以在这个点上把题目放出来,当学员在看的时候,也可以弹出来这个题目,能够有实时的反馈。
最后,我们还做了一个功能,叫模拟相机。现在摄影教学比较多,会经常涉及到光圈、快门、感光度这些参数,如果你不去操作,可能就不知道这些参数是什么概念,而我们这里的模拟相机,可以让老师在讲的同时操作一下 PC,通过画面来告诉大家光圈是什么意思,快门是什么意思,感光度是什么意思等等。
我今天分享的主题就是这样,我们是杭州阔知网络有限公司,好知网是我们的一个在线教育平台,大家有兴趣可以看一下课程,谢谢!