现在app展现内容的形式多种多样的,有文字,图片,声音,视频等等,其中文件占了一个很大的比重。随着app不断运营,文件会越来越多,占用的磁盘空间也不断增大,架设一套高效的文件系统,对于整个app架构有着巨大的影响。

1.    如果可能,使用成熟的文件云存储服务

对于创业公司来说,我一直推崇的架构原则是“尽量使用成熟的第三方服务和软件,自己只负责业务逻辑”。

架设文件系统,需要牵涉到文件的分布式存储,图片水印,图片缩放,还有CDN等方面,每方面都能耗费掉巨大的开发成本和运维成本。

对于小团队来说,我不觉得得开发人员自己弄这些服务做得比专业的第三方云存储服务好,所以还是别折腾,用第三方云存储服务吧。

而且,我觉得,平均算起来,用第三方云存储服务,比起后端人员开发和运维的成本低多了,想想开发人员钻研和开发这些文件服务所需的时间就知道了。特别是云存储的下载速度,记得我当时第一次使用云存储下载文件吓呆了,居然达到了10M/s的下载速度,大家想想,这么快的下载速度,是多爽的用户体验,带来飞一般的感觉。

2.    架设文件系统

当然了,不一定每个团队内部都同意使用第三方云存储服务,很多老大的想法是要把核心数据掌握在手上,这个时候就只能走架设文件系统之路。

App后端的文件系统,我认为涉及到下面3个方面:

(1)分布式文件存储

对于app的业务来说,分布式文件存储的要求其实很简单:

a.      需要扩容的时候,只需要简单的添加机器就能做到,不需要重启整个文件系统上的机器。

b.      保证高可用,冗余备份,避免某台机器挂掉了,文件服务就停止了。

在移动互联网时代,处了视频类的应用外,其他应用都是以小文件为主,所以我觉得分片式的文件系统不需要考虑,涉及到文件的分片问题,那运维和架构就很复杂了。例如,怎么知道某个文件是否已经损坏了?

这里我向大家推荐的分布式文件存储系统是FastDFS。

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

据我了解,FastDFS已经在UC,56,Kugou等IT企业被广泛使用,其中Kugou用FastDFS保存着500TB的文件。

在生活中的仓库里,有很多货柜用来存放货物,怎么能保证无论增大了多少货柜,都能被合理使用的呢?

核心是每个仓库里都有一个仓库管理员,当增加了货柜,仓库管理员都收到。当工人需要向仓库里放货物,先问仓库管理员哪个货柜有足够的空间存放货物,仓库管理员会告知工人具体哪个货柜,然后工人走到对应的货柜中存放货物。

上面仓库中的仓库管理员和货柜,就是FastDFS在生活中的模型。

FastDFS就是仓库,  FastDFS里有两大角色:跟踪器(tracker)和存储节点(storage)。跟踪器(tracker)就是仓库管理员,主要做调度工作,在访问上起负载均衡的作用。存储节点(storage)就是货柜。

存储节点(storage)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。

上面就是FastDFS的简单介绍,有关FastDFS的具体工作原理,各位可在网络上搜索相关的文章详细了解。

(2)图片水印,缩放和裁剪

图片操作是非常消耗CPU,内存,和大量的磁盘IO,所以在选择图片处理工具要慎重!!!

推荐使用GraphicsMagick,一个久经考验的图片处理软件,支持多个平台,而且支持多种语言的客服端。GraphicsMagick是ImageMagick的一个分支,相对于ImageMagick而言,TA处理速度更快,消耗资源更少,并且大的图片处理网站,如 Flickr and Etsy  已经在使用TA了。

具体的实现方法,可查看我写的两篇博客《app后端设计(12)--图片的处理》,《app后端设计(13)--IM4JAVA+GraphicsMagick实现中文水印》 。

(3)CDN

CDN,最大的作用就是使图片,音频,视频等静态文件下载速度更快,用户体验更好。

在访问量大的时候,通过CDN,把图片,音频,视频等静态文件挡在服务器前,也是一种应付高并发的方法。

不是国内一二线的互联网企业,就不要考虑架设专属的CDN网络啦,乖乖购买CDN服务吧。

现在除了传统的CDN服务商外,阿里云和ucloud也提供了CDN服务,极大地方便了开发者。

另外,很多CDN服务商都提供了图片的水印,缩放和裁剪功能,如果能直接使用就不需要在图片上花费额外的开发成本。

---------------------------------------------------------------------------------------------------------------------------

打开链接  app后端系列文章总目录 总目录 ,能查看本人发表过的所有原创“app后端”文章。

【作者】曾健生

【QQ】190678908

