多人協(xié)同編輯算法 —— CRDT 算法
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
什么是 CRDT無(wú)沖突復(fù)制數(shù)據(jù)類型(CRDT,Conflict-free Replicated Data Types)是一類在分布式系統(tǒng)中用于數(shù)據(jù)復(fù)制的數(shù)據(jù)結(jié)構(gòu),旨在解決多副本并發(fā)更新時(shí)的數(shù)據(jù)一致性問(wèn)題。CRDT 允許各個(gè)副本獨(dú)立且并發(fā)地進(jìn)行更新,而無(wú)需協(xié)調(diào),且能夠在最終自動(dòng)解決可能出現(xiàn)的不一致性。 CRDT 的關(guān)鍵特性主要有以下三個(gè)方面:
CRDT 的種類CRDT 有兩種方法,都可以提供強(qiáng)最終一致性:基于操作的 CRDT 和基于狀態(tài)的 CRDT。 基于操作的 CRDT(CmRDT)基于操作的 CRDT(也稱為交換性復(fù)制數(shù)據(jù)類型,CmRDT)是一類通過(guò)傳輸更新操作來(lái)同步副本的 CRDT。在 CmRDT 中,每個(gè)副本只發(fā)送更新操作,而不是完整的狀態(tài)。例如,操作可以是"+10"或"-20",它們表示對(duì)某個(gè)值的增減。副本接收到這些操作后,會(huì)在本地應(yīng)用這些更新。 操作是可交換的,這意味著操作的順序不影響最終結(jié)果。也就是說(shuō),即使操作以不同的順序應(yīng)用,最終的結(jié)果也會(huì)是一樣的。然而,這些操作不一定是冪等的,即重復(fù)應(yīng)用相同操作可能會(huì)產(chǎn)生不同的結(jié)果。 由于操作是以獨(dú)立的方式廣播的,通信基礎(chǔ)設(shè)施必須保證所有操作都被傳輸?shù)剿懈北?,而且操作不?huì)丟失或重復(fù)。在此過(guò)程中,操作的順序是靈活的,可以按照任何順序傳輸。 純基于操作的 CRDT(Pure CmRDT) 是基于操作的 CRDT 的一個(gè)變種,它通過(guò)減少所需的元數(shù)據(jù)大小來(lái)優(yōu)化性能。 G-CounterG-Counter 用于實(shí)現(xiàn)分布式環(huán)境中的計(jì)數(shù)器功能,由多個(gè)計(jì)數(shù)器組成的數(shù)據(jù)結(jié)構(gòu),每個(gè)副本都維護(hù)自己的計(jì)數(shù)器。每當(dāng)副本需要增加計(jì)數(shù)時(shí),它只會(huì)在自己的計(jì)數(shù)器上增加,而不會(huì)減少或修改其他副本的計(jì)數(shù)器。當(dāng)需要獲取計(jì)數(shù)時(shí),副本會(huì)將所有計(jì)數(shù)器的值累加起來(lái),以獲得全局的計(jì)數(shù)結(jié)果。G-Counter 是一個(gè)只增長(zhǎng)的計(jì)數(shù)器,它滿足如下的性質(zhì):
PN-CounterPN-Counter 是一種基于 CRDT 的數(shù)據(jù)類型,用于實(shí)現(xiàn)分布式環(huán)境中的計(jì)數(shù)器功能。由兩個(gè) G-Counter 組成的數(shù)據(jù)結(jié)構(gòu),分別用于記錄正數(shù)和負(fù)數(shù)的計(jì)數(shù)。每個(gè)副本都維護(hù)自己的兩個(gè)計(jì)數(shù)器,分別用于增加正數(shù)計(jì)數(shù)和增加負(fù)數(shù)計(jì)數(shù)。當(dāng)需要獲取計(jì)數(shù)時(shí),副本會(huì)將正數(shù)計(jì)數(shù)器的值減去負(fù)數(shù)計(jì)數(shù)器的值,以獲得全局的計(jì)數(shù)結(jié)果。PN-Counter 具有以下性質(zhì):
Sequence CRDTSequence CRDT 用于實(shí)現(xiàn)分布式環(huán)境中的有序序列功能,旨在解決在并發(fā)環(huán)境中對(duì)有序序列進(jìn)行并發(fā)操作時(shí)可能出現(xiàn)的沖突問(wèn)題。它允許并發(fā)操作在不同副本之間交換和合并,以達(dá)到最終一致性的狀態(tài)。Sequence CRDT 的實(shí)現(xiàn)方式有多種,其中一種常見(jiàn)的實(shí)現(xiàn)是基于標(biāo)識(shí)符(Identifier)的方式。每個(gè)操作都被賦予唯一的標(biāo)識(shí)符,用于標(biāo)識(shí)操作的順序。常見(jiàn)的操作包括插入元素、刪除元素和移動(dòng)元素。通過(guò)使用標(biāo)識(shí)符和一致的合并策略,Sequence CRDT 可以實(shí)現(xiàn)在分布式環(huán)境中對(duì)有序序列進(jìn)行并發(fā)操作的正確合并。具體的合并策略可以根據(jù)應(yīng)用需求和具體實(shí)現(xiàn)進(jìn)行定制。Sequence CRDT 具有以下特性:
Sequence CRDT 可以應(yīng)用于許多場(chǎng)景,如協(xié)同編輯、版本控制系統(tǒng)、聊天應(yīng)用等,其中有序的操作是必要的。它提供了在分布式環(huán)境中實(shí)現(xiàn)有序序列的能力,并保持最終一致性。 基于狀態(tài)的 CRDT(CvRDT)與基于操作的 CRDT(CmRDT)不同,基于狀態(tài)的 CRDT(也稱為收斂復(fù)制數(shù)據(jù)類型,CvRDT)通過(guò)將完整的本地狀態(tài)發(fā)送到其他副本來(lái)進(jìn)行狀態(tài)傳播。在 CvRDT 中,副本接收到完整的狀態(tài)并將其與自身的狀態(tài)合并。合并函數(shù)必須滿足可交換性、結(jié)合性和冪等性,確保副本之間的合并結(jié)果是相同的。 這意味著合并操作的順序不影響最終結(jié)果,并且即使多次合并相同的狀態(tài),結(jié)果也不會(huì)發(fā)生變化。所有副本的狀態(tài)都可以通過(guò)合并來(lái)收斂到同一個(gè)最終狀態(tài)。為了確保一致性,更新函數(shù)必須遵循一個(gè)偏序規(guī)則,使得每次合并都能夠單調(diào)地增加內(nèi)部狀態(tài)。 Delta 狀態(tài) CRDT 是基于狀態(tài)的 CRDT 的一種優(yōu)化版本。在 Delta CRDT 中,僅傳播最近對(duì)狀態(tài)進(jìn)行的更改(即"delta"),而不是將整個(gè)狀態(tài)傳輸?shù)狡渌北尽_@減少了每次更新的網(wǎng)絡(luò)開(kāi)銷,并提高了效率。只有當(dāng)某個(gè)副本的狀態(tài)發(fā)生變化時(shí),才會(huì)將該變化廣播給其他副本,從而避免了大量不必要的數(shù)據(jù)傳輸。 G-SetG-Set 是一種基于 CRDT 的數(shù)據(jù)類型,用于實(shí)現(xiàn)分布式環(huán)境中的集合功能,G-Set 是一個(gè)只增長(zhǎng)的集合,每個(gè)副本都維護(hù)自己的本地集合。當(dāng)需要添加元素時(shí),副本只會(huì)在自己的集合中添加元素,而不會(huì)刪除或修改其他副本的集合。G-Set 的特性包括:
由于 G-Set 是只增長(zhǎng)的集合,它滿足最終一致性和合并性質(zhì)。每個(gè)副本的本地集合可以獨(dú)立地增長(zhǎng),不會(huì)發(fā)生沖突或合并操作。當(dāng)需要獲取全局集合時(shí),可以簡(jiǎn)單地將所有副本的集合合并。G-Set 適用于需要在分布式環(huán)境中維護(hù)集合,并且可以實(shí)現(xiàn)高可用性和最終一致性的場(chǎng)景。它常用于記錄一組唯一的元素,而不需要?jiǎng)h除或修改元素 2P-Set2P-Set 用于實(shí)現(xiàn)分布式環(huán)境中的集合功能,維護(hù)兩個(gè)集合:一個(gè)"添加集合"和一個(gè)"移除集合"。每個(gè)元素在添加集合中只能添加一次,在移除集合中只能移除一次。這樣,2P-Set 可以實(shí)現(xiàn)添加和移除元素的操作,并且確保元素不會(huì)重復(fù)添加或移除。2P-Set 的操作包括:
2P-Set 的特性包括:
當(dāng)需要獲取全局集合時(shí),副本將所有副本的添加集合和移除集合合并,并計(jì)算添加集合減去移除集合的結(jié)果,得到最終的全局集合。2P-Set 可以實(shí)現(xiàn)在分布式環(huán)境中維護(hù)集合,并且具有最終一致性。它適用于需要記錄添加和移除操作,并且不希望元素重復(fù)添加或移除的場(chǎng)景。 LWW-Element-SetLWW-Element-Set 用于實(shí)現(xiàn)分布式環(huán)境中的集合功能,維護(hù)一個(gè)集合,其中每個(gè)元素都與一個(gè)時(shí)間戳相關(guān)聯(lián)。時(shí)間戳可以是遞增的整數(shù),邏輯時(shí)鐘,或其他可比較的時(shí)間表示。每當(dāng)需要添加或移除元素時(shí),副本會(huì)將元素與當(dāng)前時(shí)間戳關(guān)聯(lián),并將操作應(yīng)用到本地集合。LWW-Element-Set 的特性包括:
當(dāng)需要獲取全局集合時(shí),副本將所有副本的集合合并,并根據(jù)時(shí)間戳選擇最新的操作。如果存在多個(gè)副本對(duì)同一個(gè)元素進(jìn)行了不同的操作,那么具有較新時(shí)間戳的操作將覆蓋較舊時(shí)間戳的操作。LWW-Element-Set 可以實(shí)現(xiàn)在分布式環(huán)境中維護(hù)集合,并且具有最終一致性。它適用于需要記錄元素的添加和移除,并以最后寫(xiě)操作為準(zhǔn)的場(chǎng)景。然而,由于最后寫(xiě)操作勝出的特性,可能會(huì)導(dǎo)致某些操作的沖突或覆蓋 OR-SetOR-Set 用于實(shí)現(xiàn)分布式環(huán)境中的集合功能,維護(hù)一個(gè)集合,其中每個(gè)元素都與一個(gè)標(biāo)識(shí)符相關(guān)聯(lián)。當(dāng)需要添加元素時(shí),副本會(huì)為元素生成一個(gè)唯一的標(biāo)識(shí)符,并將其添加到本地集合中。當(dāng)需要移除元素時(shí),副本會(huì)為要移除的元素生成一個(gè)移除標(biāo)記,并將其關(guān)聯(lián)到原始元素的標(biāo)識(shí)符上。OR-Set 的特性包括:
當(dāng)需要獲取全局集合時(shí),副本將所有副本的集合合并,并根據(jù)標(biāo)識(shí)符和移除標(biāo)記進(jìn)行操作。如果一個(gè)元素的標(biāo)識(shí)符存在于集合中,但它的移除標(biāo)記也存在,則該元素被視為已移除。這樣,移除操作具有優(yōu)先級(jí)高于添加操作的效果。OR-Set 可以實(shí)現(xiàn)在分布式環(huán)境中維護(hù)集合,并且具有最終一致性。它適用于需要記錄元素的添加和移除,并且允許移除操作覆蓋添加操作的場(chǎng)景。 CmRDTs 和 CvRDTs相比于 CvRDTs,CmRDTs 在副本之間傳輸操作的協(xié)議上有更多要求,但當(dāng)事務(wù)數(shù)量相對(duì)于內(nèi)部狀態(tài)的大小較小時(shí),它們使用的帶寬較少。然而,由于 CvRDT 的合并函數(shù)是可結(jié)合的,與某個(gè)副本的狀態(tài)進(jìn)行合并會(huì)包含該副本的所有先前更新。在減少網(wǎng)絡(luò)使用和處理拓?fù)渥兓矫?,使?Gossip 協(xié)議可以很好地傳播 CvRDT 狀態(tài)到其他副本。 CRDT 的數(shù)學(xué)基礎(chǔ)CRDT 的核心在于其合并操作必須滿足一組特定的數(shù)學(xué)性質(zhì),這些性質(zhì)保證了在分布式系統(tǒng)中數(shù)據(jù)最終能夠達(dá)到一致。合并操作(通常表示為 ∨)必須滿足以下三個(gè)關(guān)鍵性質(zhì): 1. 交換律(Commutativity)合并操作的順序不影響最終結(jié)果: [ A \vee B = B \vee A ] 這意味著無(wú)論是節(jié)點(diǎn) A 先將數(shù)據(jù)同步給節(jié)點(diǎn) B,還是節(jié)點(diǎn) B 先將數(shù)據(jù)同步給節(jié)點(diǎn) A,最終的結(jié)果都是一樣的。這個(gè)性質(zhì)對(duì)于分布式系統(tǒng)特別重要,因?yàn)樵趯?shí)際環(huán)境中,我們無(wú)法保證數(shù)據(jù)同步的順序。 示例:
2. 結(jié)合律(Associativity)多個(gè)合并操作的順序不影響最終結(jié)果: [ (A \vee B) \vee C = A \vee (B \vee C) ] 這個(gè)性質(zhì)確保了在有多個(gè)節(jié)點(diǎn)時(shí),無(wú)論按什么順序進(jìn)行合并,最終結(jié)果都是一致的。這對(duì)于大規(guī)模分布式系統(tǒng)尤為重要,因?yàn)閿?shù)據(jù)同步可能涉及多個(gè)節(jié)點(diǎn)的鏈?zhǔn)絺鬟f。 示例:
3. 冪等律(Idempotency)重復(fù)合并不會(huì)改變結(jié)果: [ A \vee A = A ] 這個(gè)性質(zhì)保證了即使同一個(gè)更新被應(yīng)用多次(例如由于網(wǎng)絡(luò)問(wèn)題導(dǎo)致的重復(fù)傳輸),也不會(huì)影響最終狀態(tài)。這對(duì)于構(gòu)建容錯(cuò)的分布式系統(tǒng)至關(guān)重要。 示例:
實(shí)際意義這些數(shù)學(xué)性質(zhì)的重要性體現(xiàn)在:
在實(shí)際應(yīng)用中,這些性質(zhì)使得 CRDT 特別適合構(gòu)建:
通過(guò)確保這些數(shù)學(xué)性質(zhì),CRDT 能夠在不需要復(fù)雜的協(xié)調(diào)機(jī)制的情況下,保證分布式系統(tǒng)中數(shù)據(jù)的最終一致性。 CRDT 是如何處理沖突的下圖描述了 Yjs 中處理沖突的算法模型,它是一個(gè)支持點(diǎn)對(duì)點(diǎn)傳輸?shù)臎_突處理模型。 首先我們先來(lái)解釋一下圖中的元素:
圖示的操作順序:
當(dāng)兩個(gè)操作發(fā)生并發(fā)沖突(例如 在這個(gè)例子中,用戶 1 的標(biāo)識(shí)符(1)大于用戶 0 的標(biāo)識(shí)符(0),因此生成的最終文檔順序是 CRDT 機(jī)制能夠避免傳統(tǒng)操作轉(zhuǎn)發(fā)(OT)所面臨的沖突問(wèn)題,同時(shí)保證最終一致性,原因在于其設(shè)計(jì)采用了沖突自由的合并規(guī)則,而不依賴于復(fù)雜的操作變換和中央?yún)f(xié)調(diào)。 在 OT 中,當(dāng)多個(gè)用戶并發(fā)地對(duì)同一數(shù)據(jù)進(jìn)行操作時(shí),系統(tǒng)需要通過(guò)操作轉(zhuǎn)發(fā)和變換來(lái)確保操作順序的一致性。這通常涉及復(fù)雜的變換邏輯,例如在兩個(gè)用戶同時(shí)修改相同數(shù)據(jù)位置時(shí),OT 會(huì)通過(guò)變換算法調(diào)整其中一個(gè)操作的位置或內(nèi)容,以確保最終結(jié)果一致。盡管 OT 可以解決許多并發(fā)沖突,但這種變換機(jī)制本身具有高復(fù)雜性,特別是在多個(gè)用戶同時(shí)進(jìn)行操作時(shí),操作的變換和沖突解決可能導(dǎo)致性能瓶頸、維護(hù)困難,以及在極端情況下可能產(chǎn)生不一致的結(jié)果。 與此不同,CRDT 通過(guò)設(shè)計(jì)內(nèi)建的合并規(guī)則來(lái)避免這些問(wèn)題。每個(gè) CRDT 數(shù)據(jù)結(jié)構(gòu)都確保其操作是冪等、交換性強(qiáng)且結(jié)合性好的,這意味著無(wú)論操作順序如何或是否發(fā)生并發(fā)操作,所有副本都能夠自動(dòng)且無(wú)沖突地合并,最終收斂到一致的狀態(tài)。CRDT 不依賴于操作的順序或中央?yún)f(xié)調(diào),而是依靠每個(gè)操作的唯一標(biāo)識(shí)符和局部合并規(guī)則來(lái)直接解決并發(fā)沖突,從而顯著減少了在處理沖突時(shí)的計(jì)算復(fù)雜度。 此外,CRDT 的這一機(jī)制使得它天然適合高可用性和容錯(cuò)性要求較高的分布式系統(tǒng),在面對(duì)網(wǎng)絡(luò)分區(qū)、節(jié)點(diǎn)故障等場(chǎng)景時(shí),系統(tǒng)依然能夠繼續(xù)操作并保證數(shù)據(jù)一致性。因此,CRDT 更加簡(jiǎn)潔、易于擴(kuò)展,并能夠在沒(méi)有顯式操作轉(zhuǎn)發(fā)和變換的情況下,確保最終一致性,從根本上避免了 OT 中因操作順序和變換導(dǎo)致的復(fù)雜性和潛在沖突。 CRDT 如何解決臟路徑問(wèn)題在分布式系統(tǒng)中,臟路徑(Dirty Path)問(wèn)題通常出現(xiàn)在多個(gè)副本之間進(jìn)行并發(fā)操作時(shí),導(dǎo)致副本之間的數(shù)據(jù)狀態(tài)不一致。由于不同副本的操作可能由于網(wǎng)絡(luò)延遲、分區(qū)或同步問(wèn)題而不同步,這使得系統(tǒng)中可能出現(xiàn)不一致的數(shù)據(jù)狀態(tài)。傳統(tǒng)的分布式系統(tǒng)通常依賴中心化的協(xié)調(diào)機(jī)制來(lái)同步數(shù)據(jù),但這也容易引發(fā)性能瓶頸和復(fù)雜的沖突解決問(wèn)題。CRDT(沖突自由復(fù)制數(shù)據(jù)類型)通過(guò)去中心化和無(wú)沖突的操作設(shè)計(jì),避免了臟路徑問(wèn)題,確保多個(gè)副本能夠在并發(fā)操作后最終收斂到一致的狀態(tài)。 以下是 CRDT 如何通過(guò)一系列設(shè)計(jì)原則來(lái)解決臟路徑問(wèn)題的詳細(xì)過(guò)程: 1. 唯一標(biāo)識(shí)符與操作標(biāo)記CRDT 使用唯一標(biāo)識(shí)符來(lái)區(qū)分每個(gè)操作,每個(gè)操作的標(biāo)識(shí)符通常由 用戶標(biāo)識(shí)符(例如用戶 ID)和 操作序列號(hào)(通常是時(shí)間戳或遞增的操作編號(hào))組成。唯一標(biāo)識(shí)符保證了操作的順序,即使這些操作在不同副本上并發(fā)發(fā)生。 操作標(biāo)識(shí)符的作用:
這種設(shè)計(jì)避免了因操作沒(méi)有明確順序而產(chǎn)生的不一致或沖突,從而有效地避免了臟路徑問(wèn)題。 示例:假設(shè)用戶 A 在副本 1 上插入了一個(gè)字符 2. 并發(fā)操作的解決在 CRDT 中,每個(gè)副本都能夠獨(dú)立進(jìn)行操作,當(dāng)多個(gè)副本發(fā)生并發(fā)操作時(shí),CRDT 使用設(shè)計(jì)的 合并規(guī)則 來(lái)自動(dòng)解決沖突,確保所有副本最終達(dá)到一致?tīng)顟B(tài)。 如何處理并發(fā)操作?
例如,假設(shè) 3. 合并規(guī)則與最終一致性CRDT 的設(shè)計(jì)關(guān)鍵在于 合并規(guī)則,即如何將并發(fā)操作合并為一致的狀態(tài)。這些合并規(guī)則確保了即使副本之間的操作順序不同,最終副本的數(shù)據(jù)會(huì)收斂到相同的狀態(tài)。 合并規(guī)則保證一致性:
這些規(guī)則使得 CRDT 在面對(duì)并發(fā)更新時(shí),能夠自動(dòng)解決沖突并收斂到一致的狀態(tài)。 舉例說(shuō)明:假設(shè)兩個(gè)用戶并發(fā)進(jìn)行插入操作,用戶 A 在副本 1 中插入 4. 雙向鏈表在 CRDT 中的應(yīng)用在一些 CRDT 應(yīng)用(例如文本編輯器)中,雙向鏈表 被用來(lái)存儲(chǔ)數(shù)據(jù)。雙向鏈表的結(jié)構(gòu)非常適合表示具有順序關(guān)系的數(shù)據(jù),并且支持高效的插入、刪除和更新操作。 雙向鏈表如何解決臟路徑問(wèn)題:
通過(guò)這種方式,CRDT 可以處理并發(fā)插入、刪除操作,避免因操作順序不同而引發(fā)臟路徑問(wèn)題。 5. 最終一致性CRDT 通過(guò)合并規(guī)則確保所有副本最終一致。即使操作在不同副本之間發(fā)生延遲或順序不同,最終的合并結(jié)果會(huì)保證一致性。 如何確保最終一致性?
通過(guò)最終一致性,CRDT 確保即使在網(wǎng)絡(luò)分區(qū)或節(jié)點(diǎn)故障的情況下,系統(tǒng)中的所有副本最終都會(huì)收斂到相同的數(shù)據(jù)狀態(tài),避免了臟路徑問(wèn)題。 6. 避免臟路徑:總結(jié)CRDT 解決臟路徑問(wèn)題的關(guān)鍵在于:
通過(guò)這些機(jī)制,CRDT 確保了分布式系統(tǒng)中的高可用性、容錯(cuò)性和一致性,避免了臟路徑問(wèn)題的出現(xiàn),并且簡(jiǎn)化了分布式系統(tǒng)中并發(fā)操作的管理。 CRDT 如何解決 UNDO/REDO 問(wèn)題在分布式系統(tǒng)中,UNDO 和 REDO 是常見(jiàn)的操作需求,尤其是在分布式應(yīng)用(如分布式文本編輯器、協(xié)作平臺(tái)等)中,這些操作通常需要確保數(shù)據(jù)的一致性和正確的操作回溯。然而,傳統(tǒng)的事務(wù)日志和操作轉(zhuǎn)發(fā)(OT)機(jī)制在處理這些操作時(shí)可能會(huì)遇到同步、順序和沖突等問(wèn)題。而 CRDT(沖突自由復(fù)制數(shù)據(jù)類型)通過(guò)其特有的設(shè)計(jì)原則,能夠優(yōu)雅地解決 UNDO 和 REDO 問(wèn)題,保證分布式系統(tǒng)中操作的回滾與重做能夠在多個(gè)副本間一致地執(zhí)行。 什么是 UNDO 和 REDO?
在分布式系統(tǒng)中,UNDO 和 REDO 需要跨多個(gè)副本同步,以保證每個(gè)副本中的歷史操作可以一致地回滾或重做。此過(guò)程可能會(huì)受到以下問(wèn)題的影響:
CRDT 如何解決 UNDO 和 REDO 問(wèn)題CRDT 提供了一些特性,使其特別適合解決 UNDO 和 REDO 問(wèn)題,尤其是在分布式環(huán)境下。這些特性包括 沖突自由的操作合并、冪等性、交換性、結(jié)合性、以及 最終一致性。通過(guò)這些特性,CRDT 可以處理操作回滾和重做時(shí)遇到的挑戰(zhàn)。 1. 操作歷史與逆向操作(Undo/Redo)CRDT 中的每個(gè)操作(如插入、刪除等)都有一個(gè)唯一標(biāo)識(shí)符。通過(guò)設(shè)計(jì)合適的操作歷史結(jié)構(gòu),CRDT 可以存儲(chǔ)每個(gè)操作,并支持操作的回溯和重做。這對(duì)于分布式系統(tǒng)中的 UNDO 和 REDO 操作至關(guān)重要。 操作的存儲(chǔ)和標(biāo)識(shí):
操作回滾(UNDO):
操作重做(REDO):
2. 如何支持并發(fā)和沖突解決在分布式系統(tǒng)中,UNDO 和 REDO 操作通常是在多個(gè)副本之間執(zhí)行的,可能會(huì)遇到并發(fā)沖突的問(wèn)題。CRDT 的核心特性能夠有效地解決并發(fā)沖突問(wèn)題,從而確保 UNDO 和 REDO 操作的一致性。 冪等性、交換性和結(jié)合性:
這些特性使得 CRDT 在多個(gè)副本上執(zhí)行 UNDO 和 REDO 操作時(shí),可以自動(dòng)解決并發(fā)沖突,確保不同副本的數(shù)據(jù)始終一致。 解決并發(fā)沖突的方式:
示例:
3. 最終一致性與操作回溯CRDT 的設(shè)計(jì)目標(biāo)之一是 最終一致性。即使操作的執(zhí)行順序不同,所有副本最終都會(huì)達(dá)到一致的狀態(tài)。對(duì)于 UNDO 和 REDO 操作,CRDT 確保它們的執(zhí)行不會(huì)破壞最終一致性。 確保一致性:
4. 雙向鏈表的應(yīng)用在一些具體的 CRDT 實(shí)現(xiàn)中(例如分布式文本編輯器),使用 雙向鏈表 來(lái)存儲(chǔ)數(shù)據(jù),這使得 UNDO 和 REDO 操作更容易實(shí)現(xiàn)。 雙向鏈表支持操作回溯:
雙向鏈表使得撤銷和重做操作在數(shù)據(jù)結(jié)構(gòu)中非常高效,并且能夠根據(jù)唯一標(biāo)識(shí)符和合并規(guī)則來(lái)正確解決沖突。 CRDT 通過(guò)以下幾個(gè)關(guān)鍵特性解決了 UNDO 和 REDO 問(wèn)題:
通過(guò)這些機(jī)制,CRDT 在分布式環(huán)境下不僅保證了 UNDO 和 REDO 的一致性,還有效解決了并發(fā)沖突和操作歷史同步的問(wèn)題。 CRDT 解決并發(fā)沖突接下來(lái)我們將以圖片設(shè)置 align 屬性為例介紹,首先看看 CRDT 如何描述對(duì)象屬性及屬性修改: 左邊是圖片數(shù)據(jù)模型,右邊是模擬 CRDT 對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu),圖片對(duì)象中的每一個(gè)字段都使用結(jié)構(gòu)對(duì)象去描述內(nèi)容及內(nèi)容的修改,這里以 align 字段的代表看它的表達(dá) 操作 1??: 左邊是圖片數(shù)據(jù)模型,右邊是模擬 CRDT 對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu),圖片對(duì)象中的每一個(gè)字段都使用結(jié)構(gòu)對(duì)象去描述內(nèi)容及內(nèi)容的修改,這里以 align 字段的代表看它的表達(dá) 圖中最上方的藍(lán)色結(jié)構(gòu)表示 隨后,用戶執(zhí)行了操作 ①,將 ?? 值得注意的是:此結(jié)構(gòu)中的
為避免混淆,請(qǐng)理解:結(jié)構(gòu)對(duì)象中間的那一塊,才是真正表示屬性值的內(nèi)容,而兩側(cè)的 操作 2??: 當(dāng)然!以下是你后續(xù)“并發(fā)修改”部分的潤(rùn)色版本,緊接在“順序修改”之后,風(fēng)格統(tǒng)一,邏輯清晰,讀起來(lái)也更專業(yè): 與前面的順序修改不同,在并發(fā)場(chǎng)景中,多個(gè)用戶幾乎同時(shí)基于相同的狀態(tài)進(jìn)行修改操作。此時(shí),CRDT 會(huì)采用特定的合并策略來(lái)決定各個(gè)操作的插入順序,從而確保所有副本最終達(dá)成一致。 如圖所示,這一次有兩個(gè)用戶同時(shí)基于狀態(tài)
由于這兩個(gè)操作是并發(fā)的,它們都指向相同的前置節(jié)點(diǎn) 最終形成的雙向鏈表結(jié)構(gòu)如下:
系統(tǒng)將 這種機(jī)制展現(xiàn)了 CRDT 在面對(duì)并發(fā)修改時(shí)的優(yōu)勢(shì):無(wú)需沖突檢測(cè),也不丟失任一修改歷史,并能通過(guò)一致的排序規(guī)則達(dá)成最終一致性。 下面看看兩個(gè)用戶并發(fā)的執(zhí)行屬性修改時(shí)產(chǎn)生的數(shù)據(jù)結(jié)構(gòu): 與前面的順序操作不同,此處執(zhí)行的操作 ① 和操作 ② 是并發(fā)修改:它們都是基于同一個(gè)前置狀態(tài),即 具體來(lái)說(shuō):
由于兩個(gè)修改操作的基礎(chǔ)狀態(tài)相同,因此構(gòu)成并發(fā)。在這種情況下,CRDT 會(huì)根據(jù)標(biāo)識(shí)符的全局有序性來(lái)進(jìn)行合并處理。 在本示例中,
最終形成如下鏈表結(jié)構(gòu):
因此,最終 這一過(guò)程體現(xiàn)了 CRDT 對(duì)并發(fā)操作的自動(dòng)合并能力:無(wú)需人工干預(yù)或沖突解決策略,僅通過(guò)標(biāo)識(shí)符排序,就能實(shí)現(xiàn)一致性和可預(yù)期的合并結(jié)果。 順序修改 vs 并發(fā)修改:對(duì)比總結(jié)
在 CRDT 模型下,無(wú)論是順序修改還是并發(fā)修改,都能通過(guò)結(jié)構(gòu)化的數(shù)據(jù)表示 + 有序標(biāo)識(shí)符來(lái)安全地整合操作,確保最終狀態(tài)一致,并完整保留修改軌跡。這正是 CRDT 在協(xié)同編輯、離線同步等場(chǎng)景下強(qiáng)大而可靠的基礎(chǔ)。 參考文章總結(jié)CRDT(無(wú)沖突復(fù)制數(shù)據(jù)類型)是一類用于分布式系統(tǒng)中的數(shù)據(jù)結(jié)構(gòu),它通過(guò)內(nèi)建的冪等性、交換性和結(jié)合性操作,支持各副本在無(wú)協(xié)調(diào)情況下獨(dú)立更新并自動(dòng)合并,最終收斂為一致?tīng)顟B(tài)。它避免了傳統(tǒng)并發(fā)控制中對(duì)沖突的顯式處理,適用于離線編輯、多端同步、協(xié)同操作等高可用場(chǎng)景。通過(guò)唯一標(biāo)識(shí)符和結(jié)構(gòu)化合并策略,CRDT 能在面對(duì)并發(fā)修改、網(wǎng)絡(luò)分區(qū)等挑戰(zhàn)時(shí)保持?jǐn)?shù)據(jù)一致性和操作完整性。 轉(zhuǎn)自https://juejin.cn/post/7490425439757664271 該文章在 2025/4/14 9:58:58 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |