【问题标题】:PouchDB/CouchDB Conflict Resolution Server SidePouchDB/CouchDB 冲突解决服务器端
【发布时间】:2018-11-16 17:46:48
【问题描述】:

我是袋子/沙发的新手,正在寻找有关处理冲突的一些指导。具体来说,我有一个运行 pouchdb 的扩展(分发给两个用户)。然后的想法是让一个 pouchdb-server 或 couchdb (这对这个小用例有关系吗?)实例远程运行。我关心的关键是处理冲突,数据会经常变化,虽然扩展不会进行实时同步,但它们会经常同步。我在数据提交函数中写入了冲突处理,但是当与多个用户发生同步时仍然可能存在冲突。

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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


    我制作了一个自动解决冲突的 NodeJS 守护进程。它集成了deconflict,这是一个 NodeJS 库,可让您以三种方式解析文档:

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

    修订解除冲突

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

    冲突扫描器

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

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

    队列处理

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

    【讨论】:

    • 不错!您似乎在做与我在回答中描述的大致相同的事情,但我不知道 deconflict。我会调查的....谢谢!
    • 我认为我必须稍微修改一下库。如果我的记忆是正确的,修订合并是下降而不是上升。我还重写了库以使用承诺而不是回调
    【解决方案2】:

    在使用 Redux 之后,我意识到单向流的相同概念可以帮助我完全避免冲突问题。

    Redux 流程是这样的......

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

    我不是在处理超大容量,所以延迟不是问题。

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

    【讨论】:

    • 感谢您详细的撰写。我想我正在寻找一种类似于 firebase 中的云功能的解决方案,某种内置的东西。现在知道最终的完整设置后,您是否会使用相同的工具(即袋子/沙发等)以同样的方式进行操作?
    • 对于主数据库,我可能会看 Redis 或 Couchbase,因为支持更可用。但是通过 PouchDB 服务器通过 LevelUp 使用 Redis 似乎......有风险。 Couchbase 网关看起来得到更好的支持,但我没有尝试过。我的主要标准是浏览器中的复制数据库。我发现 PouchDB 的唯一不错的替代品是 Minimongo,但它在 Meteor 之外不受支持。当然还有 Firebase。现在有几次,谷歌改变了一项云服务,破坏了我的工作并让我付出了巨大的代价。我真的不想再被烫伤了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    相关资源
    最近更新 更多