本文章是由機器翻譯。

同步處理設定

管理您的資料,有效使用: Microsoft 的同步處理架構

James Yip

本文將告訴您:

  • Microsoft 的同步處理架構
  • 同步處理服務
  • 中繼資料儲存
  • 結構描述的同步處理
本文將使用下列技術:
ADO.NET,Microsoft 同步 Framework,SQL Server

內容

使用案例
之後,Microsoft 的同步處理架構
同步處理提供者
同步處理 Framework 中的中繼資料儲存區服務
執行同步處理服務
同步處理資料和結構描述
實作自訂同步處理
向上換行

永遠不會一般工作的 同步處理不同的資料存放區之間的資料。撰寫您自己的邏輯,執行同步處理是費時而且成本的程序。但就位其組成的 API 與 Microsoft 的同步處理 Framework,建立同步處理邏輯變得更簡單。Microsoft 同步 Framework 可協助您從任何的網路上使用任何通訊協定的任何資料存放區的應用程式資料整合。

以及與 Microsoft 的 [同步] Framework 中,Microsoft 會發行 Microsoft Services For ADO.NET 的同步處理、 同步處理檔案的系統服務及都讓開發人員為不同於 Microsoft 同步 Framework 是建置您的應用程式內的同步處理邏輯在特定環境中執行同步處理 FeedSync,同步處理服務。

這些同步處理服務將提供您,一組工具,協助您同步處理兩個資料庫來源之間的資料、 之間電腦,同步處理檔案和與的 RSS 或 ATOM 摘要,同步處理您的應用程式。您可以這些服務的協助,專注於您的工作,在您的應用程式邏輯上的和較少的資料同步處理。

使用案例

Microsoft 同步 Framework 在很有用一些案例。讓我們來看看一些常見的。

下載只同步處理在這種情況下,用戶端電腦將無法決定要儲存和如何追蹤的儲存資料的權限。範例,這是 RSS 同步處理。RSS 提供者會決定如何的資訊是可用,以及頻率它取得更新。用戶端會決定哪些內容會提供和時間。

離線資料存取通常,您要讓某些 Windows 應用程式離線資料存取,以便在應用程式可以繼續正常執行,如果使用者沒有連線到網路。範例是一個的庫存應用程式。您希望您遠端的銷售人員能夠在其筆記型電腦 」 及 「 然後稍後同步處理,與您的資料庫中輸入銷售資料。

您將會發出以增加用戶端上的效能資料庫的本機複本至等式資料有時候共同作業。時數個浮點解決這種本機複本,您會要適當地更新您的後端資料存放庫,因此,所有的變更會納入的。一個典型的範例,這是一個銷售點的 (POS) 應用程式。為銷售發生,POS 應用程式每個儲存區中的會記錄銷售交易,並更新儲存區的清單。這些更新程式必須被反映在兩個中央資料存放區中及的其他商店使用,讓在每個商店 salespersons 手邊知道清單的狀態資料庫的所有在本機複本中。

這些資料存取的案例代表 Microsoft 的同步架構最常見的用法。我們現在看看這些離線資料如何運作解決存取問題。

之後,Microsoft 的同步處理架構

在 Microsoft 同步處理] Framework 會使用工作階段,來執行資料同步處理。在的工作階段內,您定義在資料的變更產生,] 和 [將變更複寫到目的地。觸發同步處理時,由用戶端,會發生下列事件:

  1. 建立同步處理工作階段。
  2. 同步處理) 架構會檢查目的資料,以查看是否有任何認可,因為本機複本已下載的其他來源的變更。
  3. 找不到任何變更會傳送回來源將它們套用。
  4. 目的地會再要求來源到目的儲存區傳送其變更。
  5. 在的變更將會傳送來源,並它們會套用至目的地資料存放區。

為了這個工作,來源和目的需要維護一些中繼資料,讓它們可以識別已發生同步處理之間的變更。有很多的方法這,每個依我們同步處理的資料的類型而定。

