コンテナー データの復旧
このシナリオでは、データ復旧について説明します。 コンテナーが無効な状態に達し、それ以上のユーザー アクションを処理できない場合、データが破損していると見なします。 破損した状態の結果は、コンテナーが予期せず閉じられている状態です。 多くの場合、一時的な状態であり、再度開くと、コンテナーが期待どおりに動作する場合があります。 複数回の再試行の後でもコンテナーの読み込みに失敗する状況では、以下で説明するように、データの復旧に使用できる API とフローを提供しています。
Fluid Framework と Azure Fluid Relay での状態の保存方法
流動フレームワーク、コンテナー内のデータのスナップショットを定期的に保存します。これにより、その時点までのデータに加えられたすべての変更が要約されます。 通常の読み込み中に最新のスナップショットが取得され、その状態の上に後続の変更が適用されます。
最新のスナップショットまたはその後の変更が破損している場合、Fluid は通常どおりに読み込むことができない可能性があります。 この場合、Fluid には、保存されているスナップショット バージョンを表示し、それ以降の変更を適用しないビュー専用モードで読み込む API のコレクションが用意されています。 これにより、データを抽出し、必要に応じて新しいコンテナーに挿入してコラボレーションを再開できます。
Azure クライアント API
コンテナー バージョンを表示および読み込むための API
AzureClient には、このシナリオをサポートするための次の方法があります。
コンテナーのバージョンを取得する
getContainerVersions(id, options?)
読み込み元の使用可能なバージョンの一覧を取得します。
Parameters:
id
: コンテナー ID。 これは、getContainer
を呼び出すときに使用されるのと同じ ID です。options?
: 必要に応じて、指定する options オブジェクト。maxCount
: 取得するバージョンの最大数。 使用できるバージョンが要求よりも多い場合は、最新のバージョンが取得されます。 既定:5
Returns:
使用可能なバージョンを表すオブジェクトの配列に解決される promise (最新から最も古いものに並べ替えられます)。 オブジェクトには、次のプロパティがあります。
id
: バージョン ID。- 注: これはコンテナー ID とは異なり、具体的にはコンテナーではなくスナップショット バージョンを参照します。
date
: バージョンが生成されたときのタイムスタンプ。
コンテナー バージョンの表示
viewContainerVersion(id, containerSchema, version, compatibilityMode)
表示専用のコンテナーの特定のバージョンを読み込みます。 getContainerVersions
から取得したバージョンはすべて使用できますが、破損したデータを回復する目的で、最新のバージョンから始めて、最新の修正されていないバージョンを見つけるために戻って作業することをお勧めします。
コンテナーは一時停止状態で読み込まれます。つまり、そのスナップショットの生成後に発生したデータに後続の変更は適用されません。 この状態で読み込まれると、コンテナー データは読み取られる可能性がありますが、編集することはできません。
Parameters:
id
: コンテナー ID。 これは、getContainer
を呼び出すときに使用されるのと同じ ID です。containerSchema
: コンテナー スキーマ。 これは、getContainer
を呼び出すときに使用されるスキーマと同じです。version
: 読み込み元のバージョンを参照する version オブジェクト。 バージョン オブジェクトは、getContainerVersions
を使用して取得できます。compatibilityMode
: 互換モード。 これは、getContainer
を呼び出すときに使用されるのと同じ互換モードです。
Returns:
1 つのプロパティを持つ読み込まれたコンテナーを表すオブジェクトに解決される promise:
container
: コンテナー オブジェクト。 これは、getContainer
によって返されるコンテナー オブジェクトと同じ種類のオブジェクトですが、選択したバージョンから以前の状態で一時停止されます。
例
const azureClient = new AzureClient(/* ... */);
const versions = await azureClient.getContainerVersions(id);
// Since the versions are sorted in order from newest to oldest, versions[0] will attempt to load the most recent version.
// If the most recent version is corrupted, we could try again with versions[1] and so on to find the most-recent uncorrupted version.
const { container } = await azureClient.viewContainerVersion(id, containerSchema, versions[0], "2");
// We can now start reading the data from the container.
const someData = container.initialObjects.someSharedMap.get("hello");
// With the data extracted, we can inject it into a new uncorrupted container and attach it to start collaborating again.
const { container: newContainer } = await azureClient.createContainer(containerSchema, "2");
newContainer.initialObjects.someSharedMap.set("hello", someData);
const newId = await newContainer.attach();
主な見解
新しいコンテナーを作成する
既存のコンテナーを復旧 (ロールバック) していません。 copyContainer
は、元のコンテナーからデータがコピーされる新しいインスタンスを提供します。 このプロセスでは、古いコンテナーは削除されません。
新しいコンテナーがデタッチされます
新しいコンテナーは、最初は detached
状態です。 デタッチされたコンテナーの操作を続行することも、すぐにアタッチすることもできます。 attach
を呼び出した後、新しく作成されたインスタンスを表す一意のコンテナー ID が返されます。
復旧後の考慮事項
復旧後のシナリオに関するユース ケースの構築について、リモート コラボレーター全員が同じコンテナーで再び作業できるようにするためにアプリケーションで行えることに関するいくつかの考慮事項を次に示します。
流体コンテナーのみを使用してアプリケーション データをモデル化している場合、コンテナーが破損すると、通信 "リンク" が効果的に切断されます。 実際の例と同様に、元の作成者が参加者とリンクを共有し、そのリンクが機能しなくなったビデオ通話があります。 その点に留意して、1 つのオプションとして、復旧アクセス許可を元の作成者に制限し、元のコンテナーのコピーを復旧した後に、元のリンクを共有したのと同じ方法で新しいコンテナー リンクを共有できるようにすることが考えられます。
または、一時的なデータのみに流体フレームワークを使用している場合は、独自の信頼できるソース データとサポート サービスを常に使用して、より自律的な復旧ワークフローを管理できます。 たとえば、アプリで最初の復旧されたコピーが作成されるまで、複数のクライアントで復旧プロセスを開始できます。 その後、アプリは、参加しているすべてのクライアントに新しいコンテナーに移行するように通知できます。 これは、現在アクティブな任意のクライアントで参加しているグループのブロックを解除してコラボレーションを再開できるため便利です。 ここでの考慮事項の 1 つとして、冗長化によってコストが生じることが挙げられます。