Microsoft Sync Framework Runtime 簡介(一篇非常好的MSF介紹文章)

一篇非常好的Microsoft Sync Framework的介紹文章,通俗易懂的概述了MSF的使用場景和邏輯結構。分享給大家。
MSDN原文地址:http://msdn.microsoft.com/en-us/sync/bb821992.aspx

Microsoft Sync Framework Runtime 簡介

內容
簡介
參與方
參與方類型
Microsoft Synchronization Framework
核心組件
    數據源
元數據
同步流程
    同步示例
    衝突示例
摘要

簡介

Microsoft Sync Framework 是爲應用程序、服務和設備啓用協作和離線方案的綜合性同步平臺。它的特色在於提供了能夠漫遊、共享和離線提取數據的技術和工具。通過使用 Microsoft Sync Framework,開發人員可以構建同步生態系統,該生態系統能夠將任何應用程序與任一網絡的任意數據集成,無論它們存儲在何處,使用何種協議。

Microsoft Sync Framework 最重要的功能是創建自定義同步提供程序。提供程序是代表同步副本的軟件組件。副本是將要進行同步的特殊信息倉庫,例如手持設備的文件系統。當代表數據源時,提供程序枚舉其副本的變化。當代表目的端時,提供程序將變化應用於副本。如果源端和目的端數據在類型或架構方面存在差異,則每個提供程序都將執行各種必需的映射或轉換。

Microsoft Sync Framework 包括大量支持常見數據源的提供程序。儘管您可以爲這些數據源編寫自定義提供程序,但建議您儘可能地使用 Microsoft Sync Framework 提供的提供程序。因爲這樣能夠將開發時間減到最少,並使您能夠重用經過測試的現成代碼。包括下列提供程序:

  • ADO.NET 同步服務:用於同步啓用 ADO.NET 的數據源
  • 文件系統同步服務:用於同步文件和文件夾
  • SSE 同步服務:用於同步簡單共享擴展 (SSE),如 RSS 源和 ATOM 源

開發人員最終能夠使用所提供的所有提供程序,或創建自定義提供程序在設備和應用程序之間交換信息。

本文檔其餘部分旨在幫助您瞭解 Microsoft Sync Framework 如何使用同步構建同步拓撲。我們將列出一些有關同步提供程序的主要概念,它們將幫助您理解如何創建提供程序。有關 Microsoft Sync Framework 的更多詳細信息,請參閱 http://msdn2.microsoft.com/en-us/sync/default.aspx

參與方

在討論特定提供程序組件之前,我們需要首先了解 Microsoft Sync Framework 支持的不同類型的同步參加方。參與方是提供程序及其關聯副本的組合。要同步的副本(即信息倉庫)可以是取自 Web 服務、筆記本電腦、乃至 U 盤中的任何對象。

參與方類型

Microsoft Sync Framework 支持三種類型的參與方:完整、部分和簡單。參與方的類型由其存儲和處理同步元數據的能力定義。至少,我們可以假定如有請求,副本具備編程返回信息的能力。最後需要確定的是副本是否能夠:

  1. 在現有設備上或當前數據存儲中存儲和操作信息,並
  2. 使應用程序(我們稱之爲同步服務)能夠直接在設備上執行

區分將成爲同步生態系統一部分的參與方的類型十分重要,因爲它使我們瞭解到該參與方是否能夠存儲提供程序所需的狀態信息,以及我們是否能夠直接在設備上運行提供程序。最終,參與方模型將成爲通用模型。因此,可以將完整參與方配置爲部分或簡單參與方。

完整參與方

完整參與方是指允許開發人員直接在設備上創建應用程序和新數據存儲的設備。筆記本電腦和智能電話就屬於完整參與方,因爲可以直接從此類設備執行新的應用程序,並且如有必要,您還可以創建新的數據存儲以保存信息。

部分參與方

