リードリクエストにフィールドマスクを含める
GetやListなど読み取り専用のリクエストにフィールドマスクを含めることを推奨します。
-
推奨される方法:
- google.protobuf.FieldMask を使用します
- FieldMaskUtil (Java/C++) ライブラリを使用して、プロトを自動的にフィルタリングできます
-
代替案:
- 代替案1:
- 読み取りたいフィールドごとに boolean フラグを持つメッセージを定義します
- 代替案2:
- 読み取りたいフィールドのタグ番号をリストするメッセージを定義します
- 代替案1:
-
利点:
- クライアント側で明確な期待を設定できます
- クライアントが必要なデータ量を制御できます
- バックエンドはクライアントが必要なデータのみフェッチできます
-
欠点:
- すべてのフィールドを常に設定する必要があるため大きくなるにつれてコストが高くなる
- フィールドマスクが暗黙的 (宣言されていない) であり、メッセージを設定したメソッドによって異なる場合は最悪の失敗
- このアンチパターンは、レスポンスからローカルキャッシュを構築するクライアントでデータ損失が発生する原因となります
一貫した読み取りを可能にするためにバージョンフィールドを含める
クライアントがオブジェクトの書き込み後に同じオブジェクトの読み取りを行う場合、たとえ基盤となるストレージシステムにとって合理的な期待でなくても、書き込んだ内容が返ってくることを期待します。
サーバーはローカル値を読み取り、ローカルの version_info が期待される version_info より小さい場合、リモートレプリカから最新の値を読み取ります。通常、version_info は、ミューテーションが行われたデータセンターとコミットされたタイムスタンプを含む文字列としてエンコードされたプロトです。
https://qiita.com/bushiyama/items/47a7368b98dbb94feffe
一貫性のあるストレージでバックアップされているシステムであっても、すべての読み取りでコストがかかるのではなく、より高価な読み取り一貫性のあるパスをトリガーするトークンが必要な場合もあります。