我在招行卡中心的时候,开发了一款OSS(对象存储服务),当时内部叫FSP(文件服务平台).定位和七牛/又拍极其类似;算是一种私有的OSS吧.OSS这种东西可繁可简,可是一旦拥有便将成为开发者的福音,大大增长开发效率.总的来讲,OSS是很受广大开发人员欢迎的,很容易进行内部推广,你们都很愿意使用,甚至有些时候爱到了滥用的地步.现在掌上生活
应该有极多的静态资源经过FSP进行托管和分发了吧.前端
在我所呆过的很少的几家公司里我发现了一个现象:只要公司体量稍大,便不太乐意使用公有云服务,各类服务更偏向于本身部署,甚至本身造轮子.哪怕这种耦合并不那么严重的服务,也更倾向于本身作,而不使用公有云,我想凡是在大中型开发团队的Developer大多会和我有相同的感觉.若是你的团队也是这样,我以为你的团队一样须要一个较为完善的对象存储服务.算法
曾经我大量遇到过这样的问题:后端
一个WEB站点,必然存在大量的静态资源:图片,CSS,JS,静态化内容
等等...可是为了网站的高可用,咱们须要进行集群部署,集群部署后显然就带来了一致性的问题:新增图片A,节点1存下了,节点2怎么办?特别是相似CMS这样须要静态化场景的场景下,如何保持多个节点间静态资源的同步?若是碰上了UGC场景就更恐怖了~你到底是要存DB呢仍是存本地呢?当时咱们也尝试过使用RSYNC
这样的方案进行节点间同步,可是由于这样的站点很难作读写分离,全部同步策略都须要使用互相同步......使用一段事件后老是问题多多.在这样的背景下,绝大多数团队都会天然而然地衍生出最简单地对象存储服务.通常状况下他的架构是这样的: 缓存
在初期这样地架构没有任何问题,静态资源集中化存储,并由静态资源服务器统一将静态资源返回给用户.静态资源服务器还能加上CDN一切看起来都很好,每每不少团队的开发就到此为止了.可是随着使用量地增多,需求也将会愈来愈难以知足:服务器
受权访问微信
应用资源隔离架构
资源自动过时前后端分离
多媒体资源处理运维
水印异步
防盗链
五花八门的需求会如潮水般涌来,哪怕高可用,限流这样的需求用上面的架构都难以知足.这些资源的存储\管理\配置\迁移都会成为你所要面临的问题.而这些问题彷佛是没办法规避的.也是终究会面对的需求.此时,你须要的就是一个OSS
!
接下来我简单介绍一下每一个服务:
CDN:这个不用太多说,通常都会购买专业的CDN服务提供方给的CDN服务用以互联网缓存.
WEB写入API:一般用来和用户进行写入交互,这里的用户可能时终端用户,也有多是服务器.我很建议这一套API提供CORS支持,这在UGC场景对开发实在太友好了.开发人员只须要分发token+上传策略,最终用户上传的流量彻底不通过业务端的应用服务器用户减小了不少开发量.(这里很建议提供一套分发token\策略的SAAS服务,毕竟每次都写一堆这种东西部署仍是很烦人).从前我以为七牛
在这一块的API品味颇有问题,感受API很是的Dirty,直到后来上传时须要设置的东西愈来愈多才发现这种Dirty的东西很爽啊,哈哈哈!用户在上传时就能够提供不少的应用处理信息:过时\文件处理\命名规则等等.
CDN服务调用:当一些静态资源存在更新时须要及时通知CDN以进行缓存刷新;当进行一些会产生突发大流量访问的状况应该通知CDN服务进行资源预取.这些调用CDN服务的工做一般能够交给这一服务进行异步调用.
Web读取API:这一层一般直接接入CDN,标配提供了鉴权的功能.若是对本身服务的图像处理性能有信心能够加一些图像缩放这些小功能进去.
鉴权服务:这个服务是专门用于和CDN对接的.能够和CDN厂商进行对接,通常CDN厂商会提供两种访问鉴权的服务:(1)基于过时签名的CDN模式,双方约定好一种基于过时签名的算法,CDN缓存了你的源数据,以后的鉴权所有由CDN帮你完成.若是这样就能知足你的需求,那彻底不须要鉴权服务(2)自定义的鉴权模式,这种模式每每约定好一个参数做为鉴权token,CDN拿到这个鉴权token之后会调用你的鉴权服务进行鉴权.这样你的鉴权逻辑就能够彻底自主,基于调用次数,基于时间,等等这些功能就能较好地实现.每每CDN厂商是不太乐意干这事的,和他们协商仍是须要很费一番口舌.
集群存储文件系统:这个服务提供了整个OSS的最核心服务,即文件的高效读写,可用性保障,可靠性保障.对于自建而言,若是不是开发团队格调极高,仍是尽可能别本身开发了.市面上这样的开源和商业的解决方案都不少:SeaWeedFS,FastDFS,TFS(名声大,尾巴烂,阿里开源你懂的...)等等这些解决方案均可以直接拿来使用.
对象处理服务:这一服务主要用于异步处理一些复杂任务,例如视频拼接/切割,图片水印/压缩,批量文件打包等等这些耗时的处理型任务.若是这些任务不少很复杂,还建议再开一个Web服务用于接收用户这些服务请求.
后台管理和测试工具:这个我没在架构图上画出来,不少企业内服务开发者其实都存在这个问题,对管理后台的轻视.其实这个东西必定要针对系统仔细开发,它能大大下降你的工做量,尽可能让用户可以自助管理本身的对象空间和进行开发测试,可以让你省出大量时间.
基本的一套OSS就这些组件,其实开发起来并非很困难.能够参考一些公有云服务提供的功能给本身的OSS加上.在先后端分离的今天,甚至一些开发能够直接使用OSS做为前端WEB SERVER,不知比配置一堆Nginx而后再去找运维加CDN方便到哪里去了.这一套服务架起来静态资源的托管和分发问题能够极大的获得解决,性价比极高.在前厂由于合规政策等缘由,不少我很想要的功能无法加入,一直想本身写一套OSS来开源,但最近看到七牛开始支持私有云部署了,实施这一计划的动力又降低了很多(主要仍是懒)...但愿每一家公司都有本身的一套成熟靠谱易用的OSS,别把宝贵的时间浪费在繁琐的小事上.