部分參與方是指能夠在設備上存儲數據的設備。但這些設備無法直接從設備上啓動可執行程序。部分參與方的重要特性在於它能夠存儲同步所需的元數據,並因此得以與任何完整參與方進行同步。部分參與方的一個例子是 U 盤。這些設備類似於硬盤,能夠創建、更新或刪除信息。但通常它們不提供使應用程序能夠直接在設備上運行的接口。

簡單參與方

簡單參與方是指僅具備當接到請求時提供信息這一種能力的設備。此類設備不能存儲或操作新數據,而且不支持創建新的應用程序。簡單參與方依靠完整參與方存儲其元數據(因此只能與特定的完整參與方進行同步)。

由外部組織(如 Amazon 或 EBay)提供的 RSS 源和 Web 服務都屬於簡單參與方。這些組織可能會賦予您執行 Web 服務並取回結果的能力,但不會賦予您在其 Web 服務器上創建您自己的數據存儲或執行您自己應用程序的能力。

綜述

Microsoft Sync Framework 的最終目標是,無論數據源採用哪種參與類型,都允許對它們進行集成。因此,簡單和部分參與方可以與完整參與方同步信息。這至少需要一個能夠存儲信息和啓動同步過程的完整參與方。

Microsoft Synchronization Framework

核心組件

在使用 Microsoft Sync Framework 實現同步之前,我們需要首先了解同步提供程序的關鍵組件。將在本文檔後面的同步示例中進一步說明這些概念。

下圖顯示了提供程序如何與數據源進行通信並從元數據存儲中檢索狀態信息。這些提供程序依次通過同步會話與其他提供程序進行通信。

數據源

數據源是指存儲所有需要同步的信息的位置。數據源可以是關係數據庫、文件系統、Web 服務,甚或一系列業務應用程序中包含的自定義數據源。凡是能夠以編程方式訪問的數據都可以參與同步。

元數據

提供程序的基本特徵在於它能夠存儲有關數據存儲以及該數據存儲中與狀態和更改信息相關的對象的信息。元數據可以存儲在任意位置,無論它是文件、數據庫還是現有的副本數據存儲。爲方便起見,Microsoft Sync Framework 提供一個以 SQL Server Compact Edition 爲基礎的完整元數據存儲實現。該存儲並非必要,但使用它意味着您不必擔心如何存儲同步元數據。

用於數據存儲的元數據可以分爲三個主要組件:

  • 版本: 爲每個同步項目存儲少量信息,稱爲項目版本。該信息記錄了項目在何時何處發生變化,以及與該項目關聯的項目 ID。在數據庫示例中,一個項目可能是表中的整行。一個項目也可能是表中某行的一列。

    當項目發生更改時,存儲的有關該更改的信息將包括創建版本 和更新版本。這些版本包含兩個組件:a 滴答計數 它是一個在整個源範圍內使用以唯一標識一個更改的邏輯時鐘,以及一個副本 ID 它用於唯一標識發生更改的數據存儲。當首次創建項目時,創建版本與更新版本相同。對該項目的後續更新修改的只是更新版本。

    必須至少在項目級別上跟蹤所有的更改。換句話說,每個項目必須具備獨立的版本。   在某些情況中需要更大力度的跟蹤以減少潛在的數據衝突(兩位用戶在不同的副本上更新相同的項目)。這種方法的弊端在於它增加了需要存儲的更改跟蹤信息量。

    兩種主要的版本實現方式是:

    1. 內聯跟蹤:在這種方法中,項目的更改跟蹤信息在做出更改時更新。以數據庫爲例,可能會使用觸發器在更新行之後立即更新更改跟蹤表。
    2. 異步跟蹤:在這種方法中,將運行外部進程來掃描更改。發現的任何更新將添加到版本信息當中。該進程可能是定期執行進程的一部分,或者它可能在同步之前執行。該進程通常用於當沒有內部機制能夠在項目更新時自動更新版本信息的情況中(例如,無法在更新流程中增加版本更新邏輯)。檢查更改的常用方式是存儲項目的狀態,並將存儲的狀態與項目當前狀態進行比較。例如,可檢查從上次同步起,最後寫入時間或文件大小是否發生變化。
  • 知識: 知識是副本能夠感知的數據更改的簡約表述。知識的目的在於使同步更加有效,因爲它有助於限制在副本之間發送的信息量。當版本信息更新時,用於數據存儲的知識也隨之更新。提供程序使用副本知識的目的有:
    1. 枚舉更改:確定另一個副本沒有感知的更改。
    2. 檢測衝突:確定哪項操作是在不瞭解彼此知識的情況下做出的。
  • Tombstones: 每個副本還必須爲每個刪除的項目維護tombstone 信息。如果不跟蹤刪除信息,提供程序將無法告知某個項目(如文件)已被刪除。在這種情況下,提供程序無法將更改版本信息傳播至其他提供程序。Tombstone 必須包含以下信息:
    • 全局 ID: 用於在所有副本中唯一確定 tombstone 項目的副本 ID 和滴答計數。
    • 刪除版本: 與 tombstone 項目關聯的更新版本
    • 創建版本: 最初創建項目時關聯的副本 ID 和滴答計數

    因爲 tombstone 日誌中的信息將隨時間增加,所以有必要創建一個進程定期清理該存儲。清理 tombstone 數據能夠節省空間並且有助於改善同步性能。Microsoft Sync Framework 支持管理 tombstone 信息。

