想實現多人協作的“線上Excel”?真沒那麼簡單

来源:https://www.cnblogs.com/powertoolsteam/archive/2019/12/11/onlineexcel.html
-Advertisement-
Play Games

本文由葡萄城技術團隊原創並首發 轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。 Excel是我們辦公中常用的工具 ,它幾乎能為我們處理大部分數據,友好的交互界面、豐富的公式函數和易於上手的圖表為我們在數據統計方面提供了不小的幫助,但經過一段時期運行,就會出 ...


本文由葡萄城技術團隊原創並首發

轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。

 

Excel是我們辦公中常用的工具 ,它幾乎能為我們處理大部分數據,友好的交互界面、豐富的公式函數和易於上手的圖表為我們在數據統計方面提供了不小的幫助,但經過一段時期運行,就會出現下麵的情況:

 

 

 

這樣多分枝的混亂狀況就會難以保證文檔的安全性及權威性。

於是聰明的小伙伴想到了一個解決方案,共用出一份Excel文檔,根據人員的職級不同,設置僅可只讀和編輯的許可權,同時根據為不同人制定不同規則,例如:張某每天十點編輯,王某每天十一點編輯的方式來解決衝突的問題。這種方式很聰明,從流程上解決了多副本的問題,但不能同時編輯的問題依然沒有被解決,如果一個部門的人足夠多,這樣分時的策略可能需要花一天時間才能完成一份Excel的編輯。

所以多人協作線上文檔的需求也變得越發變得強烈,因為在日常工作中,與團隊的其他人進行文檔協作是一種再常見不過的工作方式。由於工作分工、工作進展的不同,團隊內部的信息往往需要及時同步,然而伴隨著團隊經營規模的不斷擴大,線上協同、多人協作,以及軟體項目管理等問題將會接踵而至,成為制約企業高效發展的瓶頸。

而這些問題,通常表現為:

  1. 跨部門、地區溝通協作的不便
  2. 過度依賴文件、文件夾共用的形式,不能確保文檔的安全性
  3. 沒法紀錄和體現職工對文本文檔的意見和評價
  4. 文檔記錄發生變更時,無法及時通知到相關部門和員工
  5. 文檔無法線上協同編輯,缺失必要的流程管控
  6. 多人共同編輯一個文檔,無法留存修改記錄和歷史版本

 

針對上述問題,現在在市面上,已經有了很多這類多人協作的工具,例如:國外的Google Docs、Office365,及國內的騰訊文檔、石墨文檔、有道雲協作等。

因為這篇文章我們的目的是想向大家從企業IT管理者的角度出發深入研究協同辦公系統的形式、基礎和難點等實現原理,所以成品軟體我們在這不做過多贅述。那我們正式開始吧。

多人協作的形式:歷史與發展

多人協作的歷史十分悠久,起源於靜態的多人協作模式,即每個人先完成自己的工作,然後再進行彙總。

多人協作的初期:靜態協作

  • 遞增式協作
    • 郵件:你來我往
    • 論壇:跟帖回覆
  • 獨占式協作
    • 文檔傳遞
    • 微軟VSS
  • 合併式協作
    • SVN
    • Git
    • diff,patch,merge指令

 

常見的靜態多人協作方式

多人協作的發展期:從靜態到動態

  • 靜態協作的比喻
    • 拼接畫
    • 積木
  • 靜態協作的特點
    • 多版本
    • 塊操作
    • 有協作動作
  • 靜態協作的缺點
    • 版本碎片化
    • 缺乏時效性
    • 協作動作成本高

靜態多人協作的成本,會隨著加入人數和項目的複雜度呈幾何級數的增長。因此,對於企業來說,急需一種無協作動作、唯一版本、版本可控的無協作成本模式,即動態多人協作模式。

多人協作的蓬勃期:動態

  • 動態協作的比喻
    • 一起畫黑板
  • 動態協作的特點
    • 唯一版本
    • 原子操作
    • 無協作動作
  • 動態協作的優點
    • 版本可控
    • 實時
    • 無協作成本
  • 典型產品
    • Office Online
    • 石墨
    • OnlyOffice

多人協作的基礎:原理與架構

任何信息,無論其是什麼展現形式,如果要做到多人實時編輯與展現,只需要實現以下三步而已:

  1. 操作化
  2. 可傳輸
  3. 可還原

舉例說明多人協作的實現方式

操作化

操作化,指任何信息都可以轉換為一組操作的集合。很容易理解,但它仍有不少值得思考的點:

  • 分割與組合
    • 如何保證:信息的所有變化都可以分解為操作的集合?反之,操作如何覆蓋出信息的所有變化?
    • 分割的顆粒度如何決定?
      • 粗一點?
      • 細一點?
      • 如何兼顧解釋性與擴展性?
  • 絕對操作與相對操作
    • 絕對操作
      • 針孔印表機的完美世界
      • 印表機時代的編輯噩夢
    • 相對操作
      • 4K電視不是夢
      • 為什麼數字電視穩定性不如模擬電視
    • 絕對操作與相對操作比喻:時間與空間的互換

可傳輸

可傳輸,就是指操作有辦法通過網路傳輸給其他終端。實現動態多人協作,需要考慮以下幾點:

  • 傳輸內容
    • 原始文本
      • 清晰
      • 冗餘
    • 壓縮技術
      • 邏輯壓縮
      • 協議壓縮
      • 手動壓縮
  • 網路協議
    • Socket
      • TCP
      • UDP
    • HTTP
    • WebSocket
  • QoS(Quality of Service,服務質量)
    • 快速失敗

    • 自動回滾

    • 自動重連

    • 自動恢復

可還原

可還原,就是指接收到來自網路的操作消息後,可以在本地完全一致地再次執行該操作。可還原包括了:

  1. 絕對操作的還原
    • 控制體積
    • 合理的提示
  2. 相對操作的還原
    • 嚴格的順序性
    • 從源頭保障順序性
    • 順序性的補救
  3. 本地操作的還原
    • 過濾收到的操作集合
    • 從源頭細化操作顆粒
    • 本地保存本地執行
  4. 無入侵的還原
    • 定義入侵
    • 排除入侵
    • 千人千面

多人協作的難點:亂序與衝突

亂序

亂序的表現形式如下圖,小明在客戶端執行了一系列操作,傳遞到伺服器時發生亂序,導致小花看到了截然不同的信息:

 

 

 

為瞭解決亂序問題,可以嘗試以下方法:

1. 用性能換取順序正確——基於協議

 

 

 

2. 用性能換取順序正確——基於回執

 

 

 

兩種方法的優缺點
  1. 基於協議
  • 優點
    • 可靠,歷經考驗
    • 簡單,無需開發
  • 缺點
    • 資源開銷高
    • 必須整套使用
  • 優點
    • 自主可控,按需開發
    • 資源開銷可控
  • 缺點
    • 需要自己投入開發
    • 應用層邏輯控制使得網路複雜度向外蔓延
    • 複雜度帶來維護成本
  1. 基於回執

 

基於亂序處理方法的總結

網路不是絕對可靠的,為了實現相對可靠,需要付出一定的代價,企業需要考慮的是:如何衡量所付出的代價與產出成正比。

衝突

比亂序更高級的一種表現形式,存在多向、多維度等問題。

 

 

 

如何避免錯誤的蔓延?

原則:任何一次不一致,都會導致後續的操作基於錯誤的信息進行,從而不斷擴大錯誤,造成無法收拾的結果。因此,不一致是不能被容忍的。

解決辦法:

  1. 嚴格一致性:獨占
  2. 最終一致性:檢查與修複
  3. 非技術手段:設計與提示
嚴格的一致性

獨占就是同一時間同一範圍只能由一人操作。

  1. 範圍
    1. 整個表格,類似VSS
    2. 工作表
    3. 單元格範圍
  2. 排他性
    1. 獨占衝突時,必有一方被彈開
    2. 直到占有者解開,不然無法占用
    3. 占用前無法操作
    4. 原理和鎖基本一致
  3. 優點
    1. 可以確保嚴格一致性,不會產生多版本的錯誤累積
    2. 比起修複恢復這類彌補手段,一開始就不出錯的成本最低
    3. 邏輯清楚簡單,開發維護成本低
  4. 缺點
    1. 靜態協作的味道
    2. 獨占動作嚴重影響體驗
    3. 大幅降低協作效率
  5. 需對錶格實現的 功能
    1. 鎖定工作表
    2. 鎖定單元格
最終一致性

基於唯一正確順序,察覺客戶端的錯誤,撤銷錯誤操作後重新執行正確的操作。

  1. 唯一正確
    1. 伺服器到達順序
    2. 協作邊界分流
    3. P2P+選舉演算法
  2. 察覺錯誤
    1. 伺服器回執id
    2. 伺服器回執操作,MS
  3. 撤銷錯誤
    1. 撤銷到錯誤發生前的一步操作的結果
    2. 保存副本實現撤銷功能
    3. 利用操作版本快照
  4. 重新執行
    1. 操作隊列需保存
    2. 區分好無感知執行與顯式執行

 

針對多人協作難點的總結

如何實現Excel相關功能是需要開發人員需要花時間去研究的,另外為了滿足需求,適配多設備和平臺的相容性也非常重要。

另外,多人協作表格的本質還具有如下本質和特點:

  •  Server – Clients 中心系統,類似數值敏感的小型網游
  • 任何這類系統都是在體驗和正確性中尋求平衡
  • 表格的數值敏感性高於網游,數據操作和存儲的挑戰更大
  • 表格的計算複雜度更高,尤其涉及複雜公式嵌套與全量統計篩選
  • Web存在天花板,所以複雜的頁游並不多見,端游較多

 

最後,假如您想瞭解更多如何實現多人協作平臺相關的內容,歡迎參加2019年12月18日(周三) 14點由上海佳軟CTO帶來的一場線上直播:https://live.vhall.com/483759540,相信屆時我們都會受益良多的。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • nvm Node.js version manager ,推薦使用它來安裝 node.js 。 "Mac 版項目地址" "Windows 版項目地址" windows 版安裝 進入 "下載頁" 找到安裝包: 跟著引導安裝即可。 輸入 查看是否安裝成功,成功的話如下圖所示。如果提示找不到命令, "請看 ...
  • 為同一個元素綁定多個不同事件指向同一個事件處理函數 1. 用了switch(e.type){} 來修改 2. break <input type="button" value="小蘇" id="btn" /> <script src="common.js"></script> <script> // ...
  • div拖拽效果 JQuery ...
  • 如何渲染幾萬條數據並不卡住界面? 如何在不卡住頁面的情況下渲染數據,也就是說不能一次性將幾萬條 都渲染出來,而應該一次渲染部分 DOM,那麼就可以通過 requestAnimationFrame 來 每 16 ms 刷新一次。 <!DOCTYPE html> <html lang="en"> <he ...
  • 事件冒泡: 多個元素嵌套, 有層次關係 ,這些元素都註冊了相同的事件, 如果裡面的元素的事件觸發了, 外面的元素的該事件自動的觸發了 事件有三個階段: 1.事件捕獲階段 :從外向內 2.事件目標階段 :最開始選擇的那個 3.事件冒泡階段 : 從裡向外 為元素綁定事件 addEventListener ...
  • zoning 中華人民共和國行政區劃:省級、地級、縣級、鄉級和村級 GitHub: Gitee: Demo: 來源 國家統計局 統計用區劃和城鄉劃分代碼 統計數據截止2018 10 31 於 2019 01 31發佈 使用 打開頁面 打開瀏覽器控制台(推薦Chrome、Firefox,請不要用IE系 ...
  • 引言 在我們的前端日常工作中,無時無刻不在進行著變數的聲明和賦值,你是否也曾碰到過變數聲明報錯或變數被污染的問題,如果你跟筆者一樣碰到過,那麼我們應該暫時停下來好好思考問題發生的原因以及如何採取相應的補救措施。當然排查問題最好的方式就是深入其底層細節,瞭解在JavaScript中的記憶體分配方式。只有 ...
  • 一、背景 之前測試的項目前後端的"路由"(負責把前端發過來的請求轉發到相應的後端服務上)要用Nignx來取代原來的tomcat的http server功能,做這個替換的原因是Nignx輕量級,抗併發,處理靜態文件好。 Nignx常用做靜態內容服務和代理伺服器,直接外來請求轉發給後面的應用伺服器(to ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...