按照上述四个方面进行方案设计:
大文件、网络传输
大文件传输分为 数据同源 和 异构 两种方案
异构则需要考虑存储协议的定义优化 (序列化、反序列)
存储协议 -> 网络协议 -> 流式处理
考虑异常、断点续传、保证完整性
文件保存的安全性:备份?读取文件考虑效率?
Client 、Server 、存储层、Manager(分片信息管理 、聚合、分布式存储等)
大文件存储肯定是尽量打散、降低单节点的网络压力、每个节点内部根据数据类型管理他的内存存储结构(avro(序列化系统)、parquet(列示存储))、使用分布式文件存储系统:HDFS
客户端拆分大文件生成多个文件分片,调用服务端生成一个文件上传任务(分片相关信息)返回本次分片上传唯一标识
发送完成后,服务端根据判断数据上传是否完整,如果完整,则进行数据块合成得到原始文件
要求点对点传输、基于 TCP 长连接流式传输,服务端 buffer -> flush ,利用 buffer 建立可监控、可控速的网络流传输。生产 消费模型。
为了保证内存不溢出、使用有有界内存队列 BlockingArrayQueue ,控制网络流传输速率,写入 系统缓存 ,定时统一写入数据库。网络IO
如何实现断点续传
一般实现方式有两种:
- 服务器端返回,告知从哪开始
- 浏览器端自行处理
上传过程中将文件在服务器写为临时文件,等全部写完了(文件上传完),将此临时文件重命名为正式文件即可
如果中途上传中断过,下次上传的时候根据当前临时文件大小,作为在客户端读取文件的偏移量,从此位置继续读取文件数据块,上传到服务器从此偏移量继续写入文件即可
分片写 、多线程 、切片传输(压缩数据、考虑异常、断点续传、保证完整性)、检验 SHA1、UDP 分片 分组、考虑网络I/O 磁盘I/O 瓶颈
网络的传输考虑使用 Netty 框架 NIO
异常情况的回滚 :使用数据库的事务,每个大文件的接收,创建一个大事务、每个分片写入数据库、存在问题回滚大事务
分片:
定义分片信息的数据结构
分片要考虑网络的实时传输 动态改变分片大小
为什么选择 TCP ?
TCP 面向字节流、可靠
丢包?数据传输异常中断?
SHA1 校验 文件内容完整性、重传