每家公司都该拥有OSS

我在招行卡中心的时候,开发了一款OSS(对象存储服务),当时内部叫FSP(文件服务平台).定位和七牛/又拍极其相似;算是一种私有的OSS吧.OSS这种东西可繁可简,但是一旦拥有便将成为开发者的福音,大大增加开发效率.总的来说,OSS是很受广大开发人员欢迎的,很容易进行内部推广,大家都很愿意使用,甚至有些时候爱到了滥用的地步.如今掌上生活应该有极多的静态资源通过FSP进行托管和分发了吧.

在我所呆过的不多的几家公司里我发现了一个现象:只要公司体量稍大,便不太乐意使用公有云服务,各种服务更偏向于自己部署,甚至自己造轮子.哪怕这种耦合并不那么严重的服务,也更倾向于自己做,而不使用公有云,我想凡是在大中型开发团队的Developer大多会和我有相同的感受.如果你的团队也是这样,我觉得你的团队同样需要一个较为完善的对象存储服务.

曾经我大量遇到过这样的问题:

一个WEB站点,必然存在大量的静态资源:图片,CSS,JS,静态化内容等等…但是为了网站的高可用,我们需要进行集群部署,集群部署后显然就带来了一致性的问题:新增图片A,节点1存下了,节点2怎么办?特别是类似CMS这样需要静态化场景的场景下,如何保持多个节点间静态资源的同步?如果碰上了UGC场景就更恐怖了~你究竟是要存DB呢还是存本地呢?当时我们也尝试过使用RSYNC这样的方案进行节点间同步,但是因为这样的站点很难做读写分离,所有同步策略都需要使用互相同步…使用一段事件后总是问题多多.在这样的背景下,绝大多数团队都会自然而然地衍生出最简单地对象存储服务.一般情况下他的架构是这样的:
every-company-need-OSS-201821195111

在初期这样地架构没有任何问题,静态资源集中化存储,并由静态资源服务器统一将静态资源返回给用户.静态资源服务器还能加上CDN一切看起来都很好,往往很多团队的开发就到此为止了.但是随着使用量地增多,需求也将会越来越难以满足:

授权访问

应用资源隔离

资源自动过期

多媒体资源处理

水印

防盗链

五花八门的需求会如潮水般涌来,哪怕高可用,限流这样的需求用上面的架构都难以满足.这些资源的存储\管理\配置\迁移都会成为你所要面临的问题.而这些问题似乎是没办法规避的.也是终究会面对的需求.此时,你需要的就是一个OSS!
every-company-need-OSS-2018211102719

接下来我简单介绍一下每个服务:

  1. CDN:这个不用太多说,一般都会购买专业的CDN服务提供方给的CDN服务用以互联网缓存.

  2. WEB写入API:通常用来和用户进行写入交互,这里的用户可能时终端用户,也有可能是服务器.我很建议这一套API提供CORS支持,这在UGC场景对开发实在太友好了.开发人员只需要分发token+上传策略,最终用户上传的流量完全不经过业务端的应用服务器用户减少了很多开发量.(这里很建议提供一套分发token\策略的SAAS服务,毕竟每次都写一堆这种东西部署还是很烦人).从前我觉得七牛在这一块的API品味很有问题,感觉API非常的Dirty,直到后来上传时需要设置的东西越来越多才发现这种Dirty的东西很爽啊,哈哈哈!用户在上传时就可以提供很多的应用处理信息:过期\文件处理\命名规则等等.

  3. CDN服务调用:当一些静态资源存在更新时需要及时通知CDN以进行缓存刷新;当进行一些会产生突发大流量访问的情况应该通知CDN服务进行资源预取.这些调用CDN服务的工作通常可以交给这一服务进行异步调用.

  4. Web读取API:这一层通常直接接入CDN,标配提供了鉴权的功能.如果对自己服务的图像处理性能有信心可以加一些图像缩放这些小功能进去.

  5. 鉴权服务:这个服务是专门用于和CDN对接的.可以和CDN厂商进行对接,一般CDN厂商会提供两种访问鉴权的服务:(1)基于过期签名的CDN模式,双方约定好一种基于过期签名的算法,CDN缓存了你的源数据,之后的鉴权全部由CDN帮你完成.如果这样就能满足你的需求,那完全不需要鉴权服务(2)自定义的鉴权模式,这种模式往往约定好一个参数作为鉴权token,CDN拿到这个鉴权token以后会调用你的鉴权服务进行鉴权.这样你的鉴权逻辑就可以完全自主,基于调用次数,基于时间,等等这些功能就能较好地实现.往往CDN厂商是不太乐意干这事的,和他们协商还是需要很费一番口舌.

  6. 集群存储文件系统:这个服务提供了整个OSS的最核心服务,即文件的高效读写,可用性保障,可靠性保障.对于自建而言,如果不是开发团队格调极高,还是尽量别自己开发了.市面上这样的开源和商业的解决方案都很多:SeaWeedFS,FastDFS,TFS(名声大,尾巴烂,阿里开源你懂的…)等等这些解决方案都可以直接拿来使用.

  7. 对象处理服务:这一服务主要用于异步处理一些复杂任务,例如视频拼接/切割,图片水印/压缩,批量文件打包等等这些耗时的处理型任务.如果这些任务很多很复杂,还建议再开一个Web服务用于接收用户这些服务请求.

  8. 后台管理和测试工具:这个我没在架构图上画出来,很多企业内服务开发者其实都存在这个问题,对管理后台的轻视.其实这个东西一定要针对系统仔细开发,它能大大降低你的工作量,尽量让用户能够自助管理自己的对象空间和进行开发测试,能够让你省出大量时间.

基本的一套OSS就这些组件,其实开发起来并不是很困难.可以参考一些公有云服务提供的功能给自己的OSS加上.在前后端分离的今天,甚至一些开发可以直接使用OSS作为前端WEB SERVER,不知比配置一堆Nginx然后再去找运维加CDN方便到哪里去了.这一套服务架起来静态资源的托管和分发问题可以极大的得到解决,性价比极高.在前厂因为合规政策等原因,很多我很想要的功能没法加入,一直想自己写一套OSS来开源,但最近看到七牛开始支持私有云部署了,实施这一计划的动力又下降了不少(主要还是懒)…希望每一家公司都有自己的一套成熟靠谱易用的OSS,别把宝贵的时间浪费在繁琐的小事上.

我的微信公众号
我的公众号