代码之家  ›  专栏  ›  技术社区  ›  NickG

API:我如何远程检查两个数据集是否相同,而不通过API发送所有数据?

  •  1
  • NickG  · 技术社区  · 8 年前

    我正在构建一个允许远程系统同步的api 数以百万计的 数据表中的行(单向)。系统在每一端运行不同的数据库(我的接收系统是sql server,但发送系统是sap/hana),因此它们只能通过api进行通信。

    仅使用api上的方法,如何确定两个系统之间数据行的差异并确保它们始终同步?

    我的一个想法是提供一个ID列表(主键),接着是某种“检查”值或LaMasDATEDATE DATE,远程系统可以使用这些数据来找出需要添加或更新哪些记录。但是,如果有1000万行+,是否有任何方式避免每次发送所有1000万个密钥时,我想同步数据库?

    有没有什么协议我可以从中复制出类似的想法?例如,我知道imap使用了类似于上面的方法,但是在处理“数百万”电子邮件方面很差。

    编辑 (附加信息):

    • 在源系统上没有记录可以删除-所以我不需要处理它。
    • 每年将有2000万个新的行,最多约为1.5亿个。
    • 旧记录偶尔会更新,需要触发重新同步。
    1 回复  |  直到 8 年前
        1
  •  1
  •   btilly    8 年前

    有一个定理,没有完美的方法来做到这一点而不发送完整的数据通过电线。

    但是你可以作弊。这个 rsync 实用程序通过散列整个范围并进行比较来解决此问题。如果存在差异,它将分成块并重复,直到找到要发送的最小差异为止。这是作弊的原因是不同的东西的散列不是 放心 不同-他们很可能是不同的。

    在你的情况下,我建议每个行都有哈希,然后在原始ID.的基础上散列这些散列的连接,如果有一个没有差异的块,你可以忽略它。如果它有差异并且很大,那么分成 k 块(您可以在 K )再重复一遍。如果它有差异并且小于 N 行(实验也一样)然后发送哈希列表,并且知道要比较的行。

    为了效率,我将预先计算每行的哈希值,如@ ScSimon建议的,并有一个组合索引。 (id, hashed) . 这样,所有要拉回来的查询和散列块将只是索引数据结构上的范围查询,甚至不访问大表。相信我,这会对性能产生非常显著的影响。