认识一下,同步技术框架 Microsoft Sync Framework



Microsoft Sync Framework(MSF)是一个全面的同步平台,可以为应用程序、服务或设备提供协同和离线能力。开发人员可以采用MSF来建立跨越任何网络使用任何协议在任何存储系统中同步任何数据建立任何应用。MSF的一个关键性技术特点是可以由开发人员自定义数据源提供器(Provider),可以让任意的数据源之间进行点对点的同步。


虽然数据提供器是一种额外提供的功能(Out-of-box),但是MSF已经包含了一些常用的数据提供器。包括:
  • Sync Service for Ado.Net:同步支持Ado.Net的数据源。
  • Sync Service for file system:同步文件或目录。
  • Sync Service for SSE:同步简单的共享扩展(Sharing Extensions),例如RSS或ATOM数据源。
开发人员可以使用任何一个数据提供器或者自行开发数据提供器来在应用程序和设备之间交换信息。



参与者(Participants)

参与者的意思是数据从数据源被接收到的位置。参与者可以是一个Web服务,或者一个笔记本电脑,或者是一个U盘。

根据参与者的能力,参与者可以划分为不同的参与类型,最基本的判断原则基于以下两条:
  • 是否允许保存和修改数据
  • 是否允许直接执行应用程序

完全参与者(Full Participants)

完全参与者意味这设备可以允许开发人员创建直接在设备上应用程序和保存数据。例如笔记本电脑和Smartphone手机,他们都可以直接执行应用程序,假如需要的话你也可以创建新的数据存储。



部分参与者(Partial Participants)

部分参与者意味着设备具有保存数据到已经存在的数据存储中或其它数据存储的能力。但是这些设备并没有可以直接运行程序的能力。例如U盘,SD卡等。这些设备就像一块硬盘一样保存,更新和删除数据。



