Microsoft Sync 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 Synchronization Framework核心组件:
在使用 Microsoft Sync Framework 实现同步之前,我们需要首先了解同步提供程序的关键组件。将在本文档后面的同步示例中进一步说明这些概念。
下图显示了提供程序如何与数据源进行通信并从元数据存储中检索状态信息。这些提供程序依次通过同步会话与其他提供程序进行通信。
数据源
数据源是指存储所有需要同步的信息的位置。数据源可以是关系数据库、文件系统、Web 服务,甚或一系列业务应用程序中包含的自定义数据源。凡是能够以编程方式访问的数据都可以参与同步。
元数据
提供程序的基本特征在于它能够存储有关数据存储以及该数据存储中与状态和更改信息相关的对象的信息。元数据可以存储在任意位置,无论它是文件、数据库还是现有的副本数据存储。为方便起见,Microsoft Sync Framework 提供一个以 SQL Server Compact Edition 为基础的完整元数据存储实现。该存储并非必要,但使用它意味着您不必担心如何存储同步元数据。
用于数据存储的元数据可以分为三个主要组件:
版本: 为每个同步项目存储少量信息,称为项目版本。该信息记录了项目在何时何处发生变化,以及与该项目关联的项目 ID。在数据库示例中,一个项目可能是表中的整行。一个项目也可能是表中某行的一列。
当项目发生更改时,存储的有关该更改的信息将包括创建版本 和更新版本。这些版本包含两个组件:a 滴答计数 它是一个在整个源范围内使用以唯一标识一个更改的逻辑时钟,以及一个副本 ID 它用于唯一标识发生更改的数据存储。当首次创建项目时,创建版本与更新版本相同。对该项目的后续更新修改的只是更新版本。
必须至少在项目级别上跟踪所有的更改。换句话说,每个项目必须具备独立的版本。 在某些情况中需要更大力度的跟踪以减少潜在的数据冲突(两位用户在不同的副本上更新相同的项目)。这种方法的弊端在于它增加了需要存储的更改跟踪信息量。
两种主要的版本实现方式是:
内联跟踪:在这种方法中,项目的更改跟踪信息在做出更改时更新。以数据库为例,可能会使用触发器在更新行之后立即更新更改跟踪表。
异步跟踪:在这种方法中,将运行外部进程来扫描更改。发现的任何更新将添加到版本信息当中。该进程可能是定期执行进程的一部分,或者它可能在同步之前执行。该进程通常用于当没有内部机制能够在项目更新时自动更新版本信息的情况中(例如,无法在更新流程中增加版本更新逻辑)。检查更改的常用方式是存储项目的状态,并将存储的状态与项目当前状态进行比较。例如,可检查从上次同步起,最后写入时间或文件大小是否发生变化。
知识: 知识是副本能够感知的数据更改的简约表述。知识的目的在于使同步更加有效,因为它有助于限制在副本之间发送的信息量。当版本信息更新时,用于数据存储的知识也随之更新。提供程序使用副本知识的目的有:
枚举更改:确定另一个副本没有感知的更改。
检测冲突:确定哪项操作是在不了解彼此知识的情况下做出的。
Tombstones: 每个副本还必须为每个删除的项目维护tombstone 信息。如果不跟踪删除信息,提供程序将无法告知某个项目(如文件)已被删除。在这种情况下,提供程序无法将更改版本信息传播至其他提供程序。Tombstone 必须包含以下信息:
因为 tombstone 日志中的信息将随时间增加,所以有必要创建一个进程定期清理该存储。清理 tombstone 数据能够节省空间并且有助于改善同步性能。Microsoft Sync Framework 支持管理 tombstone 信息。
全局 ID: 用于在所有副本中唯一确定 tombstone 项目的副本 ID 和滴答计数。
删除版本: 与 tombstone 项目关联的更新版本
创建版本: 最初创建项目时关联的副本 ID 和滴答计数
同步流程:
发起同步的副本称为源 而源所连接的副本称为目标。本文接下来的部分将介绍下图所示的同步流程。对于双向同步,将执行此进程两次,第二次迭代时会交换源和目标。
目标端发起同步会话
在这一阶段将建立同步会话,从而创建了从源到提供程序的链接。
目标准备并发送知识
如前所述,每个副本都会存储其自身的知识。存储在目标端的知识将传递到源。
目标知识用于确定要发送的更改
在源端,会将刚刚收到的知识与本地项目版本进行比较,以确定目标端尚不了解的项目。值得注意的是,发送的版本并不是实际的项目,而是每个项目上次发生更改的位置摘要。
更改版本和发往目标端的源知识
当源准备好所需的更改版本列表之后,这些版本将传输到目标端
检索更改项目的本地版本并与源版本和知识进行比较
目标端使用这些版本准备源需要发送的项目列表。目标还使用该信息检测是否存在限制冲突。限制冲突是指违反了项目限制,如文件夹关系或文件系统中同名数据的位置。
检测并解决或推迟冲突
基本上,如果在两次同步期间对两个副本上的相同项目进行更改就会发生冲突。在 Microsoft Sync Framework 运行时中,当其中一个副本的更改版本不包含另一个副本更改的知识时便会检测到冲突。 将在下面的“冲突示例”部分中介绍了说明该检测过程如何工作的更加详细的示例。
副本可以自由实施各种策略,解决同步拓扑间发生冲突的项目。下面列举了一些常用的冲突解决策略:
源获胜: 当检测到冲突时,总是采用源副本所做的更改。
目标获胜: 总是采用目标副本所做的更改。
合并: 将源副本和目标副本所做的更改合并在一起。库存统计可能是一个您希望将两个副本的值合并(求和),而不是选取其中一个作为正确值的例子。
记录冲突: 记录或推迟冲突。
目标向源请求项目数据
在这一阶段,目标已经确定需要在源中检索的项目,并将请求发送到源。
源准备并发送项目数据
源接收到项目数据请求,并准备要传输到目标的实际数据。如果要跟踪的项目是数据库中的一行,则将发送该行。如果项目是文件夹中的文件,则将传送该文件。
项目应用到目标中
目标接收并应用项目。如果在此过程中出现任何错误(如网络断开),则该项目将被标记为异常,并在下次同步期间进行更正。从源接收的知识将添加到目标知识。