0

总结:有什么众所周知的技术可以将数据分块以进行同步吗?块被认为是单独传输的数据块。

这可能是一个相当广泛的问题。收到建议后,我将开始更专业的话题。

我将设计/编写用于将 Android 平板电脑数据库 (SQLite) 与通过 Web 服务访问的中央数据库同步的代码。该机制应反映以下事实:

  1. 它将用于应用范围。应用程序相当简单。无论如何,他们应该主要离线工作。
  2. 数据量可以从小到大(达到平板电脑的技术限制)。
  3. Web 服务实现可能依赖于客户(即应用程序不得要求重写 Web 服务;例如,保留 SOAP 而不是强制 REST 可能有历史原因)。
  4. 在某些情况下,可以为应用程序创建特定的新 Web 服务(在客户站点使用相同的技术)。

问题的核心是如何最小化同步期间移动的数据大小。问题不在于如何实现异步下载。(我正在考虑 Virgil Dobjanschi 在开发 Android REST 客户端应用程序中介绍的实现技术。)

到目前为止,我已经找到了以下基本方法(不按特定顺序):

  1. 少量数据的蛮力,即接收/发送所有内容,解决目标端的差异(下载时在平板电脑上,上传时在远程服务器上)。这里(比如说)整个数据库表可以看作是最大可能的数据块。
  2. 使用数据记录的修改日期(时间戳),并根据上次同步时记住的日期仅同步较新的记录。对于添加和修改的记录,这很好;但是,对于删除的记录,必须使用一些额外的机制。这里可以将单个记录视为可能的最小数据块。

以上是用于同步单个数据块的。更现实的情况需要对更多记录进行分块。这里我认为块是可以单独传输的数据块。当传输失败(即由于各种原因离线)时,只有失败和未传输的块必须同步。

对我来说很清楚的是块应该有一定的大小(形成一个数据块,比如说大约 10 kB)。

为了降低通信成本,构建的块包应该保持不变,直到块的某些记录发生变化、添加或删除。无论是在中央服务器端还是在平板设备上构造块,都应该独立地构造相同的块。

其他块不应受到包含更改数据的块的影响。这样,假设可以为两侧的每个块计算 SHA 摘要,并且可以很容易地找到应该同步哪些块。

是否有任何关于如何确定块的标准技术、论文、示例?

谢谢

4

1 回答 1

0

在我们的Rethync SDK框架(开源)中,我们采用了以下路线:每个对象的状态信息是一个不透明的字段(可以使用数据的时间戳或哈希或一些唯一标记 - 留给开发人员决定)。同步核心将该字段的值与保存状态进行比较,然后决定是否需要上传、下载、删除对象等。

这种方法要求在同步后保存状态(框架允许您保存状态)并用作在下一次同步期间检测更改的基础。

我欢迎您检查 Rethync,因为它与您现在正在实施的完全一样。

于 2013-10-04T14:09:39.440 回答