背景

最近在做一个数据列表的双向同步,有几点限制条件:

  1. 同步双方系统时间可能相差比较大
  2. 网络不一定能连通,同时也不存在一个随时都可以连通的第三方
  3. 双方系统都能修改若干次(也可同时),即使现在网络没有连通
  4. 同步只能一方主动触发,另一方无法决定何时同步(即使网络畅通)

分析

我们逐个分析上述限制条件:

  1. 我们无法直接比较时间最新来同步;
  2. 不能实时同步,同时也无法使用全局的递增id来标识版本
  3. 很难通过被动同步方保存更改,让主动同步方应用这些改更改来实现,因为主动同步方应用这些更改时可能自己的数据也改过了
  4. 这个决定了同步是一方发起的,另一方提供数据拉取和更新接口

问题解决

通过讨论分析,我们使用了一个最近时间秒来标识更新以哪方为准。

具体方法是,双方同步时均提供各自的当前时间和最后一次更改时间(包括新增删除更新),然后分别计算各自当前时间减去最后一次更改时间的相差秒,秒数小的表示该方的更改是最新的,则更新以该方为准,如果相同则规定以特定的一方为准。

上述方案,解决了时间不一致和标识全局版本的问题,使用了 最近 的概念,谁最近,谁的版本的就最新。当然也会丢弃不是最新的修改,当然这在业务角度也是合理的。

其他

同步采取的是先拉取,再同步,如果拉取的“更近或相等”,说明其版本更新,则使用拉取的数据,否则使用本地的数据,有点类似版本控制的思路。

同时注意,由于每次同步也会导致双方最后更改时间更加新,所以可在同步时根据“最近时间秒_最后更改时间_同步方标识”判断是否需要更新数据,当然也可以逐个判断行和数据字段来决定是否更新,这样双方的最后更改时间就不会频繁更新了,也不会同步无需同步的无意义数据列表