開(kāi)發(fā)在線文檔時(shí),這個(gè)技術(shù)難點(diǎn)你解決了嗎?
“時(shí)勢(shì)造英雄”,是亙古不變的真理。在當(dāng)前的時(shí)代背景下,在線文檔可以稱(chēng)得上是這樣的“英雄” 。
新一代信息技術(shù)的迅猛發(fā)展,深刻影響著我們的工作生活方式。近年,遠(yuǎn)程辦公徹底顛覆了傳統(tǒng)的企業(yè)管理模式,在線文檔作為遠(yuǎn)程辦公軟件的重要組成部分也同樣迎來(lái)了高速發(fā)展。
如今,即便市場(chǎng)中已經(jīng)有了騰訊文檔、石墨文檔、飛書(shū)、語(yǔ)雀和靈犀文檔等在線辦公產(chǎn)品,但在線文檔本身仍面臨功能、技術(shù)、數(shù)據(jù)安全、服務(wù)、生態(tài)等多方面的考驗(yàn),如數(shù)據(jù)處理效率、多人協(xié)作、二次擴(kuò)展、系統(tǒng)集成、框架兼容性問(wèn)題等。
從技術(shù)角度來(lái)看,在線、數(shù)據(jù)處理和多人協(xié)作是開(kāi)發(fā)在線文檔系統(tǒng)最關(guān)鍵的技術(shù)指標(biāo)。不過(guò),在線和數(shù)據(jù)處理均已有較成熟的技術(shù)方案,實(shí)現(xiàn)難度不大。因此,多人協(xié)作才是影響在線文檔系統(tǒng)易用性的核心要素。
什么是多人協(xié)作?
多人協(xié)作,即多人同時(shí)對(duì)同一份文檔進(jìn)行編輯,用戶無(wú)需刷新即可看到其他人所做的修改。Google Docs、騰訊文檔、石墨文檔、Quip 等都具備多人協(xié)作功能。
那么,多人協(xié)作是如何實(shí)現(xiàn)的呢?
任何信息如要做到多人實(shí)時(shí)編輯與展現(xiàn),需要實(shí)現(xiàn)以下三步:
- 操作化
- 可傳輸
- 可還原
這三步,類(lèi)似于編解碼過(guò)程:首先將信息轉(zhuǎn)換為一組操作集合,然后將操作通過(guò)網(wǎng)絡(luò)傳輸給其他終端,最后在本地終端將操作還原為信息。
這些步驟看起來(lái)簡(jiǎn)單,但每一步都涉及很多細(xì)節(jié)處理,比如:操作化過(guò)程中,在對(duì)信息進(jìn)行分割與組合時(shí),如何確保信息的所有變化都可以分解為操作的集合?如何令操作覆蓋信息的所有變化?如何決定分割的顆粒度?
可傳輸需要考慮以下幾點(diǎn):
1、傳輸內(nèi)容
- 原始文本
Ⅰ.清晰
Ⅱ.冗余
- 壓縮技術(shù)
Ⅰ.邏輯壓縮
Ⅱ.協(xié)議壓縮
Ⅲ.手動(dòng)壓縮
2、網(wǎng)絡(luò)協(xié)議
- Socket
Ⅰ.TCP
Ⅱ.UDP
- HTTP
- WebSocket
3、QoS(Quality of Service,服務(wù)質(zhì)量)
- 快速失敗
- 自動(dòng)回滾
- 自動(dòng)重連
- 自動(dòng)恢復(fù)
可還原主要涉及:
1、絕對(duì)操作的還原
- 控制體積
- 合理的提示
2、相對(duì)操作的還原
- 嚴(yán)格的順序性
- 從源頭保障順序性
- 順序性的補(bǔ)救
3、本地操作的還原
- 過(guò)濾收到的操作集合
- 從源頭細(xì)化操作顆粒
- 本地保存本地執(zhí)行
4、無(wú)入侵的還原
- 定義入侵
- 排除入侵
- 千人千面
在了解了多人協(xié)作的基本原理之后,我們來(lái)研究一下它的技術(shù)難點(diǎn)。
多人協(xié)作有哪些技術(shù)難點(diǎn)?
多人協(xié)作,本質(zhì)是分布式系統(tǒng)中的 Multiple Leader Replication,即任何一個(gè)用戶端都可被視為 Data Leader,這些 Leader 之間同步數(shù)據(jù)必然會(huì)遇到亂序和沖突問(wèn)題。這就是多人協(xié)作的主要難點(diǎn)。
對(duì)于 Multiple Leader Replication 的沖突問(wèn)題,有如下解決方法:
- 避免產(chǎn)生沖突,即不讓多個(gè)用戶同時(shí)編輯同一處地方。該解決方法簡(jiǎn)單粗暴,使用時(shí)需具體查看產(chǎn)品形態(tài)是否適合該方案。
- 把沖突暴露給用戶,讓用戶自己解決。目前大多數(shù)專(zhuān)業(yè)的版本控制軟件采用了該方法,但它不適用于擁有大量非專(zhuān)業(yè)用戶的產(chǎn)品,如在線文檔。
- 給寫(xiě)入操作打上全局 index,可以是時(shí)間戳或序列號(hào),該 index 必須是全局的且遞增。在任何沖突的地方,都選擇 index 較高的那個(gè)寫(xiě)入。該方法的優(yōu)勢(shì)在于沖突的解決是完全自動(dòng)化的,不需要用戶參與。缺點(diǎn)就是如果遇到同步間隔很長(zhǎng)的情況,會(huì)丟失很多用戶的輸入。
在實(shí)際開(kāi)發(fā)在線文檔系統(tǒng)的過(guò)程中,Operational Transformation(OT)算法技術(shù)是解決多人協(xié)作沖突問(wèn)題較為常用的方法。這項(xiàng)技術(shù)誕生于 1989 年,其原理是將文本內(nèi)容統(tǒng)一為以下 3 種類(lèi)型的操作方式,目的是為用戶提供最終一致性實(shí)現(xiàn):
- retain(n):保持 n 個(gè)字符
- insert(str):插入字符 str
- delete(str):刪除字符 str
在完成上述操作后,OT 算法將正在并發(fā)的操作合并轉(zhuǎn)換,以形成新的操作流,并應(yīng)用在歷史版本上,實(shí)現(xiàn)無(wú)鎖化同步編輯。
(OT 算法技術(shù)中的操作轉(zhuǎn)換過(guò)程)
OT 算法背后的思想其實(shí)非常簡(jiǎn)單,就是在特定的條件下進(jìn)行相應(yīng)的操作轉(zhuǎn)換,因此,OT 主要用于文本,通常很復(fù)雜且不可擴(kuò)展。對(duì)于富文本編輯等更高級(jí)的結(jié)構(gòu),OT 用復(fù)雜性換來(lái)了對(duì)用戶預(yù)期的實(shí)現(xiàn),不會(huì)給系統(tǒng)性能造成過(guò)多的負(fù)面影響。因此,如今大多數(shù)實(shí)時(shí)協(xié)同編輯邏輯都是基于 OT 算法來(lái)實(shí)現(xiàn)的。
正因如此,OT 算法成為了解決當(dāng)前協(xié)同沖突處理最主要的方案之一。然而,即便它已經(jīng)誕生了 30 余年,控制算法相關(guān)的理論早已百花齊放,卻仍無(wú)法很好地處理分布式實(shí)現(xiàn)問(wèn)題,且開(kāi)發(fā)一個(gè)支持多人實(shí)時(shí)協(xié)同編輯的系統(tǒng)也遠(yuǎn)比想象中的更加復(fù)雜。
實(shí)現(xiàn)多人協(xié)作的突破口在哪里?
由此可見(jiàn),實(shí)現(xiàn)一款復(fù)雜的多人實(shí)時(shí)協(xié)同編輯系統(tǒng)僅僅依靠算法邏輯是不夠的,還需要根據(jù)不同的業(yè)務(wù)場(chǎng)景(如項(xiàng)目看板、純文本編輯、undo/redo 等),投入大量的研發(fā)成本和時(shí)間,并在不斷摸索中,尋找到產(chǎn)品性能和易用性之間的平衡點(diǎn)。
那么,是否存在一條更為簡(jiǎn)單快捷的解決方法呢?
通過(guò)對(duì)市面上多款在線協(xié)同辦公產(chǎn)品的示例代碼進(jìn)行分析,我們發(fā)現(xiàn)這些產(chǎn)品除了運(yùn)用到前文提到的 OT 算法之外,基本都會(huì)借助第三方表格組件。通過(guò)嵌入組件,在線文檔系統(tǒng)很好地支持了多人協(xié)作的最終一致性,給用戶提供了更加易用且多樣化的體驗(yàn)效果,在減少研發(fā)成本的同時(shí),實(shí)現(xiàn)了更高密度的計(jì)算復(fù)雜度,大幅提高了多人協(xié)作效率。
用于多人協(xié)作的表格組件需要具備哪些功能?
首先,是對(duì)于表格的功能支持。
由于表格的數(shù)值敏感性遠(yuǎn)高于其他數(shù)據(jù)類(lèi)型,用作多人協(xié)作文檔時(shí)可以實(shí)現(xiàn)更為細(xì)膩的操作顆粒度和計(jì)算復(fù)雜度。因此,所選用的組件必須具備強(qiáng)大的表格功能支持,不僅要在數(shù)據(jù)錄入、數(shù)據(jù)填報(bào)等方面展現(xiàn)出強(qiáng)大的能力,還要具備各類(lèi)統(tǒng)計(jì)、計(jì)算匯總、透視分析,以及圖形化手段。
其次,需要具備開(kāi)放的 API 接口,滿足更多定制化選項(xiàng)。
這類(lèi)組件需要提供豐富的事件和應(yīng)用程序接口,用于控制單元格狀態(tài)、表單保護(hù)、數(shù)據(jù)傳輸?shù)冗壿?,?duì)于多人協(xié)作而言,還需限制用戶對(duì)同一處內(nèi)容進(jìn)行編輯,以及插入時(shí)間戳(序列化)等功能。
出于好奇,筆者下載試用了網(wǎng)上多款表格組件,發(fā)現(xiàn)能滿足上述需求的屈指可數(shù),而 SpreadJS 無(wú)疑是最為亮眼的一款。這款組件主打可嵌入系統(tǒng)的“在線 Excel”,純前端的體系架構(gòu)可以很容易的嵌入系統(tǒng)開(kāi)發(fā),而無(wú)需考慮與原生系統(tǒng)的兼容性。值得一提的是,SpreadJS 采用了稀疏數(shù)組 (Sparse Array) 作為存儲(chǔ)模型,相較于傳統(tǒng)的鏈?zhǔn)酱鎯?chǔ)或數(shù)組存儲(chǔ),稀疏數(shù)組只會(huì)對(duì)非空數(shù)據(jù)進(jìn)行存儲(chǔ),而不需要對(duì)空數(shù)據(jù)開(kāi)辟額外的內(nèi)存空間。
除了節(jié)省內(nèi)存空間外,對(duì)于表格這類(lèi)布局松散的數(shù)據(jù)類(lèi)型,稀疏數(shù)組也更易于構(gòu)建基于行索引的數(shù)據(jù)字典,以便隨時(shí)替換或恢復(fù)整個(gè)存儲(chǔ)結(jié)構(gòu)中的任何一個(gè)級(jí)別的節(jié)點(diǎn),借助這一特性,SpreadJS 在多人協(xié)同中實(shí)現(xiàn)了高效的數(shù)據(jù)回滾和數(shù)據(jù)恢復(fù) (Redo/Undo)。
(SpreadJS 的稀疏矩陣存儲(chǔ)模型 (Sparse Array))
結(jié)語(yǔ)
企業(yè)協(xié)同辦公的需求將伴隨數(shù)字化轉(zhuǎn)型的深化而日益劇增。未來(lái)企業(yè)協(xié)同辦公將朝著產(chǎn)品易用性提升、可集成與二次擴(kuò)展能力、與原系統(tǒng)/業(yè)務(wù)的高度契合、滿足最終用戶的使用習(xí)慣等方向發(fā)展。
如何打破技術(shù)壁壘,開(kāi)發(fā)出既能滿足不同場(chǎng)景下的用戶需求,又具備市場(chǎng)競(jìng)爭(zhēng)力和差異化的在線文檔產(chǎn)品,是 SaaS 企業(yè)和系統(tǒng)供應(yīng)商們首要考慮的問(wèn)題。
“好風(fēng)憑借力,送我上青云。”在如今競(jìng)爭(zhēng)激烈的在線文檔領(lǐng)域,除了耗費(fèi)大量精力自主研發(fā),學(xué)會(huì)借力打力滿足不同的業(yè)務(wù)場(chǎng)景和客戶需求,或許也是一個(gè)不錯(cuò)的選擇。