Microsoft Sync Framework 通過預創(chuàng)建提供程序或編寫新的自定義提供程序,包含將應用程序集成到離線或基于協(xié)作網(wǎng)絡所需的所有組件。無論采用的是哪種網(wǎng)絡或設備類型,提供程序均使任何數(shù)據(jù)源能夠參與數(shù)據(jù)同步。
Microsoft Sync Framework 是為應用程序、服務和設備啟用協(xié)作和離線方案的綜合性同步平臺。它的特色在于提供了能夠漫游、共享和離線提取數(shù)據(jù)的技術和工具。通過使用 Microsoft Sync Framework,開發(fā)人員可以構建同步生態(tài)系統(tǒng),該生態(tài)系統(tǒng)能夠?qū)⑷魏螒贸绦蚺c任一網(wǎng)絡的任意數(shù)據(jù)集成,無論它們存儲在何處,使用何種協(xié)議。
Microsoft Sync Framework 最重要的功能是創(chuàng)建自定義同步提供程序。提供程序是代表同步副本的軟件組件。副本是將要進行同步的特殊信息倉庫,例如手持設備的文件系統(tǒng)。當代表數(shù)據(jù)源時,提供程序枚舉其副本的變化。當代表目的端時,提供程序?qū)⒆兓瘧糜诟北。如果源端和目的端?shù)據(jù)在類型或架構方面存在差異,則每個提供程序都將執(zhí)行各種必需的映射或轉(zhuǎn)換。
Microsoft Sync Framework 包括大量支持常見數(shù)據(jù)源的提供程序。盡管您可以為這些數(shù)據(jù)源編寫自定義提供程序,但建議您盡可能地使用 Microsoft Sync Framework 提供的提供程序。因為這樣能夠?qū)㈤_發(fā)時間減到最少,并使您能夠重用經(jīng)過測試的現(xiàn)成代碼。
開發(fā)人員最終能夠使用所提供的所有提供程序,或創(chuàng)建自定義提供程序在設備和應用程序之間交換信息。
包括下列提供程序:
ADO.NET 同步服務:用于同步啟用 ADO.NET 的數(shù)據(jù)源
文件系統(tǒng)同步服務:用于同步文件和文件夾
SSE 同步服務:用于同步簡單共享擴展 (SSE),如 RSS 源和 ATOM 源
開發(fā)人員最終能夠使用所提供的所有提供程序,或創(chuàng)建自定義提供程序在設備和應用程序之間交換信息。
Microsoft Synchronization Framework核心組件:
在使用 Microsoft Sync Framework 實現(xiàn)同步之前,我們需要首先了解同步提供程序的關鍵組件。將在本文檔后面的同步示例中進一步說明這些概念。
下圖顯示了提供程序如何與數(shù)據(jù)源進行通信并從元數(shù)據(jù)存儲中檢索狀態(tài)信息。這些提供程序依次通過同步會話與其他提供程序進行通信。
數(shù)據(jù)源
數(shù)據(jù)源是指存儲所有需要同步的信息的位置。數(shù)據(jù)源可以是關系數(shù)據(jù)庫、文件系統(tǒng)、Web 服務,甚或一系列業(yè)務應用程序中包含的自定義數(shù)據(jù)源。凡是能夠以編程方式訪問的數(shù)據(jù)都可以參與同步。
元數(shù)據(jù)
提供程序的基本特征在于它能夠存儲有關數(shù)據(jù)存儲以及該數(shù)據(jù)存儲中與狀態(tài)和更改信息相關的對象的信息。元數(shù)據(jù)可以存儲在任意位置,無論它是文件、數(shù)據(jù)庫還是現(xiàn)有的副本數(shù)據(jù)存儲。為方便起見,Microsoft Sync Framework 提供一個以 SQL Server Compact Edition 為基礎的完整元數(shù)據(jù)存儲實現(xiàn)。該存儲并非必要,但使用它意味著您不必擔心如何存儲同步元數(shù)據(jù)。
用于數(shù)據(jù)存儲的元數(shù)據(jù)可以分為三個主要組件:
版本: 為每個同步項目存儲少量信息,稱為項目版本。該信息記錄了項目在何時何處發(fā)生變化,以及與該項目關聯(lián)的項目 ID。在數(shù)據(jù)庫示例中,一個項目可能是表中的整行。一個項目也可能是表中某行的一列。
當項目發(fā)生更改時,存儲的有關該更改的信息將包括創(chuàng)建版本 和更新版本。這些版本包含兩個組件:a 滴答計數(shù) 它是一個在整個源范圍內(nèi)使用以唯一標識一個更改的邏輯時鐘,以及一個副本 ID 它用于唯一標識發(fā)生更改的數(shù)據(jù)存儲。當首次創(chuàng)建項目時,創(chuàng)建版本與更新版本相同。對該項目的后續(xù)更新修改的只是更新版本。
必須至少在項目級別上跟蹤所有的更改。換句話說,每個項目必須具備獨立的版本。 在某些情況中需要更大力度的跟蹤以減少潛在的數(shù)據(jù)沖突(兩位用戶在不同的副本上更新相同的項目)。這種方法的弊端在于它增加了需要存儲的更改跟蹤信息量。
兩種主要的版本實現(xiàn)方式是:
內(nèi)聯(lián)跟蹤:在這種方法中,項目的更改跟蹤信息在做出更改時更新。以數(shù)據(jù)庫為例,可能會使用觸發(fā)器在更新行之后立即更新更改跟蹤表。
異步跟蹤:在這種方法中,將運行外部進程來掃描更改。發(fā)現(xiàn)的任何更新將添加到版本信息當中。該進程可能是定期執(zhí)行進程的一部分,或者它可能在同步之前執(zhí)行。該進程通常用于當沒有內(nèi)部機制能夠在項目更新時自動更新版本信息的情況中(例如,無法在更新流程中增加版本更新邏輯)。檢查更改的常用方式是存儲項目的狀態(tài),并將存儲的狀態(tài)與項目當前狀態(tài)進行比較。例如,可檢查從上次同步起,最后寫入時間或文件大小是否發(fā)生變化。
知識: 知識是副本能夠感知的數(shù)據(jù)更改的簡約表述。知識的目的在于使同步更加有效,因為它有助于限制在副本之間發(fā)送的信息量。當版本信息更新時,用于數(shù)據(jù)存儲的知識也隨之更新。提供程序使用副本知識的目的有:
枚舉更改:確定另一個副本沒有感知的更改。
檢測沖突:確定哪項操作是在不了解彼此知識的情況下做出的。
Tombstones: 每個副本還必須為每個刪除的項目維護tombstone 信息。如果不跟蹤刪除信息,提供程序?qū)o法告知某個項目(如文件)已被刪除。在這種情況下,提供程序無法將更改版本信息傳播至其他提供程序。Tombstone 必須包含以下信息:
因為 tombstone 日志中的信息將隨時間增加,所以有必要創(chuàng)建一個進程定期清理該存儲。清理 tombstone 數(shù)據(jù)能夠節(jié)省空間并且有助于改善同步性能。Microsoft Sync Framework 支持管理 tombstone 信息。
全局 ID: 用于在所有副本中唯一確定 tombstone 項目的副本 ID 和滴答計數(shù)。
刪除版本: 與 tombstone 項目關聯(lián)的更新版本
創(chuàng)建版本: 最初創(chuàng)建項目時關聯(lián)的副本 ID 和滴答計數(shù)
同步流程:
發(fā)起同步的副本稱為源 而源所連接的副本稱為目標。本文接下來的部分將介紹下圖所示的同步流程。對于雙向同步,將執(zhí)行此進程兩次,第二次迭代時會交換源和目標。
目標端發(fā)起同步會話
在這一階段將建立同步會話,從而創(chuàng)建了從源到提供程序的鏈接。
目標準備并發(fā)送知識
如前所述,每個副本都會存儲其自身的知識。存儲在目標端的知識將傳遞到源。
目標知識用于確定要發(fā)送的更改
在源端,會將剛剛收到的知識與本地項目版本進行比較,以確定目標端尚不了解的項目。值得注意的是,發(fā)送的版本并不是實際的項目,而是每個項目上次發(fā)生更改的位置摘要。
更改版本和發(fā)往目標端的源知識
當源準備好所需的更改版本列表之后,這些版本將傳輸?shù)侥繕硕?/p>
檢索更改項目的本地版本并與源版本和知識進行比較
目標端使用這些版本準備源需要發(fā)送的項目列表。目標還使用該信息檢測是否存在限制沖突。限制沖突是指違反了項目限制,如文件夾關系或文件系統(tǒng)中同名數(shù)據(jù)的位置。
檢測并解決或推遲沖突
基本上,如果在兩次同步期間對兩個副本上的相同項目進行更改就會發(fā)生沖突。在 Microsoft Sync Framework 運行時中,當其中一個副本的更改版本不包含另一個副本更改的知識時便會檢測到?jīng)_突。 將在下面的“沖突示例”部分中介紹了說明該檢測過程如何工作的更加詳細的示例。
副本可以自由實施各種策略,解決同步拓撲間發(fā)生沖突的項目。下面列舉了一些常用的沖突解決策略:
源獲勝: 當檢測到?jīng)_突時,總是采用源副本所做的更改。
目標獲勝: 總是采用目標副本所做的更改。
合并: 將源副本和目標副本所做的更改合并在一起。庫存統(tǒng)計可能是一個您希望將兩個副本的值合并(求和),而不是選取其中一個作為正確值的例子。
記錄沖突: 記錄或推遲沖突。
目標向源請求項目數(shù)據(jù)
在這一階段,目標已經(jīng)確定需要在源中檢索的項目,并將請求發(fā)送到源。
源準備并發(fā)送項目數(shù)據(jù)
源接收到項目數(shù)據(jù)請求,并準備要傳輸?shù)侥繕说膶嶋H數(shù)據(jù)。如果要跟蹤的項目是數(shù)據(jù)庫中的一行,則將發(fā)送該行。如果項目是文件夾中的文件,則將傳送該文件。
項目應用到目標中
目標接收并應用項目。如果在此過程中出現(xiàn)任何錯誤(如網(wǎng)絡斷開),則該項目將被標記為異常,并在下次同步期間進行更正。從源接收的知識將添加到目標知識。