从服务器到客户端同步数据库的一部分

时间:2019-07-06 16:24:53

标签: database synchronization client-server consistency

简介

我们开始在Web客户端中使用数据库,因为我们希望该数据库能够脱机工作。当前,我们使用HTTP GET请求从服务器获取数据,其中ETag / If-None-Match是唯一的通信优化。

由于客户端数据库,我们认为这是不合适的。例如,当客户请求当前报价列表时,它要么得到304 NOT MODIFIED,要么得到整个列表,通常与已有的列表略有不同。

因此,我们决定在响应中添加一个时间戳,该时间戳随新请求一起发送,以便仅包含自上一个请求以来创建或更新的项目(让我们忽略忽略删除)。新的响应。

问题

由于我们数据库中的所有项目都有修改时间戳,因此这应该很容易。但是,只有在时间t时,服务器才可以看到所有带有时间戳ts <= t的项目。出于多种原因,例如事务隔离和数据库复制(我们计划使用galera集群),这是不正确的。

可能发生以下情况:

  • 最初,没有数据。
  • t=5时间,服务器向客户端发送一个空列表。
  • 在时间t=6上,从数据库的POV中出现一个带有ts=4的项目。
  • 在时间t=7,客户请求自t=5(它在上次响应中收到的时间戳)开始的消息。
  • 此后,服务器没有看到任何创建或更新的项目,并再次发送了一个空列表。

客户错过了该物品,并且此损坏状态从未修复

可能的补救方法

允许一些重叠(当客户声称在时间t时拥有所有数据时,请检查自t - Δ之后的所有更改)可以提供帮助,但事务和复制将长期运行,没有理智的上限。我们希望大约每秒同步一次客户端,所以说(五秒钟)(Δ)意味着五次发送每次更改。

这很糟糕,但是它仍然不能保证陈旧的数据不会永远留在客户端中。

我们可以用(id, timestamp)对所有项目的列表替换时间戳,但这听起来不切实际。

问题

尽管有大量关于数据库同步的文章,但我找不到有关“部分同步”的任何信息。我可能错过了正确的搜索词。...有人这样做吗?

是否存在针对上述问题的简单有效的解决方案? 还是一些不错的选择?

0 个答案:

没有答案