1.问题描述
现在好多应用都不止一台服务器,这就给文件上传带来了麻烦。尤其是对大文件的分片上传,每个分片可能到达不同的服务器,最后怎么把众多分片整合起来呢?
下面就说说这个问题的一些解决思路:
2.解决思路
2.1使用独立的服务器做上传
单独找一台服务器做上传,直接绕过对集群的处理。
因为主要是IO操作,所以服务器最好是大容量固态硬盘,CPU和内存要求可以适当降低;如果上传压力不是很大,还可以让该服务器也参与处理业务逻辑,可以将nginx的负载策略配置为权重,为该服务器分配较低权重;独立服务器的上传有现成的第三方组件,比如jQuery File Upload,支持分片/上传进度/暂停/取消/多文件上传/拖动上传等功能
优点:
支持分片
借用第三方组件,处理简单
缺点:
只有一台机器,一旦故障,上传功能就无法使用了
2.2将文件存入第三方
将集群环境"变成"单机环境。
每个服务器收到分片后,都保存到统一的位置上,比如MongoDB。分片之间的关联关系可以借助文件表中的metadata字段来维护,metadata相同的表示同一个文件;分片的顺序可以直接使用文件名来表示,比如将分片命名为 1 2 3...
优点:
支持分片
缺点:
需要额外维护分片之间关联关系
要考虑第三方对文件处理的效率
2.3多服务器+Nginx
让客户端一直向固定的服务器传分片。
第一个分片请求由nginx决定发给哪个服务器处理,服务端收到该请求后,将ip返给客户端,客户端上传后续分片时不再经过nginx,固定使用该ip,保证同一文件的分片能传到同一台服务器。文件与服务器的对应关系,可以借助第三方维护,比如redis。
优点:
支持分片
服务器集群实现负载均衡
缺点:
需要额外维护文件与服务器的对应关系
2.4使用form表单上传
一个请求传完文件。
直接使用form表单上传,不分片,服务端根据收到的流大小与总大小做上传进度的计算,使用websocket向客户端推送上传进度。
优点:
处理简单,不用考虑集群的问题
缺点:
不支持分片/暂停
只能由服务器来反馈上传进度