同期ナレッジについて
Sync Framework の同期アルゴリズムでは、変更の列挙と競合検出が、ナレッジを使って実現されています。このトピックでは、その理論上の概念について説明しています。ナレッジは、レプリカに対して直接的に、または同期を通じて間接的に適用されたすべての変更を表すメタデータです。変更の列挙とは、同期元レプリカで変更された項目のうち、同期先レプリカが把握していないものを特定するプロセスです。競合検出は、2 つのレプリカが同じ項目をローカルで更新するなど、一方のレプリカで行われた操作のうち、変更のナレッジがもう一方のレプリカに転送されなかったものを特定するプロセスです。
注意
一般に、同期プロバイダや同期アプリケーションが、直接ナレッジを使用することはありません。代わりに、ナレッジ操作を実行する Sync Framework のメソッドを呼び出します。
ナレッジ操作
次の表は、同期ナレッジの操作とその説明の一覧です。
操作 | 説明 |
---|---|
包含 |
特定のナレッジ オブジェクトに、特定のバージョンの項目が存在するかどうかを調べます (バージョンは、レプリカ キーとティック数です)。言い換えれば、特定のナレッジを所有するレプリカで、特定の変更が適用されたかどうかを調べる操作です。この操作では、入力として項目の ID とバージョンが必要になります。 この操作は、変更の列挙および競合検出で使用されます。 |
和集合 |
2 つのナレッジ オブジェクトから、変更の和集合 (つまり、両方またはどちらか一方に含まれている変更) を含んだ新しいナレッジ オブジェクトを構築します。 この操作は、変更の適用時に使用されます。 |
射影 |
特定のナレッジ オブジェクトと、項目 ID、変更単位 ID、または項目 ID 範囲に基づいて、特定の ID または ID 範囲を対象に、元のナレッジ オブジェクトと同じ変更を含んだ新しいナレッジ オブジェクトを生成します。対象外の項目は一切含まれません。 この操作は、ナレッジを特定の項目、変更単位、または項目範囲に限定する場合に使用します。たとえば、同期が中断されたときや、バッチ分割時、フィルタを使った高度な同期形態などで使用します。 |
除外 |
特定のナレッジ オブジェクトと、項目 ID または変更単位 ID に基づいて、特定の ID を除外した新しいナレッジ オブジェクトを生成します。それ以外の項目については、元のナレッジ オブジェクトと同じ変更が含まれます。射影とは逆の操作になります。つまり、除外操作は、特定の項目を除いたすべての項目を対象に、ナレッジを射影することです。 この操作は通常、変更の適用に失敗したときに使用されます。 |
変更の列挙
変更の列挙は、同期元プロバイダの開発者が実装する処理です。特定のナレッジ操作を使用することによって実行されます。変更の列挙処理の具体的な流れを次に示します。
同期先プロバイダが、同期先レプリカの現在のナレッジを同期元プロバイダに送信します。
同期元プロバイダが、同期元レプリカのすべての項目を反復処理しながら、それぞれの項目について次の手順を実行します。
同期先のナレッジに、同期元レプリカに格納されている項目のバージョンが含まれているかどうかを調べます。
含まれていない場合は、その項目を、同期先プロバイダに送信する変更バッチに追加します。
注意
変更の列挙処理は、項目ストアを直接照会することによって行うこともできます。また、項目ストアでサポートされていれば、照会による方法とこのアルゴリズムとを組み合わせて行うことも可能です。
変更の送信
列挙された変更は、同期元プロバイダから同期先プロバイダへと送信する必要があります。送信時には、変更がバッチ単位に分割されます。すべてのバッチについて、次の情報が送信されます。
変更そのものを表すメタデータ。バッチには、そこに含まれた各変更についてメタデータが追加されます。
関連付けられているナレッジ。通常、同期元レプリカの現在のナレッジを指し、競合検出に使用されます。関連付けられているナレッジは、"変更が加えられた時点で相手が把握していた情報" を表します。バッチには、そこに追加された変更の各グループについて、関連付けられているナレッジが追加されます。
学習したナレッジ。同期元レプリカの現在のナレッジから、このバッチで送信される、項目の一部分だけを射影したものです。ログに記録されている競合も含まれます。学習したナレッジは、"その変更を適用した時点で自分が学習することになる情報" を表すものです。学習したナレッジは、プロバイダに代わって Sync Framework が計算します。
注意
バッチに分割する処理は、変更の列挙が完了するのを待たずに開始できます。つまり、バッチに分割する処理と変更の列挙処理とは並行して実行できます。
順序付け
変更が送信される順序によっては、バッチ内の項目に対してナレッジを射影すると、多少時間がかかります。たとえば、ナレッジでは、項目 ID を範囲で示すことができます。したがって、変更がその適用先の項目 ID の順に送信された場合、ナレッジの射影をきわめて効率よく行うことができます。
順序に関係なく、射影操作では、常に、送信中のバッチに対してナレッジを射影できます。
エラー
列挙された項目を同期元プロバイダが送信できない場合、送信される学習したナレッジから、その項目を除外する必要があります。これは、除外操作を使用して行います。
競合検出
競合検出は、NotifyingChangeApplier (マネージ コードの場合) または ISynchronousNotifyingChangeApplier (アンマネージ コードの場合) など、Sync Framework のコンポーネントによって処理されます。
同期先プロバイダが変更バッチ (そのバッチの学習したナレッジと関連付けられているナレッジが含まれている) を受信した後、バッチ内の各変更について、次の調査が行われます。
その変更が、同期先レプリカに格納されている項目の現在のバージョンと競合していないかどうか。
その変更が期限切れ (同期先レプリカに格納されている項目の現在のバージョンの方が優先される) になっていないかどうか。
以上の点は、次の原則に従って判断されます。
同期先レプリカに格納されている項目のバージョンが、同期元レプリカのナレッジに存在しなければ、その変更は、現在のバージョンと競合している。
変更のバージョンが、同期先レプリカのナレッジに含まれている場合、その変更は期限切れである。
注意
通常の条件下では、期限切れの変更が送信されることはありません。ただし、競合状態が原因で、こうした変更が送信されることがあります。したがって、Sync Framework がそれらを検出し、処理する必要があります。
>
変更の適用
変更の受信と競合の検出が済むと、変更を同期先レプリカに適用することができます。この時点で、同期先プロバイダは、次の手順を実行します。
ローカルで発生した事柄に関して、変更バッチの学習したナレッジを調整します。
中断やキャンセルのために、一部の変更しか適用されなかった場合、適用されなかった各変更について復旧可能なエラーを設定します。Sync Framework は、射影操作を使用して、学習したナレッジを、適用された一部の変更のみに限定します。
オブジェクトがロックされているなど、デジタル著作権管理 (DRM) の問題で特定の変更を適用できなかった場合、同期先プロバイダは、適用されなかった各変更について復旧可能なエラーを設定します。Sync Framework は、除外操作を使用して、失敗した変更を、学習したナレッジから取り除きます。
競合が検出され、解決されなかった場合、Sync Framework は、これらについても、除外操作によって取り除きます。
同期先レプリカのナレッジを、Sync Framework によって計算された更新済みの同期先ナレッジで置き換えます。