使用增量改进客户端-服务器数据同步功能

12

应用程序
我有一个网络应用程序,目前使用AppCache来提供离线功能,因为系统的用户需要在线下创建文档。文档首先在离线状态下创建,并且当有网络连接时,用户可以点击“同步”,将该文档发送到服务器并保存为修订版。更具体地说,该应用程序不会将更改的增量(准确字段)作为修订版保存,而是完整地保存整个文档。因此,换句话说,保存了一个“快照”文档。

问题
用户可以从不同的浏览器和设备登录并处理其文件。当他们点击“同步”时,如果服务器上的文档更新,则服务器端版本将覆盖客户端的整个版本。这导致以下图像中所示的主要问题。

enter image description here

上述情况发生的原因是当前实现不依赖于增量(小变化),而是依赖于快照修订版。

一些问题

1)我的研究表明,我应该升级“同步”机制以表示增量(可以独立应用的小变化)。这是一个可行的方法吗?

2)每个增量是否应独立应用?

3)根据我的研究,修订增量具有数值而不是时间戳。该值应该是多少?我如何确保服务器和客户端在修订号方面达成一致?

堆栈信息

  • Angular前端
  • 使用IndexedDB本地保存文档(离线模式)
  • 后端使用带有JSONB的Postgres数据库

1
相关链接:https://dev59.com/VIjca4cB1Zd3GeqPvFW4 - Jack Wade
Git已经在做这个了,也许可以以某种方式使用它来展示给用户文档的差异。 - Dmitry Yudin
1
Jack Wade的回答为您总结了一切。使用差异工具/脚本,您可以获取增量,其中大多数不应该有冲突(例如,编辑相同的行),然后您必须找出解决任何冲突的最佳方法(例如,我们的,他们的,手动合并,最新版本胜出等)。 - Ryan Wheale
1个回答

6
您所描述的是版本控制问题,类似于这个问题。如何解决取决于您自己。以下是其他产品的一些例子:
  • Google Docs:A 离线编辑,B 在线编辑,A 上线,同步,Google Docs 合并 A 和 B 的编辑。
  • Apple Notes:与 Google Docs 相同。
  • Git/Subversion:抛出错误,要求用户解决冲突。
  • Wunderlist:最后一次编辑覆盖之前的编辑。

对于您的情况,最简单的解决方案是使用 Wunderlist 的方法,但这似乎会导致可用性问题。用户希望发生什么?

直接回答您的问题:

  1. 如果您不想覆盖,则需要自定义同步实现。
  2. 这是一个可用性决策,用户期望什么?
  3. 正确,修订版是数字(例如 r1、r2)。为了得到服务器的同意,请修改上次同步请求的返回值。每次可以将整个模型返回给客户端(或者只是正常同步时返回 200 OK)。如果将模型返回给客户端,请使用最新的模型更新客户端。

无论如何,服务器应始终是真相的源头。 这篇文章提供了一些关于服务器/移动设备参考完整性的好建议:

要跟踪插入,您需要一个创建时间戳...要跟踪更新,您需要在行上跟踪 LastUpdate 时间戳...要跟踪删除,您需要一个墓碑表。

请注意,在执行同步时,您需要检查服务器和移动设备之间的时间偏差,并且需要有一种解决冲突的方法。插入不是什么大问题(它们不应该发生冲突),但更新可能会发生冲突,删除可能会与更新发生冲突。


我修改了原来的答案,加入了更具体的细节。Backbone在这里没有帮助,主要是因为它不够有见地,并且没有离线-在线同步模型来处理修订。 - dipole_moment
1
@dipole_moment 好的,这是版本控制中的一个经典问题。我会更新。 - Jack Wade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接