自定义提供程序的基础知识

Microsoft Sync Framework 包括若干同步方案(如文件同步)的提供程序,但是在某些情况下仍需要自定义提供程序。自定义提供程序与 Sync Framework 随附的提供程序相比,要求开发人员编写更多的代码,但是它们是确保 Sync Framework 的灵活性和可扩展性的关键组件。本主题提供的信息可帮助您了解自定义提供程序并确定什么类型的自定义提供程序最适合自己的应用程序。如果您刚刚接触 Sync Framework,我们还建议您阅读选择适当的 Sync Framework 组件中的“Sync Framework 组件”。

了解提供程序、应用程序和元数据管理

Microsoft Sync Framework 通过使用四个基本组件来同步副本:同步运行时、一个同步会话和两个同步提供程序。为了同步数据,应用程序创建一个同步会话,并向它传递一个源提供程序和一个目标提供程序。此会话使用源提供程序获取源副本中已发生的新变更,并使用目标提供程序将这些变更应用于目标副本。提供程序为要同步的每个副本和每个项维护元数据,包括“知识”**。知识是一种元数据,它描述直接或通过同步已应用到副本的所有变更。

Sync Framework 不为要同步的数据存储区提供提供程序时,必须编写自定义提供程序。Sync Framework 提供两种自定义提供程序类型的托管和非托管 API:简单自定义提供程序和标准自定义提供程序。

  • 由于简单提供程序涉及的接口数目更少而且很简单,因此使用这种提供程序的开发过程更快,而且对缺少复杂变更跟踪机制的数据存储区提供更直观的支持。

  • 标准提供程序则提供了最大的灵活性和最高的性能和可靠性。

这两种提供程序类型都可以用于同步各种数据存储区,而且都提供一些重要功能(如筛选和冲突处理)的选项,但二者之间存在重大区别。有关更多信息,请参见本主题中的“在简单提供程序和标准提供程序之间进行选择”。

下图显示了在同步方案中使用的主要元素。该图与选择适当的 Sync Framework 组件中的图类似,但是随附文本提供了与自定义提供程序有关的其他信息并且显示如何通过该系统处理数据和元数据流。

自定义同步提供程序体系结构

图中的元素分为三种类型:

  • 由开发人员编写的元素。

  • 由 Sync Framework 提供的元素。

    • 根据使用的是托管代码还是非托管代码,应用程序相应与同步控制器 (SyncOrchestrator) 或同步会话 (ISyncSession) 通信,后者然后与每个同步提供程序通信,驱动同步过程并将状态、冲突和错误信息告知客户端应用程序。

    • 同步运行时帮助提供程序执行常见的同步任务,如元数据管理、冲突检测和变更应用。

  • 由开发人员编写或由 Sync Framework 提供的元素,具体取决于提供程序和应用程序的要求。

    • 元数据存储区包含元数据,Sync Framework 使用这些元数据确定每个提供程序应从哪些变更中进行选择并将它们应用到所服务的数据存储区。元数据存储区可以独立于数据存储区(如位于单独的文件或数据库中),也可以集成到数据存储区(如位于数据库附加的表中)。通常,同步提供程序管理同步所需的元数据。然而,根据副本的实现,由单独的组件来处理元数据管理的某些部分可能更有用,例如,一项在预定时间(而非在同步过程中)清除旧元数据的服务。所需的元数据以及存储和使用元数据的方式取决于所使用的提供程序。有关每种提供程序类型的元数据要求的信息,请参见管理简单提供程序的元数据针对标准提供程序的元数据要求

      简单提供程序使开发人员几乎完全不与元数据存储区进行交互。它使用随 Sync Framework 提供的元数据存储服务的实现。标准自定义提供程序可以使用此实现,也可以使用基于元数据存储服务 API 的另一个实现,还可以使用将元数据存储在独立存储区或数据存储区内的完全自定义实现。有关更多信息,请参见管理标准提供程序的元数据

在简单提供程序和标准提供程序之间进行选择