同步流程

發起同步的副本稱爲 而源所連接的副本稱爲目標。本文接下來的部分將介紹下圖所示的同步流程。對於雙向同步,將執行此進程兩次,第二次迭代時會交換源和目標。

目標端發起同步會話

在這一階段將建立同步會話,從而創建了從源到提供程序的鏈接。

目標準備併發送知識

如前所述,每個副本都會存儲其自身的知識。存儲在目標端的知識將傳遞到源。

目標知識用於確定要發送的更改

在源端,會將剛剛收到的知識與本地項目版本進行比較,以確定目標端尚不瞭解的項目。值得注意的是,發送的版本並不是實際的項目,而是每個項目上次發生更改的位置摘要。

更改版本和發往目標端的源知識

當源準備好所需的更改版本列表之後,這些版本將傳輸到目標端

檢索更改項目的本地版本並與源版本和知識進行比較

目標端使用這些版本準備源需要發送的項目列表。目標還使用該信息檢測是否存在限制衝突。限制衝突是指違反了項目限制,如文件夾關係或文件系統中同名數據的位置。

檢測並解決或推遲衝突

基本上,如果在兩次同步期間對兩個副本上的相同項目進行更改就會發生衝突。在 Microsoft Sync Framework 運行時中,當其中一個副本的更改版本不包含另一個副本更改的知識時便會檢測到衝突。   將在下面的“衝突示例”部分中介紹了說明該檢測過程如何工作的更加詳細的示例。

副本可以自由實施各種策略,解決同步拓撲間發生衝突的項目。下面列舉了一些常用的衝突解決策略:

  • 源獲勝: 當檢測到衝突時,總是採用源副本所做的更改。
  • 目標獲勝: 總是採用目標副本所做的更改。
  • 合併: 將源副本和目標副本所做的更改合併在一起。庫存統計可能是一個您希望將兩個副本的值合併(求和),而不是選取其中一個作爲正確值的例子。
  • 記錄衝突: 記錄或推遲衝突。

目標向源請求項目數據

在這一階段,目標已經確定需要在源中檢索的項目,並將請求發送到源。

源準備併發送項目數據

源接收到項目數據請求,並準備要傳輸到目標的實際數據。如果要跟蹤的項目是數據庫中的一行,則將發送該行。如果項目是文件夾中的文件,則將傳送該文件。

項目應用到目標中

目標接收並應用項目。如果在此過程中出現任何錯誤(如網絡斷開),則該項目將被標記爲異常,並在下次同步期間進行更正。從源接收的知識將添加到目標知識。

同步示例

通過使用前面介紹的同步流程,我們將實際操作一次文件同步示例,該示例將說明 Microsoft Sync Framework 如何枚舉更改並最終應用項目數據。在本例中有兩個副本:副本 A 和副本 B。副本 A 啓動與副本 B 的同步(即副本 A 是源而副本 B 是目標)。假定我們希望同步兩個副本間的文件。要跟蹤的項目是文件夾中的一個文件,表示爲 In (例如,I1, I2, I3…)。創建新文件時 (I1) 與該文件相關聯的元數據應更新如下:


項目
更新
滴答計數
更新
副本 ID
創建
滴答計數
創建
副本 ID
I1 1 A 1 A

如果文件再次更新,版本表應如下所示:


項目
更新
滴答計數
更新
副本 ID
創建
滴答計數
創建
副本 ID
I1 5 A 1 A

在上述示例中,更新滴答計數設置爲 5,這是由於用於滴答計數的邏輯時鐘在整個源內發揮作用,即:滴答計數 2-4 已用於副本中其他項目的更改。

例如,在下面的圖例中,跟蹤的副本中有兩個附加的項目 I2 和 I3 。您可以看到,隨着創建更多的項目,版本信息將變得越來越多。Microsoft Sync Framework 不要求存儲以前的更新版本。它只需要瞭解最新的更新版本。


項目
更新
滴答計數
更新
副本 ID
創建
滴答計數
創建
副本 ID
I2 3 A 2 A
I3 4 A 4 A
I1 5 A 1 A

如果採用該副本的當前項目狀態,我們可以把副本 A 的知識表示爲:

副本 A 知識 = A5

如前所述,知識是副本能夠感知的數據更改的簡約表述。在本例中,A 是分配給該副本的唯一 ID,而 5 是當前滴答計數,它使副本能夠了解當前的最大變化個數。如果該副本已經與任意其他副本進行同步,則我們還將在該列表中看到這一知識。

在副本 B 上可能也有很多文件。該副本如下所示:

副本 B


項目
更新
滴答計數
更新
副本 ID
創建
滴答計數
創建
副本 ID
I104 2 B 1 B
I105 4 B 3 B

副本 B 的當前知識爲:

副本 B 知識 = B4

此時我們選擇開始在兩個副本之間進行同步。副本 A 將成爲源(啓動同步的副本),副本 B 將成爲目標。

同步過程中,目標向源發送其知識。如前所述,兩個副本的知識如下:

副本 A 知識 = A5

副本 B 知識 = B4

源(副本 A)收到該知識並使用它來確定將哪個版本發送到目標。由於副本 B 不瞭解在副本 A 中的任何項目,所以它將發送所有內容。在本例中,副本 A 將包含以下版本。

副本 A 的更改批次


項目
更新
滴答計數
更新
副本 ID
創建
滴答計數
創建
副本 ID
I2 3 A 2 A
I3 4 A 4 A
I1 5 A 1 A

目標接收這些版本並對其進行枚舉以確定需要從源請求哪些項目。它還使用該信息確定是否存在任何衝突(例如,在兩個副本上更新了相同的文件)。

完成後,目標請求源發送它沒有感知的項目。在本例中,副本 A 將發送與 I1、 I2 和  I3。

目標收到這些文件並將其添加到自己的文件夾中。副本 B 的項目現在將包含從副本 A 接收到的項目。

副本 B – 已更新項目表


項目
更新
滴答計數
更新
副本 ID
創建
滴答計數
創建
副本 ID
I104 2 B 1 B
I105 4 B 3 B
I2 3 A 2 A
I3 4 A 4 A
I1 5 A 1 A

本次同步結束後,該過程將再執行一遍,這次源將成爲目標而目標成爲源。這使得副本 A 能夠接收到在副本 B 上創建或更改的任何文件(I104 和  I105)。

同步完成後,兩個副本上都應包含以下更新知識。

副本 A 知識 = A5, B4

副本 B 知識 = A5, B4

衝突示例

繼續前面的示例,兩個副本現在已經“同步”,並且每個項目標版本如下:


項目
更新
滴答計數
更新
副本 ID
創建
滴答計數
創建
副本 ID
I104 2 B 1 B
I105 4 B 3 B
I2 3 A 2 A
I3 4 A 4 A
I1 5 A 1 A

類似地,兩個副本的知識如下:

副本 A 知識 = A5, B4

副本 B 知識 = A5, B4

此時,兩個副本都決定更新相同的文件(項目 I4)。

在副本 A 上,該項目標版本表更新爲:


項目
更新
滴答計數
更新
副本 ID
創建
滴答計數
創建
副本 ID
I104 2 B 1 B
I105 4 B 3 B
I2 6 A 2 A
I3 4 A 4 A
I1 5 A 1 A

在副本 B 上,該項目標版本表更新爲:


項目
更新
滴答計數
更新
副本 ID
創建
滴答計數
創建
副本 ID
I104 2 B 1 B
I105 4 B 3 B
I2 5 B 2 A
I3 4 A 4 A
I1 5 A 1 A

兩個副本的知識也更新爲:

副本 A 知識 = A6, B4

副本 B 知識 = A5, B5

此時,副本 A 啓動與副本 B 的同步。跳過源向目標發送項目版本和知識這一步,爲項目 I2 執行下列步驟。

  1. 副本 B 看到項目 I2 新更改,其爲:
    更新
    滴答計數
    更新
    副本 ID
    6 A
  2. 副本 B 查看從副本 A 收到的知識(A6、B4)並確定副本 A 不瞭解由副本 B 對相同項目所做的更改:
    更新
    滴答計數
    更新
    副本 ID
    5 B
  3. 將檢測到衝突並傳給應用程序或提供程序進行處理。

如前所述,應用程序能夠選擇如何處理衝突或延後處理。如果衝突延後處理,則在其解決之前它將在每次同步時重複出現。一旦衝突得到解決,則下一次同步時,原始副本將接收更新後的值。

總結

Microsoft Sync Framework 通過預創建提供程序或編寫新的自定義提供程序,包含將應用程序集成到離線或基於協作網絡所需的所有組件。無論採用的是哪種網絡或設備類型,提供程序均使任何數據源能夠參與數據同步。

在本文檔中,我們已經討論了 Microsoft Sync Framework 包含的主要組件。我們可以在文檔中看到許多示例,這些示例說明了如何在 Microsoft Sync Framework 中使用知識以有效解決數據存儲間交換信息的問題。最後,我們看到 Microsoft Sync Framework 啓用了衝突檢測,並且允許應用程序或提供程序通過各種機制有效解決衝突。

通過使用該框架,我們構建了一種同步基礎,它能夠擴展到任何設備上使用任何網絡拓撲的任何數據存儲。我們可以輕鬆地集成完全不同的數據源以形成對等網絡,甚至在不可能進行構架更改的位置存儲數據。

最終,Microsoft Sync Framework 爲同步提供了一個高度嵌入式且可擴展的平臺。

要了解更多信息或獲取 Microsoft Sync Framework CTP1 SDK 副本,請訪問 http://msdn2.microsoft.com/en-us/sync/default.aspx

  • 作者:梁一鳴
  • 出處:http:// liangyiming.cnblogs.com
  • 本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出作者名稱及原文連接,否則保留追究法律責任的權利。

  

  • 作者:梁一鳴
  • 出處:http://liangyiming.cnblogs.com
  • 本文版權歸作者梁一鳴與博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出作者名稱及原文連接,否則保留追究法律責任的權利。
  • 發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章