根據應用程式和您嘗試要實作的同步處理類型,您可能不需要實作自訂的變更追蹤,因為某些資料不包含追蹤變更的方式。但某些資料,儲存在檔案系統,中的檔案已經包含建立及更新中繼資料。Microsoft 同步 Framework 支援同時單向的同步處理] 和 [雙向同步處理。雙向同步處理實際上會實作為來源與目的地之間的兩個單向同步處理中。

Microsoft 同步 Framework 會使用 SyncOrchestrator 類別來管理兩個資料來源之間的資料流程。您不必擴充這個類別,以任何方式,除非您想要在同步處理工作階段期間中加入自訂的應用程式邏輯。

同步處理的方向由 SyncOrchestrator 類別的 [方向] 屬性的控制。您可以選擇是否用於特定的 SyncOrchestrator 執行個體執行的上載或下載或同時同步處理。

提供者用來與來源和目的端資料存放區進行通訊。您必須告訴的 SyncOrchestrator 您觸發同步處理之前,會使用的提供者。一旦您執行觸發它,SyncOrchestrator 會呼叫方法,在提供者擷取變更以及儲存,解決衝突。[圖 1 ] 說明如何同步處理。

[圖 1 : SyncOrchestrator 物件

同步處理提供者

Microsoft 同步 Framework 會使用提供者,與來源及目的地進行通訊。提供者是負責與用來儲存應用程式資料,方式與相關聯的資料存放區相容的資料來源通訊。它負責也偵測變更,根據另一端的同步處理工作階段所提供的資訊,以套用變更接收,以及從資料來源中擷取變更。

開發一個提供者,可以要求大量時間和精力。若要實作同步處理提供者,您要實作 KnowledgeSyncProvider 抽象類別 (Abstract Class)、 IChangeDataRetriever 介面和 INotifyingChangeApplierTarget 介面。在這些類別和介面中,有許多事件實作邏輯偵測變更並將其套用的。

如果沒有用戶端應用程式與中央的資料存放區之間的直接連線,您可以實作 Proxy 提供者。Proxy 提供者會接收命令,並在同步處理工作階段轉送到其他提供者的這些命令。

Proxy 提供者可用於使用案例,例如當用戶端應用程式與通訊中央的資料存放區在網際網路上的。在這種情況下您可能讓用戶端 Proxy,以透過 HTTPS 與交談,然後與 SQL Server 的 Proxy。此設定會有助於以減少內部伺服器曝露在網際網路,但仍可讓外部使用者使用同步處理的架構同步處理資料。

您在相同的方式您實作的任何其他提供者中實作 Proxy 提供者]。在唯一的兩個差異,在於直接用戶端應用程式,但另一個提供者不會觸發 Proxy 提供者。

同步處理 Framework 中的中繼資料儲存區服務

在某些資料來源中,您無法儲存其他資訊,或實作的變更追蹤任何類型。一個例如,Windows 檔案系統時。在這種情況下,Microsoft 同步 Framework 提供一個解決方案其中的開發人員建置中繼資料儲存機制,.同步 Framework 提供了輕量型的資料存放區稱為中繼資料儲存區服務。

存放區中繼資料儲存區服務可以在您建立將包含您,資料、 複本的層級資料和項目層級的資料的兩個型別。它們用來儲存有關特定目的地 (複本) 和項目的資訊。每個目的都需要唯一識別目的地為複本識別碼。

ReplicaMetadata 」、 「 ItemMetadata 和 「 MetadataStore 都是抽象類別,表示複本中繼資料、 項目中繼資料中和中繼資料存放區。您可以使用協助,這些類別的中繼的資料。

SqlMetadataStore 會是隨附於 Microsoft 同步 Framework,以協助管理複本層級的中繼資料的開發人員的中繼資料儲存服務,具象實作。不幸的是,Microsoft 同步 Framework 並不實作項目層級上中繼資料的支援。而,您要建立您自己的實作 ItemMetadata 類別的並建立 MetadataStore 物件,如果要儲存項目層級中繼資料。SqlMetadataStore 會使用 SQL Server,來儲存中繼資料,在您定義的檔案中。

若要使用 SqlMetadataStore,您開啟已儲存的存放區使用 OpenStore 方法或是建立一個新使用 CreateStore 方法。通常,一個儲存區不足,一個應用程式。但是,如果您喜歡您也可以維護多個儲存區。若要從存放區擷取中繼資料中,,您將會使用 GetReplicaMetadata 方法。

以下顯示如何從一個 SqlMetadataStore 擷取的項目:

SyncIdFormatGroup idFormat=new SyncIdFormatGroup();
SyncId syncId=new SyncId(1);
SqlMetadataStore metadataStore=SqlMetadataStore.OpenStore(filePath);
ReplicaMetadata item= metadataStore.GetReplicaMetadata(idFormat,syncId);

當使用 SqlMetadataStore,您需要指定的資料會儲存您的結構描述。 您可以藉由呼叫的 SqlMetadataStore InitializeReplicaMetadata 方法來完成,這個動作。 這個方法會建立並填入資料表,將資訊保留在基礎的 SQL 資料庫。 例如,以下顯示如何填入的中繼資料存放區與一個欄位:

SyncIdFormatGroup idFormat=new SyncIdFormatGroup();
SyncId syncId=new SyncId(1);
FieldSchema[] fields=new FieldSchema[1];
IndexSchema[] indexes=new IndexSchema[1];
fields[0]=new FieldSchema("LastSync",typeof(string));
indexes[0]=new IndexSchema("LastSync",false);
SqlMetadataStore metadataStore=SqlMetadataStore.CreateStore(filePath);
ReplicaMetadata item= metadataStore.InitializeReplicaMetadata(  idFormat,syncId, fields,indexes );

執行同步處理服務

現在,讓我們看看如何您可以將同步處理支援加入至使用 ADO.同步服務 For NET 應用程式。 SQL Server 的協助 Compact Edition 3.5,您可以在本機檔案系統中建立輕量型的資料存放區]。 有關 SQL Server Compact Edition 好事會是它像 SQL Server 運作,但在儲存機制不需要修改應用程式,使用本機資料存放區中使用檔案。

ADO.同步處理服務 For NET 支援資料和結構描述,包括 SQL Server Compact Edition 資料庫的 SQL Server 資料庫之間的同步處理。 這裡,我將示範如何啟用透過複本保存在 SQL Server Compact Edition 資料庫的離線存取使用中央 SQL Server 資料庫的應用程式。

在第一個要實作同步處理服務對 ADO.NET 時就是決定如何追蹤變更,在您的資料。 在同步處理服務對 ADO.NET,您可以利用 SQL Server 2008 的整合式的變更追蹤,或者可以藉由管理變更追蹤您自己應用程式資料庫中使用自訂的追蹤]。

在 SQL Server 2008,請已啟用整合式的變更追蹤的資料表會記錄變更追蹤記錄檔的資料表的每個資料變更,並同步處理服務將會查看來識別所有的變更,自上次同步處理這個記錄檔]。 這可防止開發人員無需變更現有的應用程式的資料庫結構描述。

但是有時候,為大小寫的應用程式使用 SQL Server 2005,整合式的變更追蹤可能會無法使用。 在這種情況下,您應該考慮使用自訂的變更追蹤。 自訂變更的追蹤方法會識別插入和更新資料表中的記錄的資料行的協助,並識別的協助標記資料表的刪除動作。 為了識別資料列已經更新或插入自上次更新後的同步處理服務必須將加入四個資料行-更新原始寄件者、 如何更新時間、 如何建立發行者,及如何更新時間 — 到每個您要追蹤的資料表。 您也需要建立一個稱為保存的所有資料列會移除記錄檔將標記資料表的資料表。 在的資料表中,您需要至少兩項資訊: 刪除和資料列的原始主索引鍵的時間。

在標記資料表是其中的同步處理服務發現必須從目的儲存區移除,因為從來源移除的項目的。 所有的資訊可協助識別自上次同步處理的變更同步處理服務。

同步處理資料和結構描述

實作資料庫之間的同步處理,保持一致的結構描述會成為大部分的應用程式的問題。 ADO.因此,同步處理服務 For NET 也支援同步處理資料庫結構描述。 雖然有是限制。 同步處理服務將會建立資料表在用戶端資料庫只有第一個時間,它會執行同步,除非開發人員將它重新建立,每次進行同步處理設定中。

若要將您的提供者使用 ADO.同步服務 For NET 您要實作提供者設定進行同步處理的資料表中的程式碼和您要執行同步處理的方向。 您可以選擇進行同步處理從來源資料的目的地,從目的地的來源,或兩者中。 您可以將程式碼來同步處理設定,提供者類別的建構函式。 您也可以分隔到群組資料表,這樣您就可以有進一步進行同步處理個別資料表的細部控制。

與的目的地大部分時間不會真的需要明確設定提供者因為 ADO.同步服務 For NET 會自動建立適當的結構描述,並載入資料。 您只需要指定目的地資料庫的位置。 ADO.同步服務 For NET 隨附兩個提供者: 其中一個設計用於與 SQL Server,並在其中一個設計來使用 SQL Server Compact Edition。 只有真正的差異是用來與資料庫引擎進行通訊的基礎程式庫,; SQL Server 提供者會使用 System.Data.SqlClient,而 SQL Server Compact Edition 提供者使用 System.Data.SqlCeClient。

SqlCeClientSyncProvider 一個專為 SQL Server Compact Edition 時,與 SQL Server 通訊所使用的提供者會呼叫 DbServerSyncProvider。 您會在初始化提供者時,您將需要 SyncAdapter 物件,其中包含有關如何提供者會與基礎的 SQL Server 資料庫和通訊有關變更追蹤,詳細資料,哪些資料行並個時 [變更原始寄件者] 欄使用自訂的 SQL 變更是否追蹤資訊。 另一個重要的 SyncAdapter 中所定義是資訊的同步處理的方向。 ADO.同步服務 For NET 可以讓開發人員針對每個資料表定義同步處理的方向。 ADO.同步服務 For NET 來自可協助您藉由提供資訊,例如資料表名稱,Updater 資料行的名稱,建立必要的 SyncAdapter 物件和 SQL 陳述式的一個 SyncAdapterBuilder 建立原始寄件者的資料行,等等。 [圖 2 ] 說明如何配接器產生器可協助您建立一個 SyncAdapter。

[圖 2 SyncAdapterBuilder

sqlSABuilder = new Microsoft.Synchronization.Data.Server.SqlSyncAdapterBuilder(sqlconn);
sqlSABuilder.TableName = "User";
sqlSABuilder.FilterClause = "username='" +   System.Threading.Thread.CurrentPrincipal.Identity.Name + "' ";
sqlSABuilder.TombstoneTableName = "Deleted_"+ sqlSABuilder.TableName;
sqlSABuilder.SyncDirection =   Microsoft.Synchronization.Data.SyncDirection.Bidirectional;
sqlSABuilder.CreationTrackingColumn = "ct";
sqlSABuilder.UpdateTrackingColumn = "ut";
sqlSABuilder.DeletionTrackingColumn = "dt";
sqlSA = sqlSABuilder.ToSyncAdapter(true, true, true, true);
sqlSA.TableName = "User";
destinationProvider.SyncAdapters.Add(sqlSA);

有說,大部分時間我們只需要加入的填入 SyncAdapters 來源提供者上的邏輯。 您將只需要同時如果您正在進行雙向同步處理。

若要設定資料庫同步處理,建立 [,SyncAgent] 物件,類似於我先前所述,但為了執行同步處理 ADO.同步服務 For NET SyncOrchestrator 物件的執行個體]。 RemoteProvider] 和 [LocalProvider 物件的屬性,然後指派提供者。 接下來,呼叫 SyncAgent 觸發同步處理的程序,並呼叫個別的事件和提供者所實作的方法,同步處理方法。 下列說明如何設定 SyncAgent 中,並啟動同步處理。

SyncAgent syncAgent=new SyncAgent();
syncAgent.LocalProvider = new SqlCeClientSyncProvider ();
syncAgent.RemoteProvider = new DbServerSyncProvider();
syncAgent.Synchronize();

要注意有關 ADO.同步服務 For NET 的一個點是可以使用它與幾乎任何資料來源,因此您不限於與來源及 / 或目的地資料庫的 SQL Server 支援在 ADO.NET。

ADO.同步服務 For NET 會使用 SyncTable 物件來儲存資料表參與同步處理的相關資訊。 下列程式碼將示範您,如何在 SyncTable 物件中填入 (Populate),並將它與 SyncAgent 中設定。 您可以使用以彙總 SyncTables SyncGroup 類別,到 ADO.NET 將整個處理,確保群組中的所有資料表的一致性同步處理群組。

SyncGroup lookupSyncGroup=new SyncGroup("LookupTables");
SyncTable syncTable = new SyncTable("Customer");
syncTable.CreationOption = syncTable.DropExistingOrCreateNewTable;
syncTable.SyncDirection = syncTable.Bidirectional;
syncTable.SyncGroup = lookupSyncGroup;
syncAgent.Configuration.SyncTables.Add(syncTable);

實作自訂同步處理

如果您要實作使用您自己的邏輯的同步處理],或想要實作 Microsoft 同步 Framework 不支援的資料存放區的同步處理嗎? 在這種情況下您要建立您自己所提供的者,並實作從基礎資料存放區中擷取資料的邏輯。

要執行這項操作,建立衍生自抽象類別 (Abstract Class) KnowledgeSyncProvider 一個類別,並覆寫 GetChangeBatch 方法以擷取變更]。 這個方法會在您初始化同步處理程序時,觸發 SyncOrchestrator 物件。 所有偵測到變更儲存在呼叫其傳遞至目的地的提供者,ProcessChangeBatch 方法的 ChangeBatch 的物件。 目的提供者將處理 ChangeBatch 物件,並使用自己的邏輯,以套用變更至目的地資料存放區中。

FilterInfo 物件用來傳達篩選來源和目的地的提供者之間的資訊。 來源提供者是負責填入這個物件,並附加至 ChangeBatch 物件。 目的提供者可以再使用它來套用變更至的資料的適當子集。 一旦實作自訂的提供者後您可以使用它與 SyncOrchestrator。 請記住,但是,因此如果您想要有多個執行不同的執行緒的同步處理,請使用複製的提供者在新的執行緒中您需要同步處理提供者不執行緒安全的。 要執行這項操作,請建立一個新的提供者物件,並合併它與現有使用聯集的方法。 然後,設定為使用新建立提供者,而非原始的 SyncOrchestrator。 否則,同步處理會失敗,如果有多個與該提供者相關聯的執行同步處理工作階段。

在應用程式中實作同步處理邏輯時,永遠有問題解決衝突。 Microsoft 同步 Framework 會判斷項目使用下列邏輯上是否有衝突。

  1. 1.the 目的地的提供者會判斷來源複本的知識庫 」 中的是否要包含的項目的目的地複本的版本資訊。
  2. 目的地複本的版本不包含在原始複本的知識庫] 中,2.If 物件稱為有衝突。

如果目的地的版本資訊不會包含在項目本身,.同步 Framework 就會觸發 TryGetDestinationVersion 事件之類別的實作 INotifyingChangeApplierTarget) 介面,為每個項目。 就可以在這個事件同步 Framework,協助您發生衝突的解決方案中提供版本控制的資訊中新增邏輯。

public bool TryGetDestinationVersion(ItemChange sourceChange, out   ItemChange destinationVersion)
 {
    ...
 }

根據預設,Microsoft 同步 Framework 可支援解決一些簡單的衝突。 您可以設定提供者的衝突解析原則,並.同步 Framework 將會為您執行衝突解決]。 預設的情況下,.同步 Framework 會支援衝突解析原則的下列五個型別。

  • 原始遊戲獲勝次數: 原始複本一定會贏如果有衝突。
  • 目的地獲勝: 目的地複本會永遠贏如果有衝突。
  • 合併: 從來源及目的地變更合併以形成新版本,要套用然後傳送至目的地項目。
  • 記錄檔: 衝突會被忽略,並衝突的項目資訊傳送 SaveConflict INotifyingChangeApplierTarget 的實作類別的事件。
  • 延後: 完全忽略的衝突,並目的儲存區將不會收到有關衝突資訊]。

這些衝突解決方案的原則都適用在項目層級,但只會將來源獲勝,而且目的地獲勝會套用至工作階段]。 同步處理原則是由 ConflictResolutionPolicy 屬性設定為提供者指定的。

destinationProvider.Configuration.ConflictResolutionPolicy =   ConflictResolutionPolicy.DestinationWins;

您可以設定提供者以報告同步處理,而非使用預設的組態的進度。預設的情況下,提供者會藉由呼叫 SyncCallback 物件相關聯的 ProgressChanged 事件回報進度。您可以藉由實作您自己的進度報告,以變更此行為。要執行這項操作,您需要實作在使用 ItemChange 類別的 WorkEstimate 事件項目層級,或使用 BatchWorkEstimate ChangeBatch 類別的事件批次層級的事件。然後在您的提供者程式碼中,您可以呼叫 OnProgressChanged 方法適當,每當您認為報告變更提供者。

向上換行

.Microsoft] 下同步式 Framework 會是設計來協助建置到應用程式的同步處理的架構的應用程式程式設計。架構本身會包含許多功能及程式庫,簡化開發工作,建立不同的資料來源之間的同步處理的時, 它不會真的執行同步處理: 它會仰賴開發人員提供了可以偵測並套用變更及解決衝突的邏輯。

同步處理服務會是一套串建立說明的一些常用的資料之間的同步處理將儲存,為 SQL Server、 檔案系統和 RSS 的位址的程式庫。與同步處理服務,請您不需要花時間進行同步處理邏輯的開發,; 您只需要調整應用程式的程式庫]。結果是快速,簡單的同步處理。透過調整 Microsoft 同步 Framework,您可以輕鬆地將離線資料存取和共同作業的支援,您自己的應用程式。

James Yip MCT、 MCITP、 MCPD PMP,是 Eventus 限制,在香港 Kong–based 技術顧問公司的管理顧問。詹姆士運作,架構設計人員和專案管理員。他也在兩個 Windows Server 系統管理和.NET 程式開發教授 MOC 類別,並的 SME 及 TR 適用 MOC 課程和作者課程軟體。