關於實時協同編輯的架構思考

2021-10-06 23:53:10 字數 1581 閱讀 6798

協同編輯是指多人同時對同乙份文件進行編輯。

但是這三個問題會形成乙個不可能三角

即任意方案只能滿足其中2個點,犧牲第3個點。

有的同學可能對這個三角形不是很理解。

我們可以這樣類別,將協同編輯的文件模擬為分布式資料庫,編輯者類別為資料庫的讀寫服務,那麼我們的這個三角形就可以轉換為cap不可能三角

關於cap定理,可以參見我的部落格一文看懂cap定理_黃騰霄的部落格-csdn部落格

架構抉擇第一件要做的事情是挑出哪些點是必須要滿足的,哪些點是可以妥協的。

這裡我們會選擇實時性和容錯性:

容錯性:實現分布式協同和遠端辦公的基礎,也是協同的必要條件

那為什麼一致性可以妥協呢?

首先我們要基於這乙個假設:

在實時協同編輯的場景下,衝突是小概率事件。

就是說大部分情況下,協同編輯的參與者都會在文件的不同部分進行操作,而很少會同時對同一區域進行操作。

因此我們需要處理一致性問題的情況較少。

另外,我們只是放棄強一致性,在各端同步之後,能夠較快的恢復到完全一致的狀態,實現最終一致性。

如果熟悉git的同學,就會發現diff-patch和git的版本管理基本一致。

當出現版本衝突時,會通過diff演算法計算出,兩個版本之間的差異值,然後生成乙個patch,將兩個版本的內容合併。

這樣就能讓伺服器端和本地端的文件內容重新保持一致。

但是diff-patch這種方式是基於文件內容比較的,那就意味著一旦出現對同一行的操作衝突,就需要人工介入,選擇其中乙個版本的內容。

例如git,出現合併衝突時,需要開發者對所有衝突部分進行人工處理。否則很容易出現無法執行的**。

這種方式適用於「編輯——儲存——解決衝突」的互動方式,比如kb文件。

operational transformation方法是將所有的編輯行為封裝成乙個個的操作。

各個編輯者執行單個操作後,會將操作資訊同步到各個協作端。

協作端根據操作的執行時間戳,調整文件狀態,保持各端操作順序的一致性。

注意的一點,operational transformation只是一種操作思想,具體的操作實現可以按照業務情況處理。

下面是我思考的兩種操作方式:

在實際的應用中,我們可以採用兩者結合的方式。

此時操作變更較少,衝突和補償處理也會比較輕量,對使用者感知少。

在出現較長時間斷線,或者離線編輯的情況下,可以在連線後進行一次diff-patch,確保較大部分的改動可以同步。

本文會經常更新,請閱讀個人部落格原文: ,以避免陳舊錯誤知識的誤導,同時有更好的閱讀體驗。

spark的架構思考(一)

任何架構都是由需求分析得來,而spark是由怎麼樣的需求分析而來的呢?需求 怎樣快速計算大資料 解決方案 將大量的資料分成很多塊,讓不同的計算機進行計算,然後再彙總起來,這就是簡單的mr計算模型。但是hadoop的mr計算模型,太單一,而且重度依賴io,新的需求 需求又來了,怎樣又讓它快,又讓它計算...

運維平台系列 關於DevOps平台架構思考

現在很多公司都在推行devops平台。為了能夠提公升研發運維效率。這一章節主要寫點關於偏ops層面的東西,dev層面的東西主要涉及到研發域的內容包括 管理 編譯與發布管理 研發流程專案管理及bug管理等。乙個大的產品與技術架構圖 後續會將各個子產品域的設計大圖整理出來.1.關於決策層的思考 基於運維...

關於新架構的思考

1.對request和session的深層封裝真的有實際意義嗎?2.如果request封裝的真的很厚實,那麼,我們必須要保證的,控制器在完全屏棄request以後,能夠方便獲取request中的物件.方便訪問session中的物件,這點,在分層體系架構的設計上是非常重要的.3.對於bo和持久層,以及...