Sunday, March 30, 2008

Microsoft Sync Framework

I work for Microsoft in the Windows Live division as a Software Design Engineer. One of the most interesting problems in the distributed world is managing and synchronizing changes in data elements on various endpoints. Microsoft released a CTP of its sync framework that is out for pre RTM preview (http://msdn2.microsoft.com/en-us/sync/default.aspx).

The API consists of three major components:
  • Sync runtime - This is the actual sync runtime that performs transfer of knowledge and metadata and performs actual synchronization. This is the actual underlying sync engine.
  • Metadata store - Keeps track of metadata of elements at a given endpoint. The API includes a SQL CE implementation of metadata store that can be used out of the box. This component can be customized to address a specific solution.
  • Providers - The actual storage provider for elements. The API includes the filesystem and rss providers out of the box. This again can be customized and custom providers can be plugged into the sync framework.

Customization of metadata store and providers is interesting as it can be utilitzed in providing sync solutions that operate on differential data sync algorithms.

Following is an example of file syncing between two file system providers. The example utilizes CTP2 of Microsoft Sync Framework (http://www.microsoft.com/downloads/details.aspx?FamilyId=C88BA2D1-CEF3-4149-B301-9B056E7FB1E6).

using System;
using System.IO;
using Microsoft.Synchronization;
using Microsoft.Synchronization.Files;
namespace MySamples.FileSystemSync
{
class Program
{
// Folders to be synced
static string folderA = Environment.CurrentDirectory + "\\A";
static string folderB = Environment.CurrentDirectory + "\\B";

static void Main(string[] args)
{
// Prepare directories for syncing
PrepareDirectory(folderA);
PrepareDirectory(folderB);

// Create file system provider
FileSyncProvider providerA = new FileSyncProvider(Guid.NewGuid(), folderA);
FileSyncProvider providerB = new FileSyncProvider(Guid.NewGuid(), folderB);

// Create a file in folders
File.WriteAllText(Path.Combine(folderA, "A.txt"), "This file is created by A");
File.WriteAllText(Path.Combine(folderB, "B.txt"), "This file is created by B");

// Ask providers to detect changes
providerA.DetectChanges();
providerB.DetectChanges();

// Sync changes
SyncOrchestrator agent = new SyncOrchestrator();
agent.LocalProvider = providerA;
agent.RemoteProvider = providerB;
agent.Direction = SyncDirectionOrder.UploadAndDownload;
agent.Synchronize();
}

static void PrepareDirectory(string directoryName)
{
if (Directory.Exists(directoryName))
{
Directory.Delete(directoryName, true);
}
Directory.CreateDirectory(directoryName);
}
}
}

At the end of running the sample notice how both folders A and B both have A.txt and B.txt.

No comments: