クライアント リセット
Overview
クライアント リセット エラーとは、クライアント邦土がアプリケーション バックエンドとデータを同期できないシナリオです。 この状態のクライアントは引き続きデータを実行してローカルに保存できますが、クライアントがリセットされるまで同期の変更セットを送信または受信することはできません。 Realm SDK は、ほとんどのシナリオでクライアントのリセットを自動的に処理するメソッドを提供します。
警告
デフォルトでは、クライアント リセット プロセスは、ローカルに正常に保存された同期されていない変更を回復しようとします。 クライアント アプリケーションで重大なスキーマ変更が行われている場合、またはサーバーでリカバリ モードが無効になっている場合、クライアント リセット プロセスではデバイス上にローカルに保持されている可能性のある同期されていないデータを回復できません。
クライアント リセット シナリオは、サーバーの履歴がクライアントの履歴と互換性がない場合に発生します。 クライアント リセットの最も一般的な原因は次のとおりです。
Atlas App Services サーバーがクラッシュします : サーバーは以前のバージョンのバックアップから復元する場合があります。 このシナリオでクライアントをリセットすると、クライアントが以前のバージョンにリセットされ、クライアントに保存されていたがサーバーにまだ同期されていない変更がすべて失われます。
同期を無効にしてから再度有効にする: App Services UI で同期をオフにしてから再度有効にすると、すべてのクライアントにクライアントのリセットが必要になります。
クライアントとバックエンド スキーマの不一致: バックエンドに存在しない Realm オブジェクト スキーマを使用中にクライアント アプリケーションがバックエンドとの同期を試みる場合、そのクライアントはクライアント リセットを実行する必要があります。 これは一方向にのみ適用されます。バックエンド スキーマにクライアントで使用されていない Realm オブジェクト クラスが含まれている場合、そのクライアントはクライアント リセットの必要はありません。
クライアントの最大オフライン時間: クライアントがバックエンドと同期していない状態で、クライアント最大オフライン時間日を超えてバックエンドと同期しなかった場合、そのクライアントはバックエンドと同期されていないローカル変更を同期できなくなります。 クライアントは最後の同期以降のすべてのローカル変更を破棄し、バックエンドから Realm の現在のステータスをダウンロードする必要があります。
スキーマの重大な変更: プロパティ タイプやプライマリキーの変更など、重大な変更または破壊的な変更を行うには、同期を終了して再度有効にする必要があります。 これにより、クライアントの ファイルとは無関係なバージョンを持つ新しい同期された Realm ファイルが作成されます。 このシナリオでは、クライアントリセットプロセスは自動的に完了できず、アプリは手動のクライアントリセットハンドラーを提供する必要があります。
共有クラスターから専用クラスターへのアップグレード :共有クラスターから専用クラスターにアップグレードする 場合は、古いクラスターで 同期 を終了する必要があります。 アップグレードした後、同期を再度有効にすることができます。 同期をオフにしてから再度オンにすると、すべてのクライアントにクライアント リセットが必要になります。
セッションロールの変更: Flexible Sync を使用している場合、ユーザーのFlexible Sync セッション ロールが変更されると、クライアントがリセットされます。 次のシナリオはすべて、クライアントがリセットされます。
セッションロールに対するサーバー側の変更
「apply when」、読み取り、または書込み式での展開の値に変更
別のセッションロールのユーザーを対象とする変更
注意
スキーマの重大な変更にはアプリスキーマの更新が必要
スキーマの重大な変更後:
すべてのクライアントが手動クライアントリセットを実行する必要があります。
スキーマの重大な変更の影響を受けるクライアントモデルを更新する必要があります。
クライアントリセットの処理
The SDKs automatically detect the need for client resets. スキーマの重大な変更が発生した場合を除き、ほとんどの場合、クライアントリセットを自動的に実行できます。
自動クライアント リセット中に、クライアントは次の処理を実行します。
バックエンドから Realm の新しいコピーをダウンロードします。
Realm の元の(ローカル)コピーをバックエンドの新しいコピーと同じ状態にするために必要な手順を判別するために差分を実行します。
その手順のセットを適用して、ローカル Realm をバックエンドと同期できる状態に変換します。
スキーマの変更がない場合、または重大でないスキーマの変更のみの場合、SDK はバックエンドにまだ同期されていないすべてのローカル変更の回復を試みます。 また、クライアントにまだ同期されていないバックエンドからの挿入、アップデート、削除も適用されます。
SDK で同期されていない変更を破棄することを選択した場合、またはリカバリ モードが同期されていない変更を回復できない場合、SDK はバックエンドにまだ同期されていないローカルの変更を破棄できます。 次に、クライアントにまだ同期されていない挿入、更新、バックエンドからの削除を適用できます。 フォールバックしてローカル変更を破棄するには、希望する SDK の
recoverOrDiscard
クライアント リセット モードのバージョンを選択します。新しいコピーを破棄します。 アプリは、差分が適用された Realm の元のコピーを引き続き使用します。
スキーマの重大な変更時、または自動クライアントリセットが失敗した場合、クライアントリセットはアプリが定義する必要がある手動クライアントリセットハンドラーにフォールバックします。 Realm SDK は、スキーマの重大な変更を行うと、クライアントのリセットを自動的に実行できません。
自動クライアントリセットモードは、手動リカバリと比較していくつかの利点があります。
アプリケーションは、 モードを指定する以外で、カスタム ロジックを記述せずにクライアント リセットを実行できます。 クライアント リセットを手動で開始したり、エラー オブジェクトを操作したりする必要はありません。
アプリケーションでは、Realm を閉じたり、バックエンド アプリから切断したり、手動で再起動したりせずに、クライアント リセットを実行できます。 つまり、これらの状況を処理するロジックを記述する必要はありません。
アプリケーション ユーザーは、ローカル Realm がバックエンド Realm の状態と一致するように更新されると、変更の通知を受け取ります。
同期されていない変更の回復
Device Sync 構成でクライアントリカバリが有効になっている場合(デフォルトでは)、クライアントアプリケーションは同期されていない変更を自動的に回復できます。 ほとんどのシナリオでは、クライアントアプリケーションはクライアントリセットエラーの発生を検出し、クライアントのリセットを処理するための自動プロセスを開始できます。
クライアントがリセットされた後、アプリは通常どおり開いて操作できます。
クライアントリカバリは、重大なスキーマ変更が発生した場合を除き、クライアントリセットで同期されていないデータを復元できます。 クライアントリカバリは、デバイスからの同期されていないデータを統合する方法を決定するときに、クライアントリセットリカバリルールを適用します。
クライアントが同期されていないデータを回復できない場合は、[ 同期されていない変更の破棄 ]にフォールバックすることを選択できます。 この場合、ローカル データは破棄されますが、クライアントは自動的にクライアント リセットを実行できます。 ローカルの変更を破棄するには、 recoverOrDiscard
クライアント リセット モードの希望する SDK バージョンを選択します。
クライアントリセットリカバリルール
スキーマの重大な変更を伴うクライアント リセットでは、Realm SDK は同期されていない変更の回復を試みます。 SDK は、クライアントがリセットされる前に同期されなかったローカルで作成されたオブジェクトを統合します。 バックエンドとクライアントの両方が同じオブジェクトに変更を加える場合に競合を解決する方法がこれらのルールによって決まります。
オブジェクトがサーバー上で削除されたが、復元されたクライアントで変更された場合は、削除が優先され、クライアントは更新を破棄します。
リカバリ クライアントでオブジェクトが削除されたが、サーバーでは削除された場合、クライアントは削除指示を適用します。
同じフィールドへの更新が競合する場合は、クライアント更新が適用されます。
同期されていない変更の破棄
警告
同期されていないローカルの変更を永続的に削除します
このクライアント リセット モードでは、バックエンドにまだ同期されていないローカルで行われた変更が永続的に削除されます。 アプリケーションで同期されていない変更を保持する必要がある場合は、このクライアント リセット モードを使用しないでください。
同期されていない変更を破棄するクライアント リセット モードは、クライアント デバイスからデータを回復しようとせずに、クライアントのリセットを自動的に処理します。 クライアントリセットリカバリルールがアプリで機能しない場合、または同期されていないデータを保存する必要がない場合は、このモードを選択してください。 このモードでは、差分を使用してローカル Realm がバックエンドと同じ状態になると、同期されていない変更は永続的に削除されます。
同期されていない変更を破棄 モードでは、スキーマの重大な変更が発生した場合、自動クライアントリセットを実行できません。
手動クライアントリセット
スキーマの重大な変更が発生した場合、Realm SDK はクライアントのリセットを自動的に処理できません。 スキーマの重大な変更を行う場合は、 手動のクライアント リセット ハンドラーを定義する必要があります。
このシナリオでは、手動クライアント リセット ハンドラーは、アプリを更新するようユーザーに指示するなどの操作を実行する必要があります。 クライアントのリセットを自動的に処理する Realm SDK バージョンでは、手動クライアントのリセットは、意味のあるリカバリが実行できないエラーシナリオでのみ発生します。
例
クライアント リセットの実行の詳細については、 SDK の クライアント リセットの例 を確認してください。
リカバリモードの有効化または無効化
リカバリ モードは、すべての Device Sync 構成でデフォルトで有効になっています。 リカバリ モードを無効にすることも、以前に無効にした場合は再度有効にすることもできます。
サイドバーで [ Device Syncメニューを選択します。
追加の構成オプションを表示するには、 Advanced Configurationペインをクリックします。
[ Enable Client Recovery ] トグルをクリックします。
[ Save ] ボタンを押して変更を確定します。
アプリが配置案を使用する場合は、変更を加えた後にアプリケーションを配置する必要があります。
次のプル コマンドを使用して、アプリの最新バージョンのローカル コピーを取得します。
プルappservices pull --remote="<Your App ID>" アプリの
sync/config.json
ファイルのis_recovery_mode_disabled
プロパティを使用して、アプリケーションのクライアントの最大オフライン時間の日数を設定できます。``sync/config.json``{ ... "is_recovery_mode_disabled": false, ... } 次のプッシュ コマンドを使用して更新されたアプリ構成を配置します。
プッシュappservices push --remote="<Your App ID>"