元旦先后,网站增长了直播功能,但发现,有时候打开页面,网站反应很慢。数据库
吓死宝宝了,觉得服务器出了啥子问题。浏览器
后来发现,因为上传图片,当一个页面有十多张图片,每一个图片都有一兆多的时候,瞬间占满了一兆的带宽。缓存
问题来了,就得解决。服务器
原来的服务器文件,上传了,就放在那里,请求来了,便给。这样,若是一个页面有三两个一兆以上的文件,便会加载很慢,同时,其余访问,便拥堵了。工具
还有一个问题,原来的文件,都放到了数据库里,这样方便服务器横向扩展的时候,不用关心文件,反正都在数据库里。但,租用的数据库,也渐渐地满了。性能
最快捷的解决方法:加钱买啊!测试
钱能解决的问题,就不是问题。可,问题是没钱。网站
且,这么简单粗暴地解决问题,也不是我得风格。插件
因而,挽起袖子,本身解决。设计
需求以下:
1.图片要处理。图片有多种使用场景,缩略图,常规图,广告图片,海报图片等,规格都不同。要随需供应。
2.语音也要处理。目前找到的文件500KB左右,加载要三两秒时间,明显等待。不爽。
3.要缓存。
4.支持全部文件。一个是用户上传的文件,另外一个是ckeditor插件上传和管理的文件。
功能实现。
这是有史以来最废纸的功能,用了两页纸!平日里,一个功能,半张一张的,也就够了。
FreeFile领域类,用于存储文件元数据。主要是名称大小,路径之类(再也不存数据库了)。为啥叫FreeFile,没啥意思,我是个爱自由的人。也想,这个设计能行云流水般的流畅好用。
FileHub工具类,用于处理文件。一个是收文件,用户上传后,他负责存储到FreeFile和本地,也负责整合ckeditor里面的文件。另外一个是发文件,根据FreeFile和场景生成文件连接,根据连接返回处理过(压缩和缓存)的文件。
功能基本也就这么实现了。还有一些支持工具类。
FileConvert工具类。用于压缩转换文件。使用FFMPEG来处理语音,用ImageMagick处理图片。之前却是用纯Java处理图片,图片质量降低明显,且有隐含的性能问题。
写了一大批临时代码,用于迁移现有的文件到新的系统。
这不是第一次给飞驰的火车换轮子了,好在,有惊无险。
实际效果。
图片通过处理,体积大大缩小。缩略图(80X80),通常7KB左右,头像(200X200),通常17KB左右,大图(640X)通常30KB左右。这样一个页面上,即使有几十张图片,也能够快速加载了。这些图片,都是请求时,按需生成。
语音通过压缩,测试,码率24k是一个较均衡的选择。体积从500KB下降到180KB,点击,瞬间便播放了。基本在一秒之内。
完善了缓存。经过浏览器缓存,etag等,极大地减小服务器的压力和流量。
这个方案,估计能坚持一阵儿了。
本文出处 http://luoyouzhijia.cn/blogs/461?tc=201706261108.1.0