ドキュメントの競合(Conflict)
データ同期をサポートする分散環境では、ドキュメントの競合が発生する可能性があります。したがって、こうしたドキュメントの競合を解決する必要があります。
自動競合解決 / コンフリクト・フリー・モード
Couchbase Mobileでは、「自動競合解決」、言い換えると、 「コンフリクト・フリー」モードが導入されています。このモードでは、競合が自動的に処理されます。
この場合、システムのデフォルトのコンフリクト・リゾルバーが自動的に処理するため、アプリ開発者が、競合に対処するためにアプリ側で特定のことを行う必要は基本的にありません。ただし、競合について通知を受けるオプションがあり、必要に応じて、適切なアクションを実行することが可能です。
この投稿では、自動競合解決 / コンフリクト・フリー・モードを使用して、Couchbase Mobileでドキュメントの競合が自動的に処理される方法の基本について説明します。
ドキュメントリビジョン(改訂)ツリー
競合解決プロセスを理解するには、ドキュメントの管理方法の基本を理解する必要があります。Couchbase Mobileでは、すべてのドキュメントに、システムで生成された一意のリビジョンID(revID)が割り当てられます。このIDは、ドキュメントを一意に示すIDであるドキュメントIDとは別に管理されます。ドキュメントへのすべての変更は(削除の場合を含め)、ドキュメントの新しいリビジョンとして扱われ、リビジョンIDが割り当てられます。
既存のドキュメントに変更(編集または削除)を行うたびに、ドキュメントを更新するアプリケーション(ライター)は、更新されるドキュメントの現在のリビジョンIDを含める必要があります。変更に対して新しいリビジョンが作成され、更新されていた現在のリビジョンに子ノードとして追加され、ドキュメントのリビジョンツリーが作成されます。
注:「revID」はアプリに対して不透明な(透過的な)オブジェクトとして扱われる必要があります。アプリは「revID」を生成しようとしてはなりません。
競合発生のメカニズム
端的に言えば、複数のライターがドキュメントの同じ親リビジョンに変更を加えると、競合が発生します。
Couchbase Liteでの(プルレプリケーションによる)競合
次の図は、プルレプリケーションの結果として、モバイルデバイスのドキュメントが更新されるときに、既にアプリがローカルのドキュメントの同じリビジョンを更新しているシナリオを示しています。
Sync Gatewayでの(プッシュレプリケーションによる)競合
次の図は、2つのクライアントがドキュメントの同じリビジョンへの変更をプッシュするシナリオを示しています。
競合の解決
コンフリクトフリーモードでは、競合は、自動的に解決されます。
つまり、データベースに競合するドキュメントが保存されると言うことは起こりえず、事実上「競合がない(コンフリクトフリー)」ということです。
最後に
詳細について、稿を改めて解説します。
関連情報
以前のバージョン
Demystifying Conflict Resolution in Couchbase Mobile