Insider's Eye

Google対抗なのか?! Microsoft Sync Frameworkの正体

デジタルアドバンテージ 一色 政彦
2007/11/20

Page1 Page2

Sync Fxを試す:Sync Fxのインストール

 取りあえず、Sync Fx自体のインストールを行う必要がある。Sync Fxのインストーラには、開発に必要なライブラリだけではなく、実行に必要なランタイムも含まれるので、同期を行うすべてのコンピュータ/デバイスなどにあらかじめインストールしておく必要がある。現在のサポートOSは、Windows Server 2003/Vista/XPである。

 Sync Fx(CTP1)のインストーラとAPIリファレンスは、それぞれ次のリンクからダウンロードできる。

 Sync Fx(CTP1)のインストーラを実行すると、ランタイムとライブラリ、それに加えてサンプルがインストールされる。さらにSQL Server 2005 Compact Editionも自動的にインストールされるようである。次の画面は実際にインストールされたフォルダの内容だ。

Sync Fx(CTP1)のインストール内容
標準では「C:\Program Files\Microsoft Sync Framework\v1.0\」に各種ファイルがインストールされる。その下の「Runtime\x86」フォルダに、.NETから利用するためのアセンブリが格納されている。ちなみに「include」「lib」フォルダにはC++でSync Fxを利用するためのヘッダ・ファイルやソース・ファイルがある。「Samples」フォルダにはサンプル・ソリューションが格納されている。

 なお、このインストール内容には(3つの同期サービスのうち)「Sync Services for ADO.NET(データベース用)」が含まれていない。これが必要な場合は、次のパッケージもインストールしよう。

 次の画面は、これによってインストールされるフォルダ内容だ。

Sync Services for ADO.NET(CTP1)のインストール内容
赤い枠の部分に各種ファイルがインストールされる。.NETアセンブリは「Runtime\ADO.NET\V2.0\x86」フォルダ内に格納される。

 以上のインストールが完了したら、サンプルとして提供されているソリューションをビルドして、プログラムを実際に動かしてみよう。

Sync Fxを試す:サンプルの実行/ソース内容の参照

 まずは、「ManagedNTFSSample」というサンプル(ソリューション名は「ManagedNTFSProvider」、生成されるプログラムは「ManagedSampleTest.exe」と「ManagedNTFSProvider.dll」)を実行する(サンプルは、デフォルトでは「C:\Program Files\Microsoft Sync Framework\v1.0\Samples\」の配下にインストールされている)。

 このプログラム(ManagedSampleTest.exe)は、NTFSファイル・システム上の2つのフォルダ内の全ファイルを同期させる機能を持つコンソール・アプリケーションである(ちなみにサブ・フォルダ配下の内容は同期しないので注意)。

ファイル・システムの同期を行うサンプル・プログラムの実行

 本稿では、次のようなコマンドライン引数を付け足して、このプログラムを実行した。

ManagedSampleTest.exe "C:\SyncTest1" "D:\SyncTest2"
本稿で実行したコマンドラインの内容

 その結果、次の画面のように「C:\SyncTest1」と「D:\SyncTest2」のフォルダ内容(ファイル群)が同期される結果となった(ちなみにSyncTest2は空のフォルダだった)。

フォルダを同期するサンプル・プログラムの実行結果
赤い枠は同期実行後に追加されたファイル。それ以外のファイルは、両フォルダでまったく同じ内容に同期されている。

 このサンプル・プログラムでは、よく見ると両方のフォルダに次の4つのファイルが新たに生成されている。

  • Replica.Sync
  • Knowledge.Sync
  • Metadata.Sync
  • TickCount.Sync

 これらのファイルは、このサンプル・プログラム内で同期内容を自己管理するために独自に作成されているようである。ざっと調べた限りでは、Replica.Syncファイルには、同期の実行に必要な「同期ID(Microsoft.Synchronization.SyncIdクラス)」用データが保存され、Knowledge.Sync/Metadata.Sync/TickCount.Syncファイルには順に、レプリカに関する情報(=Microsoft.Synchronization.SyncKnowledgeクラスのオブジェクト)/メタデータ情報/データ照合用カウント情報が保存されているようだ。

