小编Nik*_*sik的帖子

同步两个对象列表

问题

我有两个对象列表。每个对象包含以下内容:

  • GUID (允许确定对象是否相同 - 从业务角度来看)
  • Timestamp (每次对象更改时更新到当前 UTC)
  • Version (正整数;每次对象改变时递增)
  • Deleted (布尔标志;切换到“真”而不是实际删除对象)
  • Data (一些有用的有效载荷)
  • 如果需要,任何其他字段

接下来,我需要根据这些规则同步两个列表:

  • 如果某些对象GUID仅出现在一个列表中,则应将其复制到另一个列表中
  • 如果GUID两个列表中都出现了一些对象,Version则应将具有较少的实例替换为具有较大的实例Version(如果版本相同,则无关紧要)

实际要求:

  • 每个列表有 50k+ 个对象,每个对象大约 1 Kb
  • 列表被放置在通过互联网连接的不同机器上(例如,移动应用程序和远程服务器),因此算法不应该浪费太多流量或 CPU
  • 大多数情况下(比如 96%)列表在同步过程之前已经同步,因此,算法应该以最小的努力来确定它
  • 如果有任何差异,大多数情况下它们很小(更改/添加了 3-5 个对象)
  • 如果一个列表为空,则应继续执行(而其他列表仍有 50k+ 项)

解决方案#1(目前已实施)

  1. 客户端存储上次同步成功的时间(比如T
  2. 两个列表都要求所有具有Timestamp> T(即最近修改过的对象;在生产中它是 ... > ( T- day ) 以获得更好的健壮性)
  3. 这些最近修改的对象列表是天真同步的:
    • 仅出现在第一个列表中的项目将保存到第二个列表中
    • 仅出现在第二个列表中的项目将保存到第一个列表中
    • 其他项目将它们的Version's 进行比较并保存到专用列表(如果需要)

过程:

  • 小改动效果很好
  • 几乎符合要求

缺点:

  • 取决于T,这使算法变得脆弱:同步上次更新很容易,但很难确保列表完全同步(使用T1970-01-01 …

algorithm list data-synchronization

5
推荐指数
1
解决办法
4491
查看次数

标签 统计

algorithm ×1

data-synchronization ×1

list ×1