日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

這一次,徹底搞懵 CRDT

來源: 責(zé)編: 時間:2024-05-16 09:04:21 152觀看
導(dǎo)讀我是前端西瓜哥,今天我們來簡單入門一下 CRDT。CRDT 是什么?CRDT,全稱為 conflict-free replicated data type(無沖突復(fù)制數(shù)據(jù)類型),它是一種數(shù)據(jù)類型,或者說是方案,確保在網(wǎng)絡(luò)中的不同副本最后數(shù)據(jù)保持一致的,可以用協(xié)同編輯

ljE28資訊網(wǎng)——每日最新資訊28at.com

我是前端西瓜哥,今天我們來簡單入門一下 CRDT。ljE28資訊網(wǎng)——每日最新資訊28at.com

CRDT 是什么?

CRDT,全稱為 conflict-free replicated data type(無沖突復(fù)制數(shù)據(jù)類型),它是一種數(shù)據(jù)類型,或者說是方案,確保在網(wǎng)絡(luò)中的不同副本最后數(shù)據(jù)保持一致的,可以用協(xié)同編輯領(lǐng)域。ljE28資訊網(wǎng)——每日最新資訊28at.com

CRDT 在 2011 年在論文中被正式提出,雖相比 OT 算法(1989年)起步晚了很長的時間,但實現(xiàn)難度低很多,且出現(xiàn)了高性能的 CRDT 庫 Y.js,越來越多產(chǎn)品選擇使用 CRDT 來實現(xiàn)協(xié)同編輯功能。ljE28資訊網(wǎng)——每日最新資訊28at.com

CRDT 有以下特性:ljE28資訊網(wǎng)——每日最新資訊28at.com

每個客戶端可獨(dú)自操作副本,即支持并發(fā),不需要和其他副本協(xié)同溝通。ljE28資訊網(wǎng)——每日最新資訊28at.com

這是一種樂觀復(fù)制(Optimistic replication)的策略。ljE28資訊網(wǎng)——每日最新資訊28at.com

各個副本可以獨(dú)立地在本地編輯,不用把更新提交到服務(wù)器,等待服務(wù)端返回最新的狀態(tài),用這個新狀態(tài)覆蓋掉舊狀態(tài)。即可做到離線編輯,本地更新了狀態(tài)后再同步到服務(wù)端。ljE28資訊網(wǎng)——每日最新資訊28at.com

算法能夠自動地處理不一致的問題。ljE28資訊網(wǎng)——每日最新資訊28at.com

一個副本和另一個副本通常是不同的,當(dāng)其他副本同步過來時,有可能會出現(xiàn)沖突(不一致)的地方,比如兩個副本同時刪除和新增一個元素。ljE28資訊網(wǎng)——每日最新資訊28at.com

這個需要 CRDT 算法使用特定的策略去自動處理,而不是像 git merge 那樣去手動處理沖突。ljE28資訊網(wǎng)——每日最新資訊28at.com

同一時刻不同副本的狀態(tài)可能不同,但同步后它們能最終收斂(converge),達(dá)到相同的狀態(tài)(最終一致性)。ljE28資訊網(wǎng)——每日最新資訊28at.com

CRDT 的類型

CRDT 主要分為兩大類型:Operation-based 和 State-based。ljE28資訊網(wǎng)——每日最新資訊28at.com

Operation-based

Operation-based CRDTs,基于操作的 CRDT。ljE28資訊網(wǎng)——每日最新資訊28at.com

副本進(jìn)行同步時,只會把 新增的本地操作(operation) 發(fā)送出去。ljE28資訊網(wǎng)——每日最新資訊28at.com

另一個副本拿到這個 operation 會將其應(yīng)用到自己的狀態(tài)上,operataion 需要滿足交換律(commutative)。ljE28資訊網(wǎng)——每日最新資訊28at.com

交換律,指的是交換運(yùn)算順序,最后的結(jié)果不變。比如加法就滿足交換律,a+b 和 b+a 的結(jié)果是相等的。ljE28資訊網(wǎng)——每日最新資訊28at.com

operataion 之所以要滿足交換律,是因為網(wǎng)絡(luò)并不可知。ljE28資訊網(wǎng)——每日最新資訊28at.com

假設(shè)有兩個副本 a 和 b 要同步過來給其他副本,你不知道到底誰先到達(dá)。對于一些副本可能是先 a 后 b,另一些可能是先 b 后 a,我們需保證在不同順序下,結(jié)果是一致的。ljE28資訊網(wǎng)——每日最新資訊28at.com

通常我們是通過 Generator 函數(shù)生成新的 opreation,發(fā)送給其他副本,然后這些副本通過  Effector 函數(shù)應(yīng)用這些副本。ljE28資訊網(wǎng)——每日最新資訊28at.com

因為交換律這個特性,Operation-based CRDTs 還有另一個名字 commutative replicated data types(CmRDTs)。ljE28資訊網(wǎng)——每日最新資訊28at.com

基于操作的 CRDT 的優(yōu)點是, 傳輸?shù)臄?shù)據(jù)量較少。ljE28資訊網(wǎng)——每日最新資訊28at.com

State-based

State-based CRDTs,基于狀態(tài)的 CRDT。ljE28資訊網(wǎng)——每日最新資訊28at.com

一個副本進(jìn)行同步時,會將 整個完整的本地狀態(tài)(state) 發(fā)送出去。另一個副本需要支持將其他副本進(jìn)行合并(merge)的操作,這個 merge 方法需要滿足交換律、分配律,以及冪等性。ljE28資訊網(wǎng)——每日最新資訊28at.com

基于狀態(tài)的 CRDT 的問題是,在文檔很大時,需要傳輸大量的數(shù)據(jù),會耗費(fèi)大量的帶寬,且花費(fèi)時間長。所有實際生產(chǎn)很少會使用它。ljE28資訊網(wǎng)——每日最新資訊28at.com

優(yōu)點是實現(xiàn)更簡單,如果數(shù)據(jù)量不大,是可以考慮使用的。ljE28資訊網(wǎng)——每日最新資訊28at.com

State-based CRDTs 同樣也有另一個名字:Convergent Replicated Data Types(CvRDTs)。Convergent 是收斂的意思。ljE28資訊網(wǎng)——每日最新資訊28at.com

一些 CRDT

CRDT 做到數(shù)據(jù)最終一致性,是基于數(shù)學(xué)上的特性來保證的。ljE28資訊網(wǎng)——每日最新資訊28at.com

我們來看幾個簡單的 CRDT 模型。ljE28資訊網(wǎng)——每日最新資訊28at.com

AWSet

AWSet(Add-wins set),一種新增優(yōu)先于刪除的集合數(shù)據(jù)結(jié)構(gòu)。ljE28資訊網(wǎng)——每日最新資訊28at.com

假如剛開始的時候,副本 A 和 副本 B 的狀態(tài)是一致的,有一個 a 在集合中。ljE28資訊網(wǎng)——每日最新資訊28at.com

副本 A 刪除了 a,然后再新增 a。ljE28資訊網(wǎng)——每日最新資訊28at.com

副本 B 刪除了 a。ljE28資訊網(wǎng)——每日最新資訊28at.com

副本 A 的新增 a 和 副本 B 的刪除 a 同時發(fā)生。ljE28資訊網(wǎng)——每日最新資訊28at.com

此時我們會選擇新增,忽略刪除,最后兩個副本的狀態(tài)還是 a 在集合中。ljE28資訊網(wǎng)——每日最新資訊28at.com

ljE28資訊網(wǎng)——每日最新資訊28at.com

為判斷兩個操作是否是 “同時” 的,我們會附加一個和時序相關(guān)的元數(shù)據(jù),比如時間戳、版本向量。ljE28資訊網(wǎng)——每日最新資訊28at.com

RWSet

RWSet(Remove-win set),一種刪除優(yōu)先新增的集合數(shù)據(jù)結(jié)構(gòu)。ljE28資訊網(wǎng)——每日最新資訊28at.com

AWSet 類似,但對于并發(fā)的操作,會保留刪除,丟棄新增。ljE28資訊網(wǎng)——每日最新資訊28at.com

LWW

LWW(Last-writer-wins),最后寫入者優(yōu)先。ljE28資訊網(wǎng)——每日最新資訊28at.com

所有的操作會有一個時間戳元數(shù)據(jù),副本會對比同步操作的時間戳。ljE28資訊網(wǎng)——每日最新資訊28at.com

如果大于當(dāng)前狀態(tài)時間戳,覆蓋掉原來的狀態(tài);如果小于當(dāng)前狀態(tài)時間戳,則忽略。ljE28資訊網(wǎng)——每日最新資訊28at.com

2P-Set

Two-Phase Set。ljE28資訊網(wǎng)——每日最新資訊28at.com

此模型會維護(hù)兩個集合,一個是新增集合,保存新增的元素,另一個是刪除集合,保存被刪除的元素。ljE28資訊網(wǎng)——每日最新資訊28at.com

模型的最終狀態(tài)為新增集合和刪除集合的差集。ljE28資訊網(wǎng)——每日最新資訊28at.com

另外,集合比較特殊,它是只增集合(grow-only set),只能往集合里加元素,不能從集合里移除元素。ljE28資訊網(wǎng)——每日最新資訊28at.com

這意味著一個元素如果被刪除了,就再也不能添加回來。所以刪除集合也被叫做 tombstone set(墓碑集合),人噶不能復(fù)生。ljE28資訊網(wǎng)——每日最新資訊28at.com

2P-Set 也算是一種 RW-Set(刪除優(yōu)先),特別的點在于元素被刪除后不能新增回來。ljE28資訊網(wǎng)——每日最新資訊28at.com

G-Counter

G-Counter,Grow-only Counter,只增計數(shù)器,一個只能增加計數(shù)的計數(shù)器。ljE28資訊網(wǎng)——每日最新資訊28at.com

此模型使用 n 個節(jié)點的容器(一個整數(shù)數(shù)組),每個副本會分配一個 id,某個副本給計數(shù)器 +1,其實就會給對應(yīng)的數(shù)組元素 +1。ljE28資訊網(wǎng)——每日最新資訊28at.com

計數(shù)器的值為數(shù)組的求和。ljE28資訊網(wǎng)——每日最新資訊28at.com

PN-Counter

PN-Counter,Positive-Negative Counter,一個支持增減的計數(shù)器。ljE28資訊網(wǎng)——每日最新資訊28at.com

多個 CRDT 可以組合成一個更復(fù)雜的 CRDT。ljE28資訊網(wǎng)——每日最新資訊28at.com

類似 G-Counter,但 PN-Counter 使用兩個 G-Counter,一個保存新增數(shù)(新增操作),另一個保存減少數(shù)(減少操作)。ljE28資訊網(wǎng)——每日最新資訊28at.com

計數(shù)器的值為新增數(shù)組求和減去減少數(shù)組的和。ljE28資訊網(wǎng)——每日最新資訊28at.com

YATA

最后我們看看復(fù)雜點的,簡單介紹一下 Y.js 的 YATA(Yet Another Transformation Approach)模型。ljE28資訊網(wǎng)——每日最新資訊28at.com

假設(shè)我們有值為 "ABCD" 的字符串。ljE28資訊網(wǎng)——每日最新資訊28at.com

YATA 模型會將其拆分成一個個字符,加上元數(shù)據(jù),然后按順序首尾相連組成一個雙鏈表。ljE28資訊網(wǎng)——每日最新資訊28at.com

// 大概這樣子{  id: '2:0', // 客戶端 ID + clock ID  val: 'B',  left: a, // 當(dāng)前節(jié)點的左節(jié)點  right: c, // 右節(jié)點  origin: a, // 節(jié)點創(chuàng)建時的左節(jié)點  rightOrigin: c // 節(jié)點創(chuàng)建時的右節(jié)點}

操作有 “插入” 和 “刪除”。ljE28資訊網(wǎng)——每日最新資訊28at.com

假設(shè)本地在 AB 之間插入 E,此時沒有發(fā)送同步,然后收到其他副本傳過來的 F,也是要插入到 AB 之間。ljE28資訊網(wǎng)——每日最新資訊28at.com

此時 E 和 F 是沖突的,我們會對唯一的 id(某種意義上的時間戳)使用特定的規(guī)則來決定先后順序。ljE28資訊網(wǎng)——每日最新資訊28at.com

至于刪除操作,因為插入操作需要找到在左右節(jié)點的位置,所以節(jié)點即使被刪除了也是不能從雙鏈表中移出的。ljE28資訊網(wǎng)——每日最新資訊28at.com

對此,YATA 選擇使用墓碑機(jī)制。YATA 將對應(yīng)節(jié)點標(biāo)記為刪除(item.deleted 設(shè)置為 true),并將節(jié)點記錄到刪除集合 DeleteSet 里。ljE28資訊網(wǎng)——每日最新資訊28at.com

這里其實可以看到,CRDT 通常是需要加很多元數(shù)據(jù)的,尤其是復(fù)雜數(shù)據(jù)結(jié)構(gòu)且數(shù)據(jù)量較大的場景,所以這也是 CRDT 起初被詬病占用內(nèi)存高的原因。ljE28資訊網(wǎng)——每日最新資訊28at.com

但 Y.js 通過一系列手段(比如將多個節(jié)點合并為一個大節(jié)點),將性能優(yōu)化到足夠面對大多數(shù)場景,證明了用 CRDT 是做協(xié)同編輯的是不用擔(dān)心性能問題的,如果有,一定是你沒優(yōu)化好。ljE28資訊網(wǎng)——每日最新資訊28at.com

結(jié)尾

本文只是簡單介紹一些 CRDT 是什么,并感受了一些簡單的 CRDT 模型,希望對你有所幫助。ljE28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-88328-0.html這一次,徹底搞懵 CRDT

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: PlantUML畫時序圖,真香!

下一篇: 什么鎖比讀寫鎖性能更高?

標(biāo)簽:
  • 熱門焦點
  • Find N3入網(wǎng):最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經(jīng)正式入網(wǎng),型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 一文看懂為蘋果Vision Pro開發(fā)應(yīng)用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現(xiàn)實(MR)頭戴設(shè)備。Vision Pro結(jié)合了虛擬現(xiàn)實(VR)和增強(qiáng)現(xiàn)實(AR)的沉浸感。其高分辨率顯示屏、先進(jìn)的傳感器和強(qiáng)大的處理能力
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對Reader和Writer接口的組合,
  • K8S | Service服務(wù)發(fā)現(xiàn)

    一、背景在微服務(wù)架構(gòu)中,這里以開發(fā)環(huán)境「Dev」為基礎(chǔ)來描述,在K8S集群中通常會開放:路由網(wǎng)關(guān)、注冊中心、配置中心等相關(guān)服務(wù),可以被集群外部訪問;圖片對于測試「Tes」環(huán)境或者
  • Java NIO內(nèi)存映射文件:提高文件讀寫效率的優(yōu)秀實踐!

    Java的NIO庫提供了內(nèi)存映射文件的支持,它可以將文件映射到內(nèi)存中,從而可以更快地讀取和寫入文件數(shù)據(jù)。本文將對Java內(nèi)存映射文件進(jìn)行詳細(xì)的介紹和演示。內(nèi)存映射文件概述內(nèi)存
  • 企業(yè)采用CRM系統(tǒng)的11個好處

    客戶關(guān)系管理(CRM)軟件可以為企業(yè)提供很多的好處,從客戶保留到提高生產(chǎn)力。  CRM軟件用于企業(yè)收集客戶互動,以改善客戶體驗和滿意度。  CRM軟件市場規(guī)模如今超過580
  • 小紅書1周漲粉49W+,我總結(jié)了小白可以用的N條漲粉筆記

    作者:黃河懂運(yùn)營一條性教育視頻,被54萬人“珍藏”是什么體驗?最近,情感博主@公主是用鮮花做的,火了!僅僅憑借一條視頻,光小紅書就有超過128萬人,為她瘋狂點贊!更瘋狂的是,這
  • 消息稱小米汽車開始篩選交付中心:需至少120個車位

    IT之家 7 月 7 日消息,日前,有微博簡介為“汽車行業(yè)從業(yè)者、長三角一體化擁護(hù)者”的微博用戶 @長三角行健者 發(fā)文表示,據(jù)經(jīng)銷商集團(tuán)反饋,小米汽車目前
  • 華為HarmonyOS 4升級計劃公布:首批34款機(jī)型今日開啟公測

    8月4日消息,今天下午華為正式發(fā)布了HarmonyOS 4系統(tǒng),在更流暢的前提下,還帶來了不少新功能,UI設(shè)計也有變化,會讓手機(jī)煥然一新。華為宣布,首批機(jī)型將會在
Top 主站蜘蛛池模板: 加查县| 济源市| 什邡市| 都昌县| 平原县| 康保县| 体育| 乡城县| 新密市| 大洼县| 邮箱| 桐柏县| 安康市| 互助| 财经| 寿光市| 博爱县| 江孜县| 青龙| 荃湾区| 运城市| 寿光市| 松江区| 长治县| 房产| 仲巴县| 麻栗坡县| 陇南市| 麻江县| 当雄县| 海阳市| 卢龙县| 乐山市| 五河县| 临泽县| 永修县| 会同县| 长岭县| 遂平县| 信阳市| 台东市|