唯's Blog

笔者是一个热爱编程的 Java 程序员。

0%

开发 SDK 通过网络进行大文件

按照上述四个方面进行方案设计:

  1. 场景功能

大文件、网络传输

大文件传输分为 数据同源 和 异构 两种方案

异构则需要考虑存储协议的定义优化 (序列化、反序列)

存储协议 -> 网络协议 -> 流式处理

考虑异常、断点续传、保证完整性

文件保存的安全性:备份?读取文件考虑效率?

  1. 服务

Client 、Server 、存储层、Manager(分片信息管理 、聚合、分布式存储等)

  1. 存储

大文件存储肯定是尽量打散、降低单节点的网络压力、每个节点内部根据数据类型管理他的内存存储结构(avro(序列化系统)、parquet(列示存储))、使用分布式文件存储系统:HDFS

  1. 流程设计

  • 客户端拆分大文件生成多个文件分片,调用服务端生成一个文件上传任务(分片相关信息)返回本次分片上传唯一标识

  • 发送完成后,服务端根据判断数据上传是否完整,如果完整,则进行数据块合成得到原始文件

  • 要求点对点传输、基于 TCP 长连接流式传输,服务端 buffer -> flush ,利用 buffer 建立可监控、可控速的网络流传输。生产 消费模型。

  • 为了保证内存不溢出、使用有有界内存队列 BlockingArrayQueue ,控制网络流传输速率,写入 系统缓存 ,定时统一写入数据库。网络IO

  • 如何实现断点续传

一般实现方式有两种:

  • 服务器端返回,告知从哪开始
  • 浏览器端自行处理

上传过程中将文件在服务器写为临时文件,等全部写完了(文件上传完),将此临时文件重命名为正式文件即可

如果中途上传中断过,下次上传的时候根据当前临时文件大小,作为在客户端读取文件的偏移量,从此位置继续读取文件数据块,上传到服务器从此偏移量继续写入文件即可

分片写 、多线程 、切片传输(压缩数据、考虑异常、断点续传、保证完整性)、检验 SHA1、UDP 分片 分组、考虑网络I/O 磁盘I/O 瓶颈

网络的传输考虑使用 Netty 框架 NIO

异常情况的回滚 :使用数据库的事务,每个大文件的接收,创建一个大事务、每个分片写入数据库、存在问题回滚大事务

分片:

定义分片信息的数据结构

分片要考虑网络的实时传输 动态改变分片大小

为什么选择 TCP ?

TCP 面向字节流、可靠

丢包?数据传输异常中断?

SHA1 校验 文件内容完整性、重传