【app后端qq群】254659220 

【微信公众号】 appbackend

【新浪微博】 @newjueqi

【博客】http://blog.csdn.net/newjueqi

版权声明:本文为博主原创文章,未经博主允许不得转载。

23.app后端如何架设文件系统的更多相关文章

  1. 26.app后端怎么架设推送服务

    推送服务已经是app的标配了.架设推送服务,除了可以使用第三方服务商外,也有大量的开源技术可以选择. 现在推送主要分两块,android推送和ios推送,在下面分别论述: 1.    Android推 ...

  2. app后端设计--总目录 (转)

    特此说明,我转载的!!! app后端设计(1)--api app后端设计(2)--xmpp的使用 app后端设计(3)--短信,邮件,推送服务 app后端设计(4)-- 通讯的安全性 app后端设计( ...

  3. app后端设计--总目录

    做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,android客户端,iphone客户端,现就职于app云后端平台bmob(想了解bmob点击这里).其中的乐与苦 ...

  4. [置顶] app后端设计--总目录

    版权声明:本文为博主原创文章,未经博主允许不得转载. 做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,Android客户端,iphone客户端,现就职于app云后 ...

  5. app后端设计(12)--图片的处理

    app上线后,不断接受用户的反馈,于是,反馈非常差的情况下,都会有app的改版. 一旦app的改版,都会有比较大的UI改动,一改动UI,那么图片的尺寸也就必须要改变. 在app后端设计(1)—api( ...

  6. app 后端技术

    app 后端技术 一直以来工作的方向是web server,对app server没有什么了解.虽然没有接触过移动app开发,但对app后端技术还是挺有探索欲望的,app应用和web应用在前端的用户习 ...

  7. **app后端设计(10)--数据增量更新(省流量)

    在新浪微博的app中,从别的页面进入主页,在没有网络的情况下,首页中的已经收到的微博还是能显示的,这显然是把相关的数据存储在app本地. 使用数据的app本地存储,能减少网络的流量,同时极大提高了用户 ...

  8. 【转】app后端如何选择合适的数据库产品

    转自:http://blog.csdn.net/newjueqi/article/details/44003503 app后端的开发中,经常要面临的一个问题是:数据放在哪里? mysql ?redis ...

  9. app后端设计(0)--总文件夹

    原文:http://blog.csdn.net/newjueqi/article/details/19003775 做了接近两年app相关的系统架构,api设计,先后在两个创业公司中工作,经历过手机网 ...

随机推荐

  1. Linux打包命令 - tar

    上一篇文章谈到的命令大多仅能针对单一文件来进行压缩,虽然 gzip 与 bzip2 也能够针对目录来进行压缩, 不过,这两个命令对目录的压缩指的是『将目录内的所有文件 "分别" 进 ...

  2. PS 滤镜——平面坐标变换到极坐标

    %%% orthogonal coordinate to polar coordinate %%% 平面坐标转极坐标 clc; clear all; close all; addpath('E:\Ph ...

  3. 安卓系统启动脚本init.rc说明文件readme.txt翻译

    本说明文件位于system/core/init/readme.txt 本文参考深入解析安卓系统一书,进行翻译,版权部分归书的作者  刘超,资深Android专家,系统架构师. 博客地址:http:// ...

  4. css选择器语法速查

    通用选择器 *{} 类似于通配符,匹配文档中所有元素类型: 类型选择器 h1,h2,p{} 匹配以逗号隔开元素列表中的所有元素 类选择器 .glass{} or p.glass{} id选择器 #id ...

  5. 恶补web之八:jQuery(2)

    jquery中非常重要的部分,就是操作dom的能力: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括html标记) val() - 设置或返回表单字段 ...

  6. IOS使用FMDB封装的数据库增删改查操作

    // //  DBHelper.h //  LessonStoryBoard // //  Created by 袁冬冬 on 15/10/29. //  Copyright (c) 2015年 袁冬 ...

  7. Python3玩转儿 机器学习(5)

    numpy 的使用 numpy.array基础 import numpy numpy.__version__ #查询当前numpy的版本 '1.14.0' import numpy as np np. ...

  8. Roman to Integer(将罗马数字转成整数)

    Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...

  9. 解决miner.start() 返回null

    下面我列举了三种解决方案,前面两张是某两位大佬试出来的,第三种是我蒙出来的. 第一种解决方案 转载自  http://mp.weixin.qq.com/s/AB9vj1EzOgWT7JyryfQhDg ...

  10. java中split分割"."的问题

    今天使用split分割"."的时候居然失败了,经过百度发现原来要加转义字符才行. 正确的写法: String test="1.2.3"; String[] s1 ...