1

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

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

我正在寻找一种数据结构,它可以让我有效地同步这些数据。主要实现两个目标:

  1. 一个文件的更改不应强制客户端将整个文件结构发送到服务器,而只是发送它的一小部分。
  2. 如果更改了许多文件,则应将这些更改组合在一起。例如,1000 次更改不会导致向服务器发送 1000 次请求。

如您所见,目标有点矛盾,因此我正在寻找能够在它们之间找到良好中间立场的东西。第二个目标可以通过将多个更改分组到一个 http-request 中轻松实现,但是服务器所需的处理(解析 HTTP-request 请求的所有更改)应该是非常便宜的,计算明智的。

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

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

4

2 回答 2

2

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

颠覆源代码是开放的,所以你可以检查一下。另外,我知道 Mercurial 有一个非常智能的有线协议来最小化流量。

于 2009-11-25T20:23:48.737 回答
1

我决定使用事务日志来解决这个问题。每个客户端都将树的所有更改保存到事务日志(除了它还保留的树的本地数据库),它会定期与服务器同步。日志只是带有文件-> 数据块 ID 和时间戳的条目列表。

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

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

这样,客户端可以有效地相互通信其更改,而服务器不必对每个请求进行任何昂贵的处理。

于 2009-11-26T22:36:11.680 回答