ファイル群の同期を行うサンプル・プログラムのコード内容

 それでは次に、このサンプル・プログラムのコード内容を見ていこう。ここでは、同期を実現するコードの核心部分のみを抜粋して掲載する。具体的には「Synchronize」というメソッドの内容だ(※以下のコードは、説明しやすいように、若干、改変してある。なお、コードはC#)。

public void Synchronize(KnowledgeSyncProvider localProvider, KnowledgeSyncProvider remoteProvider)
{
  // (1)同期先でコンフリクト発生時の対処ポリシーを設定する
  localProvider.Configuration.ConflictResolutionPolicy =
    ConflictResolutionPolicy.DestinationWins;
  remoteProvider.Configuration.ConflictResolutionPolicy =
    ConflictResolutionPolicy.DestinationWins;

  // (2)同期セッションを作成する
  SyncAgent syncAgent = new SyncAgent();
  syncAgent.LocalProvider = localProvider;
  syncAgent.RemoteProvider = remoteProvider;
  syncAgent.Direction = SyncDirection.UploadAndDownload;

  // (3)同期を実行する
  syncAgent.Synchronize();
}
フォルダを同期するサンプル・プログラムのコード内容(C#)
コード内容の詳細は以下で説明している。

 まず、メソッドのパラメータにあるKnowledgeSyncProviderクラス(Microsoft.Synchronization名前空間)のオブジェクトは、1つのデータ・ストアに対応する「プロバイダ(Provider)」である。Sync Fxでは、同期対象となるデータ・ストア1つ1つを「プロバイダ」という単位で(つまり、抽象クラスSyncProviderの派生クラスによって)管理する(プロバイダは前述の同期サービスに含まれる1クラスをインスタンス化したもの)。

 プログラムの実行例では、「C:\SyncTest1」フォルダと「D:\SyncTest2」フォルダの2つのデータ・ストア間の同期が実現されたが、前者のフォルダに対応するプロバイダがlocalProviderオブジェクトで、後者がremoteProviderオブジェクトというわけだ。なお、“Knowledge”という言葉が示すように、KnowledgeSyncProviderオブジェクトは何らかのナレッジ情報を同期するためのプロバイダである(ちなみに、後に紹介するが「FileSyncProvider」というクラスも存在し、そのクラスにはファイル・システムの取り扱いに特化したメソッドなどがより多く搭載されている)。

 (1)コンフリクト発生時の対処

 一般的に、同期で特に問題となるのは「コンフリクト(=不整合)」の対処だ。コンフリクトの例としては、例えば2つのデータ・ストアで同じファイルが、同時に変更されて、どちらも新しい内容が記述されたファイルになっている状況(Concurrent Update Conflicts)など。この場合には、片方のファイルでもう片方を上書きして一方の変更内容を消失させるか、何らかの手段で2つのファイルをマージ(=統合)してどちらの変更内容も残すなどして、2つのファイルの食い違いを解消しなければならない。

 Sync Fxでは、コンフリクトをプログラム内で処理したり、「同期先でコンフリクトが発生した場合にはどちらを生かす」というポリシーを設定したりしてコンフリクトに対処する仕組みになっている。上記のコードの例では「ConflictResolutionPolicy.DestinationWins」という記述によって、(どちらのプロバイダも)同期先でコンフリクトが発生したときには同期先のファイルを優先的に残すように指定している。

 (2)同期セッションの作成

 Sync Fxの中心となるクラスはSyncAgent(Microsoft.Synchronization名前空間)だ。同期を行うには、このSyncAgentオブジェクトを生成して、そのLocalProviderプロパティとRemoteProviderプロパティを指定する。これにより、プロバイダをローカル(Local Provider)とリモート(Remote Provider)に分ける。このように2つの場所に明確に分離することによって、次のDirectionプロパティの設定によって「同期の方向」を適切に指示できるというわけだ。

 Directionプロパティには、次の4つのいずれかのSyncDirection列挙体(Microsoft.Synchronization名前空間)の値で指定する。ちなみに、Directionプロパティのデフォルト値は「SyncDirection.UploadAndDownload」である。

  • Upload:ローカル・プロバイダ→リモート・プロバイダの単方向で同期を行う。
  • Download:逆にリモート→ローカルの単方向。
  • UploadAndDownload:まずローカル→リモート、次にリモート→ローカルの双方向。
  • DownloadAndUpload:まずリモート→ローカル、次にローカル→リモートの双方向。

 「ローカル・プロバイダ/リモート・プロバイダ」と「同期元/同期先」は必ずしも一致しないことに気を付けてほしい(先ほどのポリシーとの組み合わせがややこしい)。例えば、リモート・プロバイダのremoteProviderオブジェクトから、ローカル・プロバイダのlocalProviderオブジェクトに向けて同期をかけたときには(つまり「Download」の同期時)、remoteProviderオブジェクトが「同期元(sync source)」で、localProviderオブジェクトが「同期先(sync destination)」となる。

 (3)同期の実行

 最後に、SyncAgentオブジェクトのSynchronizeメソッドを呼び出すことで、同期が開始される。同期が完了すると、メソッドの呼び出しが終了する。

 以上がファイル・システムの同期を行うサンプル・プログラムのコード内容だ。

ADO.NETによるデータベースの同期について

 実は、ADO.NETを通じたデータベース間の同期などのプログラミングも、上記のプログラム・コードと基本的な部分の実装方法はほぼ同じだ。大きく異なるのはプロバイダである。先ほどはKnowledgeSyncProviderオブジェクトだったが、ADO.NETではDbPeerSyncProviderクラス(Microsoft.Synchronization.Data.Peer名前空間)などのオブジェクトを使う。

 ちなみに現時点で、

  • FilteringKnowledgeSyncProviderクラス(Microsoft.Synchronization名前空間)
  • FileSyncProviderクラス(Microsoft.Synchronization.Files名前空間)
  • ServerSyncProviderクラス(Microsoft.Synchronization.Data.Server名前空間)
  • ClientSyncProviderクラス(Microsoft.Synchronization.Data.Client名前空間)
  • PeerSyncProviderクラス(Microsoft.Synchronization.Data.Peer名前空間)
  • SqlCeClientSyncProviderクラス(Microsoft.Synchronization.Data.SqlServerCe名前空間)

など、すでにさまざまな種類のプロバイダが標準で用意されており、広範な同期シナリオに対応できるようにしようとしているようだ。

 以上、マイクロソフトが発表した新フレームワーク「Sync Fx」を簡単に紹介した。本稿で紹介したのはSync Fxの一面に過ぎず、その全体像を網羅して語れたわけではない。また、Sync Fxのリリース・プランは正式には発表されていないが、Sync Fxはまだまだ発展途上なので、これから機能がさらに足されたり変更されたりすることがあると考えられる。そのため、本稿の情報も、参考程度に受け止めていただけるとうれしい。End of Article

 

 INDEX
  [Insider's Eye]Google対抗なのか?! Microsoft Sync Frameworkの正体
    1. Sync Fxとは何か? その特徴と基本機能
  2. Sync Fxを試す:インストール、サンプルの実行/ソース内容の参照

 Insider's Eye


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間