在線文檔有哪些技術(shù)難點

實現(xiàn)一個多人協(xié)作在線文檔有哪些技術(shù)難點?
想知道實現(xiàn)類似于語雀、石墨文檔或騰訊文檔等產(chǎn)品的難點在哪些地方?
大體上說,多人協(xié)作的在線文檔在技術(shù)上主要分成三大塊:“在線”、“多人協(xié)作”和“文檔編輯”。
先說“在線”,在線其實就是個B/S或者C/S架構(gòu),也就是一個web/native用戶端加上一個服務(wù)器端。這里的技術(shù)難點不算很大,主要就是把數(shù)據(jù)同步的問題解決了,即如何讓用戶端的輸入及時準確地同步到服務(wù)器端,當然同時還要考慮網(wǎng)絡(luò)傳輸失敗、性能等等問題,這里web側(cè)比較好的一個開源解決方案就是 PouchDB,它可以幫你快速實現(xiàn)數(shù)據(jù)在瀏覽器和服務(wù)器端的雙向同步,有興趣的可以了解一下。
然后是“多人協(xié)作”,本質(zhì)上是一個分布式系統(tǒng)上常說的 Multiple Leader Duplication,任何一個用戶端都可以視為一個 Data Leader,這些 Leader 之間同步數(shù)據(jù)必然會遇到?jīng)_突的問題。
對于 Multiple Leader Duplication 的沖突問題,解決方法也就那么幾種:
直接避免產(chǎn)生沖突。具體方法就是不讓多個用戶同時編輯同一處地方,這種解決方法最有效也最粗暴,具體要看產(chǎn)品形態(tài)適不適合這種方案。
把沖突暴露給用戶,讓用戶自己解決?,F(xiàn)在大多數(shù)專業(yè)的版本控制軟件就是這么做的,但不適用于在線文檔這種大部分用戶都是非專業(yè)的產(chǎn)品。
給寫入操作打上一個全局 index,可以是時間戳,可以是序列號,總之是全局的并且是遞增的即可,然后任何沖突的地方,都選擇 index 較高的那個寫入。這樣的好處就是沖突的解決是完全自動化的,不需要用戶參與。缺點就是如果遇到同步間隔很長的情況,會丟失很多用戶的輸入。比如你斷網(wǎng)寫了一小時文章,然后又連網(wǎng)同步,發(fā)現(xiàn)被你同事幾分鐘前的修改給覆蓋了。
1、寫 UI,并且把這些 Model 狀態(tài)映射到 UI 上,這里完全不需要考慮輸入,就是很純凈地把一堆 Model 映射到 UI 上。比如文檔對象的渲染、編輯器各種狀態(tài)的實現(xiàn)等等
2、處理用戶的輸入,修改相應(yīng)的狀態(tài),比如用戶在界面空白處點擊了鼠標右鍵,我們需要打開右鍵菜單,具體做法就是把編輯器狀態(tài)里的右鍵菜單設(shè)置為打開,并且設(shè)置好位置即可。
雖然說起來這么簡單,但實際開發(fā)的時候確實有很多難點:
用戶的輸入具有復(fù)雜性。比如在一個地方按下鼠標(mousedown),那么光標應(yīng)該移動過去,但如果用戶這時繼續(xù)拖動鼠標(mousemove),那么就應(yīng)該是一個拖選事件,如何正確區(qū)分點擊和拖選就是一個比較麻煩的問題。類似的問題還有快捷鍵的實現(xiàn)、點擊穿透問題,如果有移動端的話還會遇到定制光標樣式的問題。
