PouchDB / CouchDB冲突解决服务器端

时间:2018-11-16 17:46:49

标签: node.js couchdb pouchdb firefox-webextensions merge-conflict-resolution

我是新手,正在寻找有关处理冲突的指导。具体来说,我有一个运行pouchdb的扩展(分发给两个用户)。然后的想法是让一个pouchdb-server或couchdb(对于这么小的用例来说重要吗?)实例远程运行。我关心的问题是处理冲突,数据将经常更改,尽管扩展程序不会进行实时同步,但它们将非常频繁地进行同步。我已经在数据提交功能中写入了冲突处理,但是当与多个用户进行同步时,仍然可能会发生冲突。

我正在查看pouch-resolve-conflicts插件,并立即看到作者状态:

  

“最好在服务器端解决冲突,以避免当多个客户端解决同一文档中的冲突时难以调试循环”。

这对我来说很有意义,但是我不确定如何实施这种冲突 解析度。我能想到的唯一方法是放置REST API层 在使用自定义逻辑处理所有更新/冲突等的远程数据库的前面。 但是,我该如何使用邮袋同步功能?那时我 可能只是使用其他数据库。

我刚刚找不到任何资源来讨论如何在服务器端实现冲突解决,实际上相反。

2 个答案:

答案 0 :(得分:3)

对于您的用例,您可能可以写入本地pouchdb实例,并将其与master数据库同步。然后,您可以拥有一个守护程序,该守护程序可以自动解决您的master数据库上的冲突。

下面是我解决类似问题的方法。


我制作了一个NodeJS守护程序,该守护程序可以自动解决冲突。它集成了deconflict,这是一个NodeJS库,可通过以下三种方法来解析文档:

  • 将所有修订合并在一起
  • 保留最新版本(基于自定义键。例如:updated_at)
  • 选择某个修订版本(您可以在此处使用自己的逻辑)

修订版冲突

我使用CouchDB的方式,每次写入都是局部的。我们始终会进行一些更改,并将其应用于最新文档。通过这种方法,我们可以轻松地采用merge all revision策略。

冲突扫描器

启动守护程序时,将执行两个进程。经历所有变化的一种。如果检测到冲突,则会将其添加到conflict queue

另一个过程被执行并保持活动状态:连续更改扫描仪。 它会监听所有新更改,并将有冲突的文档添加到conflict queue

队列处理

另一个进程已启动,并继续轮询队列以查找新的冲突文档。它批量获取有冲突的文档,并一一解决。如果没有文档,则只需等待一段时间,然后重新开始轮询。

答案 1 :(得分:1)

与Redux一起工作了一点,我意识到单向流的相同概念将帮助我完全避免冲突的问题。

Redux像这样...

The Redux Flow

因此,我的客户端代码永远不会将确定的数据写入master数据库,而是在本地写入insert / update / delete 请求,然后PouchDB将其推送到CouchDB master数据库。在与主CouchDB相同的服务器上,NodeJS中有PouchDB复制这些请求。 NodeJS中的“ Superviser”软件检查每个新请求,将其状态更改为“处理中”,写入请求的更新,插入和删除,然后将请求标记为“已处理”。为了确保在接收到每个请求的代码时对它们进行一次处理,请将它们填充到FIFO中。处理代码将它们从另一端拉出。

我处理的不是超大音量,因此延迟不是问题。

我也没有遇到很多人可能试图同时更新完全相同的记录的情况。如果是这种情况,您的客户端更新请求将需要指定 rev 号,而您的“主管”将需要拒绝引用被取代版本的更改请求。您必须弄清楚客户端代码将如何获得并响应这些拒绝。