大文件上传问题

服务端有一个30GB的数据A,现在我想上传一个20GB的数据B,两个数据之间有重复部分,请问,我如何设计才能实现最小的网络传输

  1. 重复部分可以传输,题目要求是尽可能小地消耗带宽

核心思想

  • 数据分片
  • 哈希值比对

具体策略

系统上传数据之前,先对数据按照一定大小进行划分(比如4MB),然后计算每一个数据块的哈希值,并将此哈希值持久化

  1. 数据B按照4MB进行分块,并计算每一个数据块的指纹
  2. 客户端将所有的数据指纹上传至服务端,由服务端进行比对,如果指纹在数据库中存在,说明为重复数据,不需要再次上传,否则上传
  3. 服务端将数据库中不存在的数据指纹返回给客户端,客户端负责上传对应的数据块,服务端负责进行数据拼接
  4. 数据块B的数据指纹持久化到数据库

注意,4MB只是举一个例子,这个数据块体积越小,上传的重复数据越少,但是网络资源消耗会比较多,数据块越大,重复部分上传的越多,需要找到一个适中值

考虑以下情况
image

两份数据按照同等的块尺寸进行切分,每块大小相等。假如两份数据中的A和B部分数据内容相同,由于在第一份数据中,这部分相同的数据被划分到两个块中,这部分重复数据会被重复上传。所以这种方案只能是尽可能避免上传重复数据,而不是完全不上传重复数据

  • 对重复数据的传输要求较高时,块尺寸设置地小一些,哈希计算更加精细,但冲突概率也更高,而且网络压力更大
  • 对网络传输要求高,又能容忍一定的重复数据,分片体积可以设置地相对大一些

补充一下:不同的分片体积对网络传输有什么影响呢?

  • 分片体积过小,协议头占比过大,有效数据占比减少,大量带宽被用于传输这些重复的头部信息,而不是文件数据本身
  • 分片体积过大,传输失败成本高,一个分片的任何部分出现失败,都将导致整个分片重传

总结来说,小分片的有效数据占比少,无用数据消耗较多的网络带宽;大分片不利于重传。
那如何选择最佳的分片呢?参考选择最佳文件传输分块大小:理论与实践

posted @ 2025-11-20 20:46  xxs不是小学生  阅读(5)  评论(0)    收藏  举报