我正在编写一个应用程序,它需要在客户端和(http)服务器之间同步文件结构。
文件结构本质上是文件路径列表,其中每个路径是与一个或多个数据块ID连接的字符串(对实际数据块的256位引用)。数据块可以由多个文件引用,因此路径和ID之间存在n-m关系。现在它只是一个带有id的路径列表,但它可以很容易地转换为路径所代表的树结构,如果这是同步所必需的。
我正在寻找一种允许我有效地同步这些数据的数据结构。主要实现两个目标:
如你所见,目标有点矛盾,因此我正在寻找能找到它们之间良好中间地带的东西。通过将多个更改分组到一个http请求中可以轻松实现第二个目标,但是服务器所需的处理(解析HTTP请求所请求的所有更改)应该非常便宜,计算明智。
我还应该提到,可能有几个客户端在服务器上同步相同的结构。因此,必须很容易通过一个客户端检测更改,然后将其同步到另一个客户端(即,它不仅仅是上传到服务器)。
我当然不是第一个这样做的人,所以我假设有一些智能解决方案可用。例如,我猜Dropbox和Subversion在同步元数据时都有类似的要求。有没有人碰巧知道他们是如何实现它的?
答案 0 :(得分:2)
有什么理由不使用rsync?如果您需要以编程方式控制它,则有librsync。
subversion源代码是开放的,所以你可以检查一下。另外,我知道Mercurial有一个非常聪明的wire protocol用于最小化流量。
答案 1 :(得分:1)
我决定使用事务日志来解决这个问题。每个客户端将对树的所有更改保存到事务日志(除了它还保留的树的本地数据库之外),它会定期与服务器同步。该日志只是一个包含file-> datablock-id和时间戳的条目列表。
当日志已发送到服务器时,它将从客户端中删除。在上载日志之前,它还要求其他客户端写入同一树的日志。然后将这些日志合并到本地树中。
日志本身将使用Azure Blob存储存储在服务器上。服务器可以定期从日志中删除旧条目(如果它变大)。
这样,客户端可以有效地相互传递其变化,而服务器不需要对每个请求进行任何昂贵的处理。