簡體   English   中英

PouchDB / CouchDB沖突解決服務器端

[英]PouchDB/CouchDB Conflict Resolution Server Side

我是新手,需要一些有關處理沖突的指導。 具體來說,我有一個運行pouchdb的擴展(分發給兩個用戶)。 然后的想法是讓一個pouchdb-server或couchdb(對於這么小的用例來說重要嗎?)實例遠程運行。 我關心的問題是處理沖突,數據將經常更改,盡管擴展程序不會進行實時同步,但它們將非常頻繁地進行同步。 我已將沖突處理寫入數據提交功能,但是當與多個用戶進行同步時,仍然可能存在沖突。

我正在查看pouch-resolve-conflicts插件,並立即看到作者狀態:

“沖突解決最好在服務器端完成,以避免當多個客戶端解決同一文檔上的沖突時難以調試循環”。

這對我來說很有意義,但是我不確定如何實施這種沖突解決方案。 我能想到的唯一方法是將REST API層放置在使用自定義邏輯處理所有更新/沖突等的遠程數據庫的前面。 但是,我該如何使用郵袋同步功能? 到那時,我還可以使用其他數據庫。

我只是找不到任何資源來討論如何在服務器端實現沖突解決,實際上相反。

對於您的用例,您可能可以寫入本地pouchdb實例,並將其與master數據庫同步。 然后,您將擁有一個守護程序,可以自動解決您的master數據庫上的沖突。

下面是我解決類似問題的方法。


我已經制作了一個NodeJS守護程序來自動解決沖突。 它集成了deconflict (一個NodeJS庫),該庫使您可以通過三種方式解析文檔:

  • 合並所有修訂
  • 保留最新修訂(基於自定義鍵。例如:updated_at)
  • 選擇某個修訂版(您可以在此處使用自己的邏輯)

修訂版沖突

我使用CouchDB的方式,每次寫入都是局部的。 我們始終會進行一些更改,並將其應用於最新文檔。 通過這種方法,我們可以輕松地采用merge all revision策略。

沖突掃描器

守護程序啟動時,將執行兩個進程。 經歷所有變化的一種。 如果檢測到沖突,則會將其添加到conflict queue

另一個過程被執行並保持活動狀態:連續更改掃描儀。 它偵聽所有新更改並將沖突的文檔添加到conflict queue

隊列處理

啟動另一個過程,並繼續輪詢隊列以查找新的沖突文檔。 它批量獲取有沖突的文檔,並一一解決。 如果沒有文檔,則只需等待一段時間,然后重新開始輪詢。

與Redux一起工作了一段時間后,我意識到單向流的相同概念將幫助我完全避免沖突問題。

Redux像這樣...

Redux流

因此,我的客戶端代碼永遠不會將確定的數據寫入master數據庫,而是在本地寫入插入/更新/刪除請求 ,然后PouchDB將其推送到CouchDB master數據庫。 在與主CouchDB相同的服務器上,NodeJS中有PouchDB復制這些請求。 NodeJS中的“ Superviser”軟件檢查每個新請求,將其狀態更改為“處理中”,寫入請求的更新,插入和刪除,然后將請求標記為“已處理”。 為了確保在接收到每個請求的代碼時對它們進行一次處理,請將它們填充到FIFO中。 處理代碼將它們從另一端拉出。

我沒有處理超大音量,因此延遲不是問題。

我也沒有遇到很多人可能試圖同時更新完全相同的記錄的情況。 如果這是你的情況,你的客戶端的更新請求將需要指定的數,你的“上司”需要拒絕指被取代的版本變更請求。 您必須弄清楚您的客戶端代碼將如何獲得並響應這些拒絕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM