6

如何实现高效上传?文件增量同步机制了解一下

 1 year ago
source link: https://blog.51cto.com/u_15345191/5751136
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

如何实现高效上传?文件增量同步机制了解一下

精选 原创

近期,公司的云盘项目即将完成内测,这次给大伙分享一下在本地编辑保存这一场景下,用到的增量同步机制。

首先,本地编辑的场景如下:

1、从服务端下载文件到本地;
2、使用本地应用程序打开文件进行编辑修改;
3、保存时,把文件修改内容同步到服务端;
4、再次编辑保存,再次把文件修改内容同步到服务端;

假设,这里的文件是 word 之类的格式,那么文件本身不大,整个上传占用的带宽少,时间也快。但如果,编辑的是 CAD 之类的文件,文件大小可以去到几百兆,那么占用带宽多,上传时间也随之变长。

但是,一个文件实际上是一长串的字节数据,我们可以把它分割成一块块来看。文件修改时,只会对其中一部分字节数据有所修改调整,其他大部分字节数据都不会改变。

因此,通过计算对比旧文件,可以让服务端自行复制大部分内容相同的文件字节块,客户端只针对修改过的字节块进行上传即可,这样一来,上传时间将大大缩短。

原理及操作步骤

具体的原理及步骤如下:

1、服务端以 500KB(步长根据文件大小情况调整)作为步长,把原文件进行分割,分别计算其 Alder32值(弱哈希)和 MD5值(强哈希);

2、客户端把从服务端拿到的弱哈希值作为 key,强哈希值和块号作为值,构建出 map 映射表;

3、客户端对新文件字节数据,用同样的步长和滑动窗口计算哈希值。
(1)若弱哈希值存在,随后对比强哈希值,强哈希值也匹配,则认为文件块在原文件存在,请求服务器对新文件写入原文件中的指定文件块。
(2)若弱哈希值不存在,或者强哈希值不一致,则右移一位字节再计算,直到遇到存在的块,则把前面的字节上传到服务端写入新文件。
(3)直到把新文件字节数据全部遍历计算完成。

如何实现高效上传?文件增量同步机制了解一下_文件上传

最终在服务端,会得到这样的一个数据数组。

如何实现高效上传?文件增量同步机制了解一下_增量同步_02

图中,红色块表示在原文件已匹配上,不用传输。而白色块就是需要传输的内容,服务端会根据这些数据块重新生成新的文件。

通过只对变更的部分进行传送,其他相同文件块由服务端去复制写入,能大大减少数据的传输和加快大文件的上传速度。

对于像 CAD 等大文件编辑保存同步的场景下,尤为有效。

以上就是本期分享,如果大家对此感兴趣,欢迎各位关注、留言,大家的支持就是我的动力!

  • 收藏
  • 评论
  • 分享
  • 举报

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK