首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Microsoft Sync Framework 實戰:打造離線同步解決方案的完整指南

     編輯:關於.NET

在行動裝置、分散式系統與邊緣運算普及的今天,資料同步已成為企業級應用的核心需求。Microsoft Sync Framework 提供協議無關、存儲無關的同步平台,支援資料庫、檔案系統、Feed 等多種資料源。本文從核心架構切入,手把手教你建立自訂同步提供者,實現雙向、增量、衝突可控的資料同步。

Sync Framework 核心架構

框架由四大組件構成:

  • 執行階段:同步引擎,協調同步會話、衝突解決、變更應用。
  • 中繼資料服務:儲存版本、錨點、變更追蹤資訊,支援斷點續傳。
  • 同步提供者:資料源適配器,每個副本對應一個提供者,負責枚舉變更、應用變更。
  • 參與者:裝置角色分級——完整參與者(PC、筆電)、部分參與者(USB、手機)、簡單參與者(RSS、Web Service)。

內建提供者快速上手:檔案系統同步

以 WPF 應用同步兩個資料夾為例,核心步驟如下:

  1. 引用 Microsoft.Synchronization、Microsoft.Synchronization.Files 組件。
  2. 用 FileSyncProvider 封裝來源/目標資料夾,指定唯一 ReplicaId(GUID)並持久化避免重複生成。
  3. 建立 SyncOrchestrator,設定 LocalProvider/RemoteProvider 與 Direction(雙向/單向)。
  4. 呼叫 Synchronize() 執行同步,透過 SyncOperationStatistics 獲取統計資訊。
var sourceProvider = new FileSyncProvider(sourceReplicaId, sourcePath);
var destProvider = new FileSyncProvider(destReplicaId, destPath);
var orchestrator = new SyncOrchestrator {
    LocalProvider = sourceProvider,
    RemoteProvider = destProvider,
    Direction = SyncDirectionOrder.DownloadAndUpload
};
var stats = orchestrator.Synchronize();
Console.WriteLine($"上傳: {stats.UploadChangesApplied}, 下載: {stats.DownloadChangesApplied}");

進階控制:篩選、預覽與衝突處理

靜態篩選

使用 FileSyncScopeFilter 排除特定檔案:

var filter = new FileSyncScopeFilter();
filter.FileNameExcludes.Add("*.tmp");
filter.FileNameExcludes.Add("Thumbs.db");
var provider = new FileSyncProvider(replicaId, path, filter, FileSyncOptions.None);

動態跳過與預覽模式

訂閱 ApplyingChange 事件,在 AppliedChangeEventArgs 中設定 SkipChange = true 可跳過單筆變更。啟用 PreviewMode 可先掃描變更清單再決定是否執行。

衝突解決策略

ConflictResolutionPolicy 提供四種模式:

  • SourceWins:來源資料覆蓋目標
  • DestinationWins:保留目標資料
  • Merge:嘗試合併(需資料結構支援)
  • Log:記錄衝突供人工介入

自訂同步提供者:對接任意資料源

當內建提供者無法滿足需求(如專有資料庫、REST API、NoSQL),繼承 KnowledgeSyncProvider 並實作 IChangeDataRetriever、INotifyingChangeApplierTarget 即可。核心流程:

  1. BeginSession:初始化連線、載入中繼資料。
  2. GetSyncBatchParameters:目標端回傳知識與批次大小。
  3. GetChangeBatch:來源端根據目標知識產生變更批次。
  4. ProcessChangeBatch:目標端應用變更、偵測衝突。
  5. SaveItemChange / StoreKnowledgeForScope:持久化資料與知識。
  6. EndSession:釋放資源。

範例:同步三個 SQL Server 資料庫的 Student 表。自訂提供者內部使用 ADO.NET 執行 CRUD,利用 SyncKnowledge 追蹤版本,實現多主同步。

實戰避坑指南

  • 中繼資料儲存:預設存在同目錄 filesync.metadata,生產環境建議集中存放資料庫,避免檔案鎖定與備份困擾。
  • 時鐘漂移:副本間時間不同步會導致錨點錯誤,務必用 UTC 時間並啟用 NTP。
  • 大量資料初始同步:分批次、啟用壓縮、考慮種子同步(離線複製資料庫再建立中繼資料)。
  • 記憶體洩漏:FileSyncProvider 實作 IDisposable,同步結束必須 Dispose() 釋放非託管資源。

總結

Sync Framework 以可擴展的提供者模型,統一了異構資料源的同步邏輯。掌握其核心協調流程與自訂提供者開發,即可為離線優先、多端協作、邊緣計算等場景構建可靠的同步骨幹。下一步可探索 SqlSyncProvider 的資料庫同步進階功能,或整合至 ASP.NET Core 微服務中實現跨區域資料最終一致性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved