1

为Open edX构建存储服务

 2 years ago
source link: http://wwj718.github.io/post/edx/built-data-storage-system/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

为Open edX构建存储服务

2016-02-28

汤山归来,两天不碰电脑,如小钗所言,变聪明许多,思维逐渐活跃

构建存储服务这个话题困扰了我很久,直到今天洗澡的时候才把这个问题的解决方案大纲理清,与大家分析思路和方案

#背景介绍

###Open edX 关于Open edX就不做过多介绍了,误入本文的小伙伴可以翻阅我此前的这篇译文:关于Open edX[译文]

入坑已久的小伙伴,继续下翻好啦

###存储服务 这里谈论的存储服务,主要指为网站提供文件存储/分发功能的服务,包括js/css/img等静态文件,也包括用户上传的资源文件,诸如视频/图片和文档

之所以称之为服务而不是系统,是因为我把它视为一个抽象存在,实际上在技术人员看来,它只是一套对接云平台的接口。是存储云平台与Open edX之间的一个胶水层

出于七牛云完备的文档和对开发者的友好,我选择以七牛云为例来实现

#Open edX中的文件存储需求 我们进入主题,从需求说起。

Open edX中的文件存储需求主要包括

  • 课程团队私有仓库(文件夹),用于存取:
    • 课程相关的log,以便进一步做数据分析
    • 课程数据下载,诸如成绩单
  • 课程视频(重点之一)

其中涉及的技术点主要包括:

  • 文件权限控制
  • 文件操作(接口)

  • 流量监测(方便优化)

#思路 ###传统思路 实际上以上是很典型的文件存储需求,传统的思路是自己构建一个存储服务就好啦,租上机房,买来服务器,拉好光纤,做好磁盘阵列,写一个web服务来对外提供存储服务。如果访问量大,继续做CDN之类的优化,折腾之极,而且效果不理想

我们实际也这样做过,试着自行搭建管理系统(试过wagtail,seafile等),试着整合cas登录机制,都很折腾

这样面临的问题包括但不限于:

  • 时间成本高
  • 经济成本高
  • 系统不够健壮

###基于云平台 今天的开发者可能是有史以来最幸福的开发者。云的崛起,使大多的计算资源以云的形式存在,我们只需要抽象使用即可。

付出经济的成本,我们就可轻松获得稳定、灵活的云服务,而把底层的复杂性屏蔽在外,开发者只需关注业务逻辑。

当然,存储也不例外

#技术细节 此前困扰我的一个问题是,处于对权限的控制,我们是不是需要所有文件都经过后端,然后同步到云

其实这个问题已经被云存储上考虑在内的,S3的解决方案最为完备,此后也被其他厂商跟进。但对此方案的论述似乎很少,或者这是架构的一个问题,本身就小众,关注者不多,我在网上一搜发现不少架构者有这种疑惑,但决绝方案比较晚近才比较完备

当我们能够描述问题的时候,已经解决了大半,尤其是在网络时代,你遇到的问题,其实几乎都被别人遇到过,你要做的是弄清问题所在领域和问题描述。then google它或是github它

seek, and you will find

###编程模型 programming-model

一般的云存储上传流程是:客户端(终端用户) => 业务服务器 => 云存储服务,这样多了一次上传的流程,会有上传延时,而且有带宽的浪费。但七牛引入了客户端直传,将整个上传过程调整为:客户端(终端用户) => 七牛 => 业务服务器

文件上传成功以后,七牛的服务器使用回调功能,只需要将非常少的数据(比如Key)传给应用服务器,应用服务器进行保存即可。

在七牛云存储中,整个上传流程大体分为这样几步:

  • 业务服务器颁发上传凭证给客户端(终端用户)
  • 客户端凭借 上传凭证 上传文件到七牛
  • 在七牛获得完整数据后,发起一个 HTTP 请求回调到业务服务器
  • 业务服务器保存相关信息,并返回一些信息给七牛
  • 七牛原封不动地将这些信息转发给客户端(终端用户)

下载和其他操作也于此类似。更多细节请看文档

由以上流程我们看到,这是一个灵活的机制,我们可以将自己的业务员逻辑轻松附在其上,诸如如果要控制用户级别的权限,那么只要在在后端将上传凭证和用户身份进行绑定即可。诸如此类

###将模型用于Open edX 后端层面,构建颁发凭证的rest 接口,利用凭证,我们可以做到用户或课程团队粒度的权限控制。

前端层面,将上传资源的按钮绑定到新的函数上。主要需要修改的地方并不多:诸如studio视频组件,论坛的图片上传等

你当然也可以实现功能更全面的资源管理,诸如实践课件资源库之类的功能,只需将云存储api作为积木,置于后端业务逻辑中即可

#我的实现

我会把我的实现放到我此前这个项目里edx_siteapi,欢迎围观,该项目的主要目的是对open edx进行拓展。

主要是实现权限控制和授权的rest api

###其他云平台

#FQA ###流量监控的用途 对于某个区域内高访问量的视频资源,采用区域内自行搭建视频服务器的方式可能比云服务廉价许多。但这依然不影响我们使用云存储。一般的云存储都有流量监控机制,当我们检测到某类文件流量高于临界值时,只需把它同步到自行搭建的本地服务器即可,后台修改地址即可,我们可以用编程的方式,为视频对象赋予一个use_local_file的开关(属性)即可

这样在享受云平台廉价、敏捷的同时,也可以对特定文件做本地优化(出于成本考虑)

之所以提到这点是因为公司前技术总监T老师构建了此前的视频解决方案,在特定情况下,要比云存储廉价。他说我遇见过最优秀的技术人员之一,尽管目前已经不再做技术,对问题的分解能力,交流与组织能力都令人叹服

###跨域问题 由于大多云存储网站都支持域名绑定,所以不错在跨域的问题,ajax可以照常使用。所以开发者感受不出文件服务是不是来自本地后端

###定制化的CDN 出于我们的具体需求,局域网内布有服务器。解决方案也简单,定制同步文件,而后匹配用户请求头,将静态资源重定向到坐在局域网服务器的ip即可,这个任务可以放在nginx那里处理

#相关问题


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK