數(shù)據(jù)同步

這里的數(shù)據(jù)同步的問(wèn)題描述的是-多個(gè)不同的端存儲(chǔ)相同的數(shù)據(jù),并需要保證數(shù)據(jù)的同步。 這在現(xiàn)實(shí)開(kāi)發(fā)中實(shí)在是個(gè)令人頭疼的難題, 參考原文在理解的基礎(chǔ)上做了修改和調(diào)整

分布式數(shù)據(jù)庫(kù)互備

分布式應(yīng)用配置同步

多設(shè)備應(yīng)用數(shù)據(jù)同步

本文想借此展開(kāi)相關(guān)的理論和實(shí)例來(lái)深入研究一下數(shù)據(jù)同步問(wèn)題。

數(shù)據(jù)同步理論

同步方式
同步客戶端服務(wù)器 (Synchronous Client-Server, S-CS)

應(yīng)用直接和遠(yuǎn)程服務(wù)通訊,將數(shù)據(jù)同步

實(shí)例:微信發(fā)送一條消息,只有消息發(fā)送完成過(guò)后才會(huì)存儲(chǔ)在本地消息發(fā)送成功列表中,未發(fā)送成功會(huì)提示重新發(fā)送

異步客戶端服務(wù)器 (Asynchronous Client-Server, A-CS)

應(yīng)用將數(shù)據(jù)保存在本地,應(yīng)用保持本地?cái)?shù)據(jù)和遠(yuǎn)程數(shù)據(jù)的同步(后臺(tái)運(yùn)行)

實(shí)例:Mac QuickTime 錄制了一段視頻,存儲(chǔ)在文件系統(tǒng)中,iCoud 自動(dòng)將文件系統(tǒng)中的數(shù)據(jù)同步到云端

異步對(duì)等方式 (Asynchronous Peer-to-Peer, A-P2P)

應(yīng)用數(shù)據(jù)保存在本地,應(yīng)用保持本地?cái)?shù)據(jù)和其他端的數(shù)據(jù)同步, 每個(gè)端存儲(chǔ)數(shù)據(jù)的完成備份,服務(wù)器端不存在備份。

數(shù)據(jù)同步要素
識(shí)別

對(duì)象識(shí)別需要使用全局標(biāo)識(shí)符 uuids (universaaly Unique identifiers)

變化追蹤

描述算法如何確定自上一次數(shù)據(jù)同步后, 數(shù)據(jù)發(fā)生了哪些變化, 然后本地存儲(chǔ)應(yīng)該如何修改。

  1. 顆粒大小: 當(dāng)某個(gè)屬性字段被修改過(guò)后,確定追蹤這個(gè)字段還是追蹤整個(gè)實(shí)例

  2. 記錄變化: 是否變化簡(jiǎn)單情況可以用一個(gè) Boolean 的標(biāo)示來(lái)表示, 也可能需要用日志來(lái)記錄變化并附加時(shí)間戳

  3. 軟刪除:
    沖突解決

當(dāng)多端都在共同修改一個(gè)實(shí)例的時(shí)候,就會(huì)出現(xiàn)沖突。

  1. 簡(jiǎn)單情況: 讀寫(xiě)被認(rèn)為是原子操作,解決沖突可以看成選擇什么版本的存儲(chǔ)。 如 iCloud 出現(xiàn)沖突時(shí),應(yīng)用提示用戶選擇文檔的什么版本

  2. 變化優(yōu)先級(jí)策略:

a. 最近一次的同步操作確定級(jí)別最高, 所有這一次同步操作的變化覆蓋之前存儲(chǔ)的數(shù)據(jù),

b. 最近一次修改時(shí)間戳確定優(yōu)先級(jí)別

  1. 避免隨機(jī)策略,總是保證一致的選擇策略
對(duì)等同步通訊(S-P2P)

假設(shè)我們有一個(gè)像 iTunes 那樣的 Mac 應(yīng)用程序,它可以通過(guò) USB、藍(lán)牙或者 Wi-Fi 和 iPhone 進(jìn)行同步通訊。(憑借快速的本地網(wǎng)絡(luò),我們不用太在意限制數(shù)據(jù)傳輸大?。?/p>

  1. 第一步: 當(dāng) iPhone 第一次同步的時(shí)候,兩個(gè)應(yīng)用程序通過(guò) Bonjour 發(fā)現(xiàn)對(duì)方,然后 Mac 應(yīng)用程序?qū)⑺乃写鎯?chǔ)數(shù)據(jù)壓縮,通過(guò)套接字將壓縮后的文件傳遞給 iPhone 應(yīng)用程序,然后 iPhone 將其解壓并安裝。

  2. 第二步: 現(xiàn)在假設(shè)用戶使用 iPhone 對(duì)已經(jīng)存在的對(duì)象做了修改 (比如,給一首歌打了星級(jí))。該設(shè)備上的應(yīng)用程序給該對(duì)象設(shè)置了一個(gè) Boolean 型的標(biāo)記(比如,changedSinceSync),用來(lái)表示該對(duì)象是新的還是已經(jīng)被修改過(guò)的。

  3. 第三步:當(dāng)下一次同步發(fā)生的時(shí)候,iPhone 應(yīng)用程序?qū)⑺乃袛?shù)據(jù)存儲(chǔ)壓縮并回發(fā)給 Mac。Mac 裝載這些數(shù)據(jù),尋找被修改的實(shí)例,然后更新它自己對(duì)應(yīng)的數(shù)據(jù)。然后 Mac 又將更新后的數(shù)據(jù)存儲(chǔ)的完整拷貝發(fā)送給 iPhone,用來(lái)替代 iPhone 已經(jīng)存在的數(shù)據(jù)存儲(chǔ),然后整個(gè)流程又重新開(kāi)始。

總結(jié)來(lái)說(shuō),同步操作需要設(shè)備能夠向其他設(shè)備傳輸數(shù)據(jù),并且能夠決定哪些被修改、合并,然后回傳更新后的數(shù)據(jù)。 保證了這兩個(gè)設(shè)備同步之后具有相同的數(shù)據(jù),所以,有很強(qiáng)的健壯性。

客戶端-服務(wù)器同步通訊(S-CS)

當(dāng)加入了服務(wù)器的時(shí)候,服務(wù)器是為了能夠更加靈活地同步數(shù)據(jù),但是它是以數(shù)據(jù)傳輸和存儲(chǔ)為代價(jià)的。 需要盡可能地減少通訊開(kāi)銷,所以來(lái)回地拷貝整個(gè)數(shù)據(jù)是不可行的。

前置條件:假設(shè)數(shù)據(jù)存儲(chǔ)在服務(wù)器上的數(shù)據(jù)庫(kù)中,并且每一個(gè)對(duì)象都有一個(gè)最后更新的時(shí)間戳。

第一步:當(dāng)客戶端程序第一次同步的時(shí)候下載所有的數(shù)據(jù),然后建立一個(gè)本地存儲(chǔ),同時(shí)也在本地記錄同步的時(shí)間戳。

第二步:當(dāng)客戶端程序發(fā)生改變的時(shí)候,它會(huì)更新對(duì)象的最后更新時(shí)間戳。

第三步:當(dāng)下一次同步發(fā)生的時(shí)候,客戶端會(huì)決定自上一次同步后,哪些對(duì)象做了修改,然后僅把被修改的對(duì)象發(fā)送給服務(wù)器。服務(wù)器會(huì)合并這些修改。如果服務(wù)器對(duì)某一個(gè)對(duì)象的拷貝被另一個(gè)客戶端做了修改,那么它會(huì)以最近的時(shí)間戳為準(zhǔn)來(lái)保存修改。然后服務(wù)器會(huì)回傳所有比上一次從客戶端發(fā)來(lái)的時(shí)間戳新的變化。這需要考慮到合并的問(wèn)題,刪除所有覆蓋的變化。

也許有很多不同的方法。比如,你可以為每一個(gè)屬性引入一個(gè)時(shí)間戳,然后在屬性粒度級(jí)去追蹤變化。或者你可以在客戶端合并所有的數(shù)據(jù),然后將合并后的結(jié)果發(fā)回給服務(wù)器,這實(shí)際上是互換了角色。但是,基本說(shuō)來(lái),一個(gè)設(shè)備發(fā)送修改結(jié)果給其他設(shè)備,然后接收方合并并回發(fā)合并后的結(jié)果。

刪除需要考慮更多。因?yàn)橐坏﹦h除了一個(gè)對(duì)象,就不可能跟蹤它了。一種選擇是使用 軟刪除 ,也就是對(duì)象并不是被真正的刪除,而是標(biāo)記為刪除 (比如使用一個(gè) Boolean 屬性)。 (這和在 Finder 中刪除一個(gè)文件類似。只有當(dāng)你清空的垃圾桶之后,它才被永久地刪除。)

客戶端-服務(wù)器異步通訊 (A-CS)

異步的數(shù)據(jù)同步框架和服務(wù)的吸引力在于它們提供了現(xiàn)成的解決方案。 S-CS 模式是要定制的,也就是說(shuō)得為不同的應(yīng)用程序以及不同的平臺(tái)編寫(xiě)不同的代碼。

異步服務(wù) (比如, Dropbox Datastore API 和 Wasabi Sync) 通常提供框架,讓?xiě)?yīng)用程序開(kāi)發(fā)者用起來(lái)好像是本地?cái)?shù)據(jù)存儲(chǔ)。這些框架在本地保存修改,然后在后臺(tái)控制與服務(wù)器的同步。

A-CS 和 S-CS 的一個(gè)最主要的區(qū)別在于,A-CS 框架額外提供的抽象層,屏蔽了直接參與同步的客戶端代碼。這也意味著,同一服務(wù)可以用于所有的數(shù)據(jù)模型,而不是特定的一種模型。

1.數(shù)據(jù)同步實(shí)例

2.數(shù)據(jù)庫(kù)互備

3.Evernote

4.workflowy

5.部落沖突

6.百度云盤(pán)

7.通訊錄備份

8.git

轉(zhuǎn)載:https://segmentfault.com/a/1190000004887200

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容