像多人實時編輯文檔一樣編輯圖片,釘釘新功能背後的技術解讀

{"type":"doc","content":[{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1 月 14 日,釘釘正式發佈 6.0 版本,其中推出的“一起標註”功能可以實現像編輯文檔一樣多人實時編輯一張圖片,引起了不少開發者的注意。其背後正是釘釘自研的協同框架技術,可以讓多人實時協同類應用的開發變得像開發單人本地應用一樣簡單,協同框架也將向釘釘開發者開放。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在企業辦公場景中,“打工人”們的工作協作基本離不開 IM 軟件,而大家卻也常常被圖片消息確認難這樣一種困境所困擾,比如:當羣組裏有一個人發了一張技術架構圖請其他幾位同事做確認時,接收信息的每一個人可能都需要在圖片上進行標註,用畫筆圈出需要修改的地方,然後保存到手機再發送到羣裏,還可能要反覆修改,整個過程十分不順暢。在這種需要多人協作的場景中,工作效率就大大降低了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"但現在,情況開始有了轉變。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1 月 14 日,釘釘正式發佈 6.0 版本,其戰略定位也從過去基於 IM 的協同辦公平臺,升級爲企業級協同辦公平臺和企業級應用開發平臺,這是繼“雲釘一體”戰略後,釘釘最重要的版本升級。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"而此次釘釘衆多上新的能力中,包含了一個叫做“一起標註”的功能,它可以實現像編輯文檔一樣多人、實時編輯一張圖片。只要點擊圖片進行標註,所有接收到圖片信息的協作者就可以看到編輯過程及編輯者的名字標籤,很好地解決了我們開篇提到的如何在圖片消息的討論上實現更高效的問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可以再設想這樣一個場景:團隊歡迎新同學加入一起聚餐,合照發到羣組中,大家可以一起在照片上塗鴉圈人,新同學將自己圈出來,照片上會自動顯示名字標籤。“大家看看新來的 UED 同學在哪裏?”,通過這種多人實時互動,給工作帶來更多的趣味與溫度。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/e3\/fe\/e33a307f8a7144513831276716b847fe.gif","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"“一起標註”功能展示"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在“一起標註”功能的背後,釘釘的自研技術:協同框架技術也浮出水面,其目標是希望能夠降低多人實時協作應用開發的門檻,通過協同組件、協同數據結構等服務讓開發者更專注於其自身業務。“一起標註”只是基於協同框架的其中一個 Showcase,在這套協同框架下,還有更多的協同應用等待大家去開發。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"爲什麼要做這樣一套協同框架?多人協同應用開發難在哪?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如 Google Docs、Trello、石墨文檔、騰訊文檔……各種各樣的協同辦公工具爲什麼會受到企業的歡迎?就是因爲它們在一定場景中能夠解決團隊協作的需求,“多人”、“實時”、“協同”是團隊協作的關鍵點。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於普通開發者來說,開發一個本地的單機版應用很容易,但要從 0 到 1 開發一套支持多人實時協作的應用則要面臨底層工程架構、算法相關的複雜問題,技術門檻較高。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在底層工程架構方面,需要關心平臺適配、網絡、存儲等問題,開發者可能需要做 Android、iOS、Windows、Mac、Web 版本、小程序端等多平臺的適配;而且還需要關注網絡問題的處理,如丟包、無網 \/ 弱網問題、離線狀態恢復問題、網絡容災等等,最終保證信息的實時推送;另外,在數據存儲上也需要考慮保證在無網 \/ 弱網環境下應用的連續性。而在算法方面,如何解衝突?即不同的操作之間的合併、衝突解決等等也是開發者將要面臨的問題,因此要設計出滿足多人協同的數據結構需要龐大的技術投入。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"釘釘面向 To B 的企業級市場,離不開創新產品與技術。因此,釘釘的工程師們開始思考一種方式,如何能夠用一套框架解決這個大難題,讓開發變得更容易。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"釘釘依據技術積累攻克難關"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"協同框架技術服務架構"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在摸索創新的過程中,釘釘工程師們想到:無論多人遊戲、多人在線文檔編輯還是 IM 聊天等產品,其實都是協同應用,那麼是不是有一套通用的協同框架可以被抽象出來?而且能夠讓上層業務開發者基於這套框架,快速地開發出他自己的協議應用。這是很關鍵的思考,在這種想法的指引下,最後把協同框架分成三層:協同組件層、協同小程序與數據結構層、協同引擎層。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/9e\/4e\/9eab6b65254fe75894189e02ebf0424e.jpg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"最上面一層是組件層,叫協同卡片,"},{"type":"text","text":"是可視化的,開發者可以直接拿來用,比如像“一起標註”的畫布功能就是一個協同畫布組件,本身就具備多端、多人實時協同能力,也已經帶有前端的渲染工作。開發者可以用協同組件搭積木式地組裝出自己的協同應用。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"中間一層是協同小程序與協同數據結構,"},{"type":"text","text":"這是不包含 UI 的數據框架層。提供的小程序 SDK 包含了一系列基礎數據結構,類似於 C++ 的 STL、JAVA 的 JDK,SDK 也提供了例如 CoString、CoBoolean、CoMap、CoList 與 CoPixel 這樣的基礎類型,開發者通過這些數據結構達到多人協同和多端協同的目標。比如開發者想做一個多人協作的 “To Do List”的功能,那麼通過使用協同框架,進行簡單編程操作即可,並不用關心網絡通訊以及複雜的操作合併衝突解決的問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"最底層是引擎層,"},{"type":"text","text":"如果以上沒有開發者想要的能力,也可以根據協同框架開發一個新的數據結構,那麼在這層則需要進行很多接口的實現,包括初始化、快照、衝突解決等。相當於依據協同框架開發一個第二層的數據結構,再進行使用。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"中間層的小程序框架與數據結構的抽象工作,解決了開發易用性的問題,頂層甚至不用編程直接用組件就可以搭建。協同框架通過上兩層的技術服務就可以實現大部分的數字化應用創建,而最底層可能交給高級工程師們去實現。協同框架面向不同的開發者,才能讓生態良性發展。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"協同框架開放背後,有哪些亮點技術支撐?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"攻克這一套協同框架,釘釘採用了很多業界內突破性技術。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"數據通道上,協同框架底層的推送通道使用了釘釘的數據同步平臺。數據同步平臺作爲釘釘的基礎設施,爲釘釘數百個業務提供可靠的服務端到客戶端的數據下發通道,提供了統一的海量、可靠、實時、全端覆蓋的數據同步服務。數據同步平臺同時支持推送實時信令、即時消息、可延時數據等不同時效等級,通過通道隔離、下行數據優先級智能調度、弱網感知優化等多種手段,保障了各個接入業務都能使用到高性能、高可用的數據同步服務。在 2020 年疫情期間,數據同步平臺很好地支撐了釘釘的視頻會議、IM、DING 等多個重量級產品,每日同步數據數千億,系統流量高峯時刻 TPS 超過千萬。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"底層設計上,引擎將協同過程抽象爲有限狀態機模型,它包括離線工作和跨多設備多用戶協同的能力,同時能提高數據的安全性、隱私性、長期保存性和用戶控制權,保證在網絡狀況不佳的環境下,也能夠實現無差別協作的工作。比如在弱網、離線情況下,也能保證能夠繼續進行圖片標註,在網絡恢復後操作同步。協同框架提供了多平臺的 SDK,包括主流移動端、桌面端、Web 端,也包括服務端 SDK。架構設計上基於對等原則,所有接入 SDK 的協同端,不管是客戶端、Web 端還是服務端,都是對等 Agent。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"同時,多人實時協同問題的本質某種程度上是一個分佈式領域的問題,釘釘協同框架結合了操作變換 OT(Operational Transformation)與無衝突複製數據類型 CRDT (Conflict-free Replicated Data Types) 技術,用於實現協同操作合併與衝突解決,並讓各個協同端狀態達到最終一致。對於不同的協同場景,可以選擇其合適的協同算法與協作策略,但這些底層複雜的技術細節,對於使用協同框架的上層業務都是透明的,開發者只需要操作協同數據結構與協同組件即可。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以本次釘釘 6.0 發佈的“一起標註”功能爲例,這個產品功能的實現是基於名爲 CoPixel 的數據結構。CoPixel 本身作爲數據層,與 UI 無關,用於承載筆畫圖形的數據,而 UI 層則通過將 CoPixel 封裝爲一個協同畫布組件。用戶在協同畫布上每畫一筆,都會對 CoPixel 產生對應修改,進而自動協同到所有參與協作的用戶端,其他用戶端的 CoPixel 會回調 UI 層的畫布組件,從而新筆畫得到展現。當多名用戶同時操作,這些動作會合並並自動解決其中可能產生的衝突。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"未來,拓寬邊界與開源"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"協同框架是支持多人、多端、多場景、多應用的,在未來的發展規劃中,會不斷拓寬邊界,發揮協同的最大價值。可以進行跨應用協同工作的打通,實現跨應用、跨設備、跨網絡線,實現不同應用的數據共享,比如也許在 CRM 裏做某些操作時,ERP 系統也能進行協同,讓數據同步。在未來移動開發市場上,也期待協同框架帶來的新變革。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"協同框架藉助了釘釘 IM、文檔、小程序、終端研發等團隊在以上方面的大量關鍵技術積累,但也還有很多功能上的問題需要釘釘工程師們持續打磨,對於內部團隊來說,還需要修煉內功。未來,協同框架必定會走上開源之路,這也是釘釘在計劃內的事情,通過開源,讓更多優秀的開發者加入釘釘的生態中來。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"寫在最後"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1 月 14 日的釘釘 6.0 發佈會上,宣佈了此次戰略升級帶來的 3 個重要變化:1、推出釘釘宜搭等低代碼開發工具,讓不懂代碼的用戶,也能快速開發新應用;2、推出角色工作臺,讓 CEO、HR、財務、老師等不同角色擁有自己的專屬工作臺;3、推出全新協同辦公套件,讓用戶可以打破組織邊界,進行“以事爲中心”的協同。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"阿里雲智能總裁張建鋒也曬出了釘釘的衆多成績單:截止 2020 年 9 月 30 日,有超過 1700 萬企業組織、4 億用戶選擇用釘釘開啓數字化;釘釘開放平臺入駐的開發者已超過 27 萬,開發應用數 70 萬個以上,開發者服務的企業組織數超過 640 萬家……"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"此外,釘釘也將羣聊、智能人事、客戶管理等核心產品技術深度開放,並總計開放超過 1300 個 API,供開發者、合作伙伴及用戶使用。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文針對釘釘的協同框架技術做了部分解讀,管中窺豹,可見此次釘釘戰略升級背後的技術也正在向業界深度開放,期待後續協同框架的迭代與完善,我們也將繼續關注釘釘技術能力。"}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章