用于同步文件树的数据结构

时间:2009-11-25 20:02:58

标签: file data-structures tree sync dropbox

我正在编写一个应用程序,它需要在客户端和(http)服务器之间同步文件结构。

文件结构本质上是文件路径列表,其中每个路径是与一个或多个数据块ID连接的字符串(对实际数据块的256位引用)。数据块可以由多个文件引用,因此路径和ID之间存在n-m关系。现在它只是一个带有id的路径列表,但它可以很容易地转换为路径所代表的树结构,如果这是同步所必需的。

我正在寻找一种允许我有效地同步这些数据的数据结构。主要实现两个目标:

  1. 一个文件中的更改应该强制客户端将整个文件结构发送到服务器,只是它的一小部分。
  2. 如果更改了许多文件,则应将这些更改组合在一起。例如。这样1000次更改不会导致1000次请求到服务器。
  3. 如你所见,目标有点矛盾,因此我正在寻找能找到它们之间良好中间地带的东西。通过将多个更改分组到一个http请求中可以轻松实现第二个目标,但是服务器所需的处理(解析HTTP请求所请求的所有更改)应该非常便宜,计算明智。

    我还应该提到,可能有几个客户端在服务器上同步相同的结构。因此,必须很容易通过一个客户端检测更改,然后将其同步到另一个客户端(即,它不仅仅是上传到服务器)。

    我当然不是第一个这样做的人,所以我假设有一些智能解决方案可用。例如,我猜Dropbox和Subversion在同步元数据时都有类似的要求。有没有人碰巧知道他们是如何实现它的?

2 个答案:

答案 0 :(得分:2)

有什么理由不使用rsync?如果您需要以编程方式控制它,则有librsync

subversion源代码是开放的,所以你可以检查一下。另外,我知道Mercurial有一个非常聪明的wire protocol用于最小化流量。

答案 1 :(得分:1)

我决定使用事务日志来解决这个问题。每个客户端将对树的所有更改保存到事务日志(除了它还保留的树的本地数据库之外),它会定期与服务器同步。该日志只是一个包含file-> datablock-id和时间戳的条目列表。

当日志已发送到服务器时,它将从客户端中删除。在上载日志之前,它还要求其他客户端写入同一树的日志。然后将这些日志合并到本地树中。

日志本身将使用Azure Blob存储存储在服务器上。服务器可以定期从日志中删除旧条目(如果它变大)。

这样,客户端可以有效地相互传递其变化,而服务器不需要对每个请求进行任何昂贵的处理。