简单参与者(Simple Participants

简单参与者意味着设备只有提供信息的能力。这些设备不能保存和维护新的数据,也不能创建新的应用程序。典型的简单参与者例如RSS订阅源或Web服务。它们被一些外部的组织机构创建,例如Amazon或EBay。这些组织机构可以给你能力去执行WEB服务并取得返回结果。但是,他们不会给你创建自己的数据存储的能力,并且也没有给你在他们的Web服务器上创建并执行你自己的应用程序的能力。



将他们全部带到一起

MSF的最终目标是允许任何的数据源都可以被集成到同步环境中而不需要关心具体的参与者类型。出于这个原因,部分参与者可以于完全参与者之间同步信息,完全参与者也可以与简单参与者之间同步信息。最基本的,需要有一个完全参与者有能力存储信息并启动同步处理程序。

在使用MSF实现同步以前,我们需要先来了解一下数据提供器(Provider)的几个关键性概念。下图显示了Provider如何与其它的Sync Service进行数据源同步,并从Meta Data 中获取数据的情况。这些Provider通过一个叫做Sync Session的会话来进行同步通信。



数据源(Data Source)

数据源是需要被进行同步的数据的存放位置。数据源可以是一个关系数据库,文件,Web服务或者是自定义的任何业务数据。只要你可编程访问到该数据,这个数据就可以作为同步体系中的参与者。

元数据( Metadata)

Provider的一个基本能力就是可以保存相关数据源中数据对象状态和变化的信息。Metadata可以被保存到文件,或数据库,或就在被同步的数据源中。为了方便起见,MSF已经提供了一个基于Sql Server Compact版本的Metadata存储完整实现。然而,这个组件只是一个可选项,不一定非要采用。Metadata可以被分解为以下的五个关键部分:

  • 版本(Versions)
  • 知识(Knowledge)
  • 计数器(Tick Count)
  • 分发号(Replica ID)
  • 墓碑(Tombstones)
对其中的每一项都是需要被同步的数据信息被保存下来,描述了在何地与何时这些数据项被改变。元数据由两个版本组成:创建版本和更新版本。一个版本由两部分组成:一个分配到数据存储的计数器(Tick Count)和数据存储的分发号(Replica ID)。当数据项被更新时,被应用到该数据项上的计数器就会增加。分发号是每一个数据存储的唯一的识别码。创建版本和更新版本一样,只当数据项目被创建时时候建立,数据后续的更新将只会修改更新版本号。

版本记录有两种主要的方式:

  • 内嵌跟踪(Inline Tracking):在这种方式下,当改变发生时就修改跟踪信息。在使用数据库情况下,例如,当一行数据被更新后,触发器可以马上去更新一个跟踪信息表。
  • 异步跟踪(Asynchronous Tracking):在这种方式下。专门会运行一个外部的进程用来检查数据的修改情况。任何被发现的更新都将被添加到版本信息中。这个进程可以是被异步的执行。这个过程被典型的使用在当数据被修改,但却没有任何内部机制来自动更新版本信息时(例如,没有办法可以在数据更新管道中注入逻辑时)。一个常见的方式是检查数据当前的状态是否和被保存的状态有什么不同。例如,检查看一个文件的最后更新时间或文件大小是否改变。

所有的跟踪机制必须检查到数据项级别。换句话说,每一个数据项都必须有独立的版本。在使用数据库的情况下,一个项目可以是表中的一整行数据,也可以是一个数据单元。在使用文件同步的情况下,一个数据项一般是一个文件。更小粒度的跟踪更适合于一些需要尽量避免数据冲突的场景(两个用户更新了同一个数据项)。但缺点是增加了需要被保存的跟踪信息的数量。

另一个关键性的概念是知识(Knowledge)。知识是一个简化的表达方式,描述了一个分发点需要关心的修改。版本的更新信息相当于是数据的知识。Provider使用分发点知识用来:
  • 枚举改变信息(检查出哪一个变化是其它分发点不需要关心的)。
  • 冲突检查
每个分发点必须为每个删除的数据项维护一个"墓碑"信息。因为当同步被执行时,假如一个数据项已经不存在了,除非数据项删除操作被记录了,否则Provider将没有办法被告知该数据项被删除了,那么该变化将不会被传播到其他的Provider。一个墓碑必须包含下列信息:
  • 全局ID(Global ID)
  • 删除版本(Deletion version)
  • 创建版本(Creation version)
由于墓碑信息总会一直不停的增长。因此为了节约存储空间,最好是创建一个进程在一定时间后去清除掉这些数据。MSF已经提供了管理墓碑信息的能力。

同步流程(Synchronization Flow)

初始化同步进程的分发点被叫做"源"(source),它所连接的同步点被叫做"目标"(destination)。下图描绘了整个同步的过程步骤。对双向同步来说,这个过程将会被执行两次,在第二次同步中,源和目标的位置将互相交换。



初始化同步会话

在这个过程中,源Provider建立到目标Provider的通讯连接。在两个Provider之间的连接叫做同步会话。

目标准备发和发送知识信息

在前面说过,每个分发点都储存他自己的唯一知识信息。保存在目标分发点的知识信息将被传送到源分发点。

检查知识信息,找出那些变化将会被发送

在源分发点,接受到的知识信息将会和本地的数据项版本信息进行比较,检查出目标分发点并不知道的版本。值得注意的是,被发送的版本信息并不是实际的数据项,而是每个项目的最后修改集的概要信息。

改变版本并发送源知识信息到目标点

一旦源准备好了改变的版本列表。它们将会被发送给目标端。

查询本地修改过的版本,和源传过来的版本变化信息进行比较

目标使用本地版本和源传递过来的版本进行比较。目标也使用这些信息来检查是否有任何约束冲突。

冲突检查和解决或延迟

当版本变化在其中一个分发点,且该分发点并不包含其他点的知识信息时,冲突将被检查到。基本上,假如两个端点对同一个数据项发生了修改,那么在同步过程中就会发生冲突。

一种特殊的冲突是,发生在当源并不了解某数据项的目标版本的知识信息时(这同时也表示目标点并不了解源点的知识信息)。

假如版本信息已经被包含在目标点的知识信息中,那么这个改变将会被丢弃。

分发点可以自由的实现各种不同的冲突解决方案。以下是一些最常用到的策略方案:
  • 源胜利:当冲突发生时,总是采用源的版本。
  • 目标胜利:当冲突发生时,总是采用目标的版本。
  • 指定的分发号胜利:无论是谁修改了一个数据项。设计时指定的分发号总是胜利。
  • 最后写胜利:基于每个分发点都是可以被信任的基础。并且各个端点的时间始终是一致的。
  • 合并:当两个数据项发生冲突时,合并两者的信息。
  • 记录日志:仅仅记录日志,并且延迟解决冲突。
  • 目标从源请求数据

在这个过程中,目标已经检查出那些数据项需要从源传输到本地。

源准备发送数据项

源接收到数据项的发送请求,准备实际的数据并传输到目标。假如数据项是数据库中的一行数据,那么这行数据将被发送。假如数据项是一个文件,那么这个文件将被发送。

数据被应用到目标端

数据被接收并应用到目标端。加入有任何错误发生,例如网络失败,那么这个过程中的数据项将被标记为异常,并且在下次同步中将会被纠正。从源中接收到的知识信息将会被假如到目标知识信息中。

posted on 2010-02-08 13:49  酸辣大白菜  阅读(838)  评论(0编辑  收藏  举报

导航