協同編輯功能實現原理概述

Lucky小黄人^_^發表於2024-03-17

協同編輯是一種多使用者同時線上編輯同一文件或專案的技術,允許多人實時或非同步地對內容進行新增、刪除和修改,但是不會互相覆蓋各自的修改。這在文件編輯、軟體開發等領域非常流行和有用,比如飛書文件、谷歌doc等。

協同編輯主要面臨的技術問題包括:版本管理、衝突檢測、合併衝突、實時同步、併發控制

協同編輯的主流演算法主要包括:OT 演算法(操作轉換Operational Transformation)、CRDT 演算法(衝突無關複製資料型別 Conflict-free Replicated Data Type)和DS 演算法(差異同步演算法Differential Synchronization )。

下面基於 OT 演算法簡單介紹一下協同編輯應用的實現原理。

一些概念

協同編輯,基於 socket 連線快速提交或者拉取資料。

用changeset 儲存變更,多個變更應用在文件中就變成了新文件。

當A/B 兩個變更都需要應用生效於文件中時,先應用的可以直接生效,後應用的需要基於先生效的變更做一些轉換計算,得到一個可以直接應用於文件的A'或者B', XAB'或者XBA'就成了一個新文件。轉換計演算法的演算法稱之為follow演算法。

對changeset集合進行 Compose 壓縮整理,將changset數量減少,基於壓縮後的changeset形成一個文件快照,減少文件被渲染時計算的次數

簡單實現過程

客戶端可以用三種型別的 changeset 來維護自身的狀態,即 AXY

  • A:服務端最新版本,所有已提交到服務端到 changeset 的集合
  • X:所有客戶端提交給伺服器,但還未收到 ACK 的 changeset 的集合
  • Y:所有客戶端產生了單還未提交給服務端到 changeset 的集合

客戶端和服務端資料互動過程

  • 客戶端將 X 和 A 版本提交到服務端後,使用 Y 來繼續儲存使用者的變更,
  • 服務端使用 follow 演算法處理產生衝突的 changeset 資料,並儲存處理後的 changeset,向客戶端傳送 ACK,並告知處理成功後的 changeset 版本號,
  • 如果客戶端有多個,服務端還需要向其他客戶端廣播這次提交的 changeset
  • 客戶端將 AX 作為最新版本,Y 集合提交給服務端進行剛才一樣的動作。

最簡單的互動過程,單個客戶端

多個客戶端

相關文章