文件上传更新服务相关
需求:
客户端向服务端发送一次请求,请求是一系列配置文件的文件名、当前客户端所持有文件的版本号、期待服务端返回的数据形式(url或二进制数据)。当请求的配置文件有更新,服务端返回相应的url或二进制数据。之所以要分url和二进制数据,因为有的配置文件比较小且比较重要需要马上获取到数据;而有的配置文件稍微大一些,重要性比较低,可以在客户端拉线程慢慢下。
最终实现:
分为后台管理系统(负责文件上传)和数据更新服务。
文件上传部分是用Vue.js+KOA实现。其中关于文件上传那块,浏览器端使用Ajax发送FormData;Node那块之前是用co-busboy模块处理文件,body-parser模块基于co-body不支持文件数据(TODO1:之后研究HTTP协议,需要回头看看这块代码),在官方示例中是用pipe将formData文件流直接导入磁盘文件中(TODO2:出现了文件数据成功写入本地磁盘却没有存入数据库的情况),但是当我想直接用变量保存文件数据时,上传多文件却只能接受到一个文件的数据(TODO3:查明原因,需要了解流的相关知识)。调用SQL语句存储数据时借鉴了ORM的设计思想以及js面向对象编程的思想(TODO4:ORM实现十分粗糙,需要优化)。由于文件大小有限,也没有(TODO5)考虑断点续传和秒传。
更新服务大概思路是服务不断的扫描数据库,将新版本数据载入内存(数据总量不大),并暂时使用Nginx做文件服务器,后期接入CDN。达到快速响应的目的。
收获:
1)写后台管理系统的时候,最初是以文件的形式保存在服务器上,没有考虑文件备份、多机部署的问题。(TODO6:了解分布式文件存储系统),简单的方法就是用MYSQL保存文件数据,数据备份和多机部署方便,但这也只适合数据比较小的情况。最终还是要用分布式文件存储。(TODO7:Redis使用hmset等命令同样能达到目的),由于对性能要求不高,故没有采用Redis方案。
2)学会了使用事务来进行多表(有关联性)操作
TODO:
TODO8:之前理解的文件服务是后端实时读取文件数据并返回数据,但这样不适合生产环境。需要参考和学习Nginx文件服务的实现机制
TODO9:使用JS处理Pb协议