大型互动应用思路(五)文件存储
1 一般系统实现
文件存储是每个应用系统必不可少的技术之一,这里谈到的存储是一个过程,从文件被用户上传开始到完成文件的浏览,中间的一切都是我们今天的主题。
早期很多系统自行实现文件的上传,例如博客或论坛上传大量图片和附件,但随着公司业务的增加,很多系统都需要上传附件和文件,这就造成了公司内部上传系统的不统一,而恰恰上传系统又是最关键的服务之一。
典型的上传系统内容最终被存储在文件系统当中,但这种方式有若干问题,文件系统的后端是磁盘,磁盘本身有三个问题,一个问题是不容易扩容,另一个问题是容易损坏,最后一个问题是容易造成过多的小文件非常难以维护,但对于一般规模的应用或网站存储并不是瓶颈。
2 上传服务雏形
因此我们今天的讲解的确是建立在有一定量的基础上才可能单独设计来解决上传方面的问题。对于这样的系统首先我考虑到的是服务化,让若干系统可以共享一套文件上传系统,避免每个系统都重复设计的麻烦,也可以减少很多内部管理上的问题。
上传服务由一组服务器构成,前面是负载均衡,保证不同的服务器同时可以提供服务,保证了服务的可靠性,上传服务的后端是存储,后面我们会详细讲到存储,存储的前端是一层HTTP服务,用于直接对外提供访问,当然最好前端能提供CDN缓存,这样文件存储系统的读请求就会降到很低,而用户访问速度会比较快。比较理想的状态是让读文件的HTTP服务和写入的上传服务分开。
3 域名及存储策略
可以为文件分配多个访问域名例如img1.echohello.cn或img2.echohello.cn,方便浏览器可以通过多线程来下载资源。
如果后端挂载的只是一般的文件系统,而不是云存储系统,磁盘会有一定的容量,但扩容也并不难,只要规定好上传文件的写入点即可,当磁盘不足的时候,增加一组新的存储,并设置好新的路径,让最新上传的文件写入到最新的目录即可。如果后端采用的是云存储或其它存储模式可以依据存储本身的特性规定策略。
不同的应用场景对存储的要求是不一样的,因此设计合理的情况下可以在上传服务的后端实现一个统一的文件读写接口挂载多种不同的存储,这里就不展开了,因为今天的内容并不讲解云存储方面的技术。
4 结合图片处理
在上传服务的后端应该配备一套上传服务的管理平台,负责对上传文件进行管理和统计,也负责不同应用进行一些特别的管理设置,例如可上传文件的种类、最大尺寸等。
上传的文件多数是图片,但现在不同的终端导致上传的每张图片都可能会存在多种尺寸。例如在手机上需要的质量不会太高,在图片幻灯单页上需要质量较高,在首页轮播需要的是一张较小的缩略图,在列表页当中需要的是一张更小的图片等。
这时候可以在上传服务的后面增加图片处理服务与视频处理服务的通道,当一个图片被上传上来,首先进入到图片处理等服务中,按照约定生成若干张小图,同时存入存储设备,这样图片就被自动处理完成了,而不需要前端应用博客或论坛在处理。
后端的图片处理程序与前端上传服务可以是一个异步过程,这样用户不需要等待图片的处理过程,而使用传统的PHP程序,一方面压图的质量不好保障,最关键的是如果想异步处理不太容易,更不要提对视频进行处理了。
图片处理程序可以使用JAVA或C语言进行实现,后端可以采用ImageMagick来实现,但也可以实现一个统一的接口,后端配合多种接口实现,ImageMagick只作为实现的一种形式,当发现有更优秀的图片处理库的时候可以替换上去。
除了一般的图片裁剪以外,还可能需要给一些图片或视频上打上水印,这样上传服务完全可以包办一切。
5 读文件的方式
如果需要立即让用户查看到文件可以使用同步方式进行处理,应用端等待处理返回的URL,如果用户不需要立即查看到文件,可以采用异步方式进行处理,减少用户的等待时间。
另外一种是利用动态方式来读取文件,例如图片在上传图片的时候我们并没有调用图片处理程序生成对应的缩略图,而是通过一个动态的URL地址,当实际发生访问的时候才进行处理,如果发现已经有处理过的图片存在就返回,否则生成一张新图片,例如用户头像等就可以使用这种方式来进行调用。
6 去重
用户上传的内容越多重复内容就越大,视频图片的重复率都可以高达40%左右,因此上传服务的一个最主要的工作就是去重,这样就不需要各应用自己来做这样的处理,去重的原理非常简单,对上传后的文件进行摘要统计例如md5一下文件,如果已经存在了就不进行处理,去重可以在两个环节里做,一个环节是客户端如果能读取本地文件就先传给上传服务一个md5的摘要,如果发现文件已经存在那么客户端直接显示上传完成,那就会有超快的感觉,如果客户端无法读取本地文件,那么只能把文件上传到临时目录中,检查文件是否已经被上传过,丢弃临时文件,但这种方式实际上产生了数据的传输,试想如果是很大的视频或压缩文档,那么还是尽量做到客户端去重会更划算一些。
7 配置管理
不同的应用在使用任何服务的时候应该分配一个唯一的ID和几个用于传输不同安全级别数据的密钥,不同的应用可以单独设置对上传服务的要求,常见的配置有:
l 单文件最大上传尺寸
l 是否开放多文件上传
l 可上传文件类型
关于文件上传系统的讲解就到这里了,更细节的东西还需要读者自己来摸索一下,真做起来并不难。
LAMP兄弟连资讯,转载请注明出处!本文只代表作者个人观点不代表LAMP兄弟连观点!如相关单位或相关个人发现问题,请直接与我们联系400-700-1307。