はじめに
皆さん。こんにちは! DreamHanksのエルムです。
今回はコンフリクトの解決について説明していきます。
前回の記事は[第15回] 認証ルールの設定です。
AppSyncによるデータ同期が有効な場合、クライアントとサーバーで同じオブジェクトの異なるバージョンが存在する可能性があります。複数のクライアントが、それぞれのオブジェクトのコピーを更新している場合があります。DataStoreは、競合の検出と解決方法を適用することで、異なるオブジェクトのバージョンを収束させます。デフォルトの解像度はAuto Mergeと呼ばれています。この戦略は、コレクションの成長を可能にし、シングルフィールドデータのサーバーサイドバージョンを好みます。他にも、Optimistic Concurrency controlやCustom Lambda functionsなどの戦略があります。
カスタムコンフリクトの解決
異なる競合解決方法を選択するには、ターミナルからプロジェクトに移動し、amplify update apiを実行します。競合の検出と解決方法を変更するように求められたら、YESを選択してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
? Please select from one of the below mentioned services: `GraphQL` ... ? Do you want to configure advanced settings for the GraphQL API `Yes, I want to make some additional changes.` ? Configure additional auth types? `No` ? Enable conflict detection? `Yes` ? Select the default resolution strategy Auto Merge ❯ Optimistic Concurrency Custom Lambda Learn More |
モデル構成ごとに
なお、このフローでは、個々のGraphQLタイプごとにストラテジーを変更することもできますが、高度なユースケースでない限り、スキーマ全体に同じストラテジーを使用することをお勧めします:
1 2 3 4 5 6 7 8 9 10 |
? Do you want to override default per model settings? Yes ? Select the models from below: ❯◉ Post ◯ PostEditor ◯ User ? Select the resolution strategy for Post model Custom Lambda ? Select from the options below (Use arrow keys) ❯ Create a new Lambda Function Existing Lambda Function |
カスタム構成
DataStoreにはいくつかのオプション設定があり、例えば、システムのどの部分で発生したエラーメッセージに対しても、カスタムハンドラを指定することができます。また、競合解決戦略の1つの間にAWS AppSyncによって変異が拒否された場合に実行されるカスタム競合ハンドラを指定することもできます。
最後に、デバイスにローカルに保存されるアイテム(モデルごと)の上限として、同期するレコード数を設定することができます。また、Delta Syncプロセスの一部として実行されるデフォルトの24時間の「ベースクエリ」を上書きする、分単位のカスタムインターバルも設定できます。
使用例:
以下のコードは、Postモデルのコンフリクト・レゾリューション・ハンドラーを示しています。このハンドラーは、同じタイトルを持つミューテーションを再試行しますが、他のすべてのフィールドについては最新のリモートデータを使用します。衝突解決ハンドラは、他のすべてのモデルの衝突を破棄します(@aws-amplify/datastoreからインポートされたDISCARDシンボルを返すことにより)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import { DISCARD } from "@aws-amplify/datastore"; DataStore.configure({ errorHandler: (error) => { console.warn("回復不能なエラー", { error }); }, conflictHandler: async (data) => { // コンフリクトハンドラーの例 const modelConstructor = data.modelConstructor; if (modelConstructor === Post) { const remoteModel = data.remoteModel; const localModel = data.localModel; const newModel = modelConstructor.copyOf(remoteModel, (d) => { d.title = localModel.title; }); return newModel; } return DISCARD; }, maxRecordsToSync: 30000, fullSyncInterval: 60, // 分 }); |
終わりに
今回の記事は以上になります。
次回は [第17回]リアルタイムを学びましょう。
ご覧いただきありがとうございます。
コメント