23.app后端如何架设文件系统
现在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后端如何架设文件系统的更多相关文章
- 26.app后端怎么架设推送服务
推送服务已经是app的标配了.架设推送服务,除了可以使用第三方服务商外,也有大量的开源技术可以选择. 现在推送主要分两块,android推送和ios推送,在下面分别论述: 1. Android推 ...
- app后端设计--总目录 (转)
特此说明,我转载的!!! app后端设计(1)--api app后端设计(2)--xmpp的使用 app后端设计(3)--短信,邮件,推送服务 app后端设计(4)-- 通讯的安全性 app后端设计( ...
- app后端设计--总目录
做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,android客户端,iphone客户端,现就职于app云后端平台bmob(想了解bmob点击这里).其中的乐与苦 ...
- [置顶] app后端设计--总目录
版权声明:本文为博主原创文章,未经博主允许不得转载. 做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,Android客户端,iphone客户端,现就职于app云后 ...
- app后端设计(12)--图片的处理
app上线后,不断接受用户的反馈,于是,反馈非常差的情况下,都会有app的改版. 一旦app的改版,都会有比较大的UI改动,一改动UI,那么图片的尺寸也就必须要改变. 在app后端设计(1)—api( ...
- app 后端技术
app 后端技术 一直以来工作的方向是web server,对app server没有什么了解.虽然没有接触过移动app开发,但对app后端技术还是挺有探索欲望的,app应用和web应用在前端的用户习 ...
- **app后端设计(10)--数据增量更新(省流量)
在新浪微博的app中,从别的页面进入主页,在没有网络的情况下,首页中的已经收到的微博还是能显示的,这显然是把相关的数据存储在app本地. 使用数据的app本地存储,能减少网络的流量,同时极大提高了用户 ...
- 【转】app后端如何选择合适的数据库产品
转自:http://blog.csdn.net/newjueqi/article/details/44003503 app后端的开发中,经常要面临的一个问题是:数据放在哪里? mysql ?redis ...
- app后端设计(0)--总文件夹
原文:http://blog.csdn.net/newjueqi/article/details/19003775 做了接近两年app相关的系统架构,api设计,先后在两个创业公司中工作,经历过手机网 ...
随机推荐
- HBase中缓存的优先级
ava代码 // Instantiate priority buckets BlockBucket bucketSingle = new BlockBucket(bytesToFree, bloc ...
- asp.net session分布式共享解决方案
Session共享是分布式系统设计时必须考虑的一个重要的点.相比较java中的session共享解决方案,.net中的解决方案还是比较少,MemcachedSessionProvider类库是比较优秀 ...
- 实施一个SAP项目大概分为下面几个过程
实施一个SAP项目大概分为下面几个过程 1.需求调研.了解客户需要实施的范围,比如是财务模块,后勤模块,人力资源,商务智能等等.需求调研通常有几种方法了解,和客户开会讨论:分配到具体业务人员了解:通过 ...
- 初识JAVA——方法声明和调用
class TempConverter{ public static void main(String[]args) { changeTemp("132"); } //定义花摄 ...
- 使用swagger管理接口
swagger 配置 1.pom 增加jar包依赖 <dependency> <groupId>io.springfox</groupId> <artifac ...
- c#语言中的Process进程类型的使用示例
下面我们用一个简单的例子来说明如何使用 我们用vs2015新建一个解决方案,这个解决方案包含两个WINFORM窗体项目,一个是SoftWare.Test,一个是SoftWare.Update,如下图所 ...
- git命令行常用几个指令(细节问题)
GIT PUSH/PULL时总需要输入用户名密码的解决方案: git config --global credential.helper store 查看当前的配置信息: git config --s ...
- require.js配置路径的用法和css的引入
前端开发在近一两年发展的非常快,JavaScript作为主流的开发语言得到了前所未有的热捧.大量的前端框架出现了,这些框架都在尝试着解决一 些前端开发中的共性问题,但是实现又不尽相同.通常一般的前端加 ...
- Linux——浅析信号处理
信号及其处理 信号处理是Unix和LInux系统为了响应某些状况而产生的事件,通常内核产生信号,进程收到信号后采取相应的动作. 例如当我们想强制结束一个程序的时候,我们通常会给它发送一个信号,然后该进 ...
- 利用Python脚本悄无声息的遥控室友电脑开机密码!
整蛊一下室友就行了,切勿用于非法用途! 利用python脚本控制室友windows系统电脑的开机密码.利用random()生成随机数(密码),天知地知,密码只有你自己知道! Python代码分为cli ...