変更の列挙

同期元プロバイダは、GetChangeBatch (マネージ コードの場合) または IKnowledgeSyncProvider::GetChangeBatch (アンマネージ コードの場合) の要求に応答するタスクとして、同期先レプリカが把握していない変更のバッチを生成します。同期元プロバイダは、同期先プロバイダから送信されたナレッジ オブジェクトに含まれていない項目を同期元レプリカから割り出し、これらの項目のバッチを返します。

それぞれの変更バッチは、次の情報で構成されます。

  • 変更された項目のグローバル ID およびバージョン。

  • 同期先レプリカが把握する必要のある廃棄標識。

  • 関連付けられているナレッジ。これは、変更が加えられたときの同期元レプリカのナレッジです。同期先プロバイダが変更を適用するとき、Sync Framework は、同期先についての学習したナレッジを、関連付けられているナレッジから計算します。

  • 必須ナレッジ。この変更バッチを処理するために同期先レプリカで必要な最小限のナレッジです。同期先レプリカのナレッジに必須ナレッジが含まれていない場合、その変更を処理することはできません。

  • 同期元レプリカの忘れられたナレッジです。古くなった同期先レプリカを検出するために使用されます。

2 つのレプリカ間での変更の列挙

このセクションでは、Sync Framework のナレッジ インターフェイスを使用して、2 つのレプリカ間で変更を列挙するプロセスを、シナリオに基づいて説明します。

注意

   レプリカは、プロバイダが変更を列挙する前に、ローカルで行われた変更をそのナレッジに確実に反映する必要があります。これは、ローカルで変更が行われたときにナレッジを更新するか、変更の列挙前にメタデータをメンテナンスすることによって行われます。

このシナリオでは、同期先プロバイダが同期元プロバイダに変更を要求します。要求は次の順序で行われます。

  1. 同期先レプリカは、同期元レプリカとの同期の対象となるスコープについて、ローカルで発生したすべての変更を、そのナレッジに反映します。

  2. 同期先プロバイダが、同期先レプリカのナレッジを同期元プロバイダに送信します。同期元プロバイダは、そのナレッジを GetChangeBatch (マネージ コードの場合) または IKnowledgeSyncProvider::GetChangeBatch (アンマネージ コードの場合) メソッドを介して受信します。

  3. 同期元プロバイダは、変更バッチを作成するために、同期元レプリカ内の変更および削除を列挙し、それらを 1 つずつ同期先レプリカのナレッジと照らし合わせて検証します。変更バッチには、同期先レプリカのナレッジに含まれていない変更だけが追加されます。変更バッチは、ChangeBatch オブジェクト (マネージ コードの場合) または ISyncChangeBatch インターフェイス (アンマネージ コードの場合) によって表されます。

  4. 同期元プロバイダが、変更バッチを同期先プロバイダに返します。

注意

   変更セットには、大量の変更が存在する可能性があります。受信する変更の一覧を処理できるだけの時間的な余裕を持たせるために、同期先プロバイダでは、GetSyncBatchParameters (マネージ コードの場合) または GetSyncBatchParameters (アンマネージ コードの場合) メソッドで、バッチ サイズに 0 以外の値を返すことにより、変更をバッチ単位で送信するように要求できます。

同期元プロバイダが、変更単位を使用して、同期元レプリカから列挙されたサブ項目を表す場合、同期元プロバイダから送信されるのは、項目全体ではなく、実際に変更された変更単位だけです。詳細については、「変更単位の同期」を参照してください。

期限切れの変更の処理

変更バッチを構築する際、期限切れの変更は自動的に除外されます。期限切れの変更とは、同期先レプリカのナレッジに既に存在し、同期先レプリカに適用する必要のない変更のことです。Sync Framework は、変更バッチに対して変更を追加する際、その変更のバージョンを同期先レプリカのナレッジと照らし合わせて比較し、同期先レプリカのナレッジに含まれていない場合にのみ、変更を追加します。こうすることで、変更バッチをコンパクトにできるほか、プロバイダに実装される変更列挙アルゴリズムも単純化できます (ティック数を基準にするなど)。

プロバイダでは、変更バッチに追加する変更が期限切れになっていないかどうかを調べるための独自の検証を実行できます。そのためには、同期先レプリカのナレッジに格納されている変更のグローバル ID およびバージョンを調べる必要があります。これは、Contains (マネージ コードの場合) メソッドまたは ISyncKnowledge::ContainsChange (アンマネージ コードの場合) メソッドを使用して実行します。該当する変更がナレッジに存在しなかった場合は、その変更を変更バッチに追加します。こうすることで、変更バッチをコンパクトにできるほか、変更バッチの構築をプロバイダ側で完全に制御することが可能になります。

参照

リファレンス

ISyncKnowledge インターフェイス
ISyncChangeBatch インターフェイス
IKnowledgeSyncProvider インターフェイス
IKnowledgeSyncProvider::GetChangeBatch
SyncKnowledge
ChangeBatch
KnowledgeSyncProvider
GetChangeBatch

概念

同期プロバイダ
競合の処理
同期ナレッジについて