在大多数情况下,我们建议您使用简单提供程序,但是您应首先了解我们在设计简单提供程序 API 时所做的几个假设:

  • 要同步的数据存储区不支持任何类型的变更跟踪,或只支持基于定位点的变更跟踪。

    定位点是一个对象,它指示数据存储区中的哪些项自上一同步会话以来发生了变更。在没有变更跟踪功能或仅有基于定位点的变更跟踪功能的存储区中,是在同步会话期间对同步知识进行更新(异步方式),而非在存储区中发生变更时进行更新(同步方式)。如果特定副本上同时发生很多同步会话,这会影响性能。因此,如果应用程序要求高并发度并且每个数据存储区支持对同步知识的同步更新,请使用标准提供程序。

  • 副本要求只同步一个项类型。

  • 由于数据存储区的限制或应用程序的要求,必须将元数据存储在数据存储区之外。

    简单提供程序使用随 Sync Framework 提供的元数据存储服务的实现来存储元数据。元数据与它所描述的数据是分开存储的,这样做存在两个潜在的问题:

    • 如果远程存储元数据,则在同步会话期间元数据可能完全不可用。例如,要同步的两个副本之间的网络连接正常,但是承载元数据的服务器的连接断开了。

    • 不能保证数据和元数据之间的事务一致性。建议将元数据存储在数据所在的计算机上,但是不提供事务支持,除非使用标准提供程序并将元数据存储在数据存储区(或使用分布式事务来更新元数据存储区和数据存储区)。请注意标准提供程序还可以使用元数据存储服务,但是与简单提供程序一样不强求这样做。

如果您的应用程序很好满足了这些假设,我们建议您使用简单提供程序。有关简单提供程序的更多信息,请参见实现简单自定义提供程序。有关标准提供程序的更多信息,请参见实现标准自定义提供程序

了解 Sync Framework 参与者类型

Sync Framework 可以用于同步所起作用各不相同的“参与者”**的数据。参与者是可以与运行 Sync Framework 的其他系统同步的设备或服务。

Sync Framework 支持下列参与者类型:

  • 完全参与者

  • 代理参与者

  • 部分参与者

  • 简单参与者

完全参与者

完全参与者在本地承载运行时和存储元数据。完全参与者可以参与对等同步情形,因为两个参与者都可以启动同步。

对等同步中的两个完全参与者

完整参与者组件

部分参与者

部分参与者可以存储同步元数据,但是不能处理它。部分参与者依赖于若干完全参与者来承载运行时和启动同步。数据可以在这些参与者间流动,因为这些参与者可以携带多主同步元数据并将此元数据传送给任何其他完全参与者。部分参与者不能参与对等情形,因为它们不能处理元数据,也不能承载运行时。例如,具有数据存储功能的 USB 拇指驱动器和手机就是部分参与者。

下图说明完全参与者(如计算机)如何与部分参与者(如手机)同步。完全参与者代表部分参与者枚举或筛选变更并将元数据存储在部分参与者上。这样任何其他完全参与者都可以与此部分参与者同步。

与代理参与者同步的完全参与者

完整和部分参与者组件

简单参与者

简单参与者不存储元数据,不能承载运行时,也不跟踪变更。它依赖一个完全参与者完成有关枚举变更、应用变更以及操作和存储元数据的所有工作。由于简单参与者不能存储元数据,它只能作为与单个完全参与者合作的叶节点,由该完全参与者完成与任何其他参与者之间的数据传输。

下图说明完全参与者如何使用元数据存储服务为简单参与者存储元数据并代表简单参与者完成有关同步的所有操作。元数据存储区用于跟踪与简单参与者有关的变更,但是因为简单参与者的存储限制而将元数据存储在完全参与者上。

使用元数据存储服务同步简单参与者的完全参与者

完整和简单参与者组件

代理参与者

代理参与者通过在本地处理调用并将它们转发给远程提供程序(如存储在服务器上的数据库),来为远程提供程序启动同步。

Security note安全性注意

Sync Framework 不在代理提供程序与远程提供程序之间提供身份验证或加密。为了帮助防止未经授权的访问或篡改,必须使用适当的相互身份验证和加密机制(如安全套接字层 (SSL))保护代理提供程序与远程提供程序之间的通信信道。

下图显示完全参与者提供程序与代理提供程序同步的情况。请注意代理提供程序仅通过网络将命令和元数据发送给远程提供程序。远程提供程序位于数据库服务器上,它实现用于同步的实际逻辑。红色的虚线表示计算机边界。

与代理参与者同步的完全参与者

完整和代理参与者组件

下图说明如何使用 Sync Framework 来同步对于启动同步的应用程序是远程的提供程序。起控制作用的应用程序可以连接必须同步的两个 Web 服务或智能设备。请注意两个本地提供程序对于远程提供程序而言都是代理提供程序。红色的虚线表示计算机边界。

同步两个代理参与者的中心应用程序

应用程序和代理参与者组件

请参阅

概念

选择适当的 Sync Framework 组件
实现简单自定义提供程序
实现标准自定义提供程序
实现同步应用程序
Sync Framework 示例