Datastore クエリのデータ整合性

データ整合性レベル

Datastore のクエリでは、次の 2 つの整合性レベルのいずれかで結果を返すことができます。

  • 強整合クエリは、結果が最新であることが保証されますが、完了までに時間がかかる場合があります。
  • 結果整合性クエリは、一般的により高速に実行されます。ただし、最新ではない結果が返される場合があります。

結果整合クエリでは、結果の収集に使用されるインデックスも、結果整合性に基づいてアクセスされます。その結果、元のクエリ条件と一致しなくなったエンティティが返される場合があります。一方、強整合クエリでは常にトランザクション上の整合性が維持されます。

Datastore クエリのデータ整合性

クエリでは各クエリの特性に基づき、異なる整合性レベルを保証した結果が返されます。

  • 祖先クエリ(1 つのエンティティ グループ内のクエリ)は、デフォルトでは強整合性ですが、Datastore の読み取りポリシーを設定することで(後述)、結果整合性にできます。
  • 非祖先クエリは常に結果整合になります。

キーによるエンティティの取得(「キーによる検索」とも呼ばれる)は強整合になります。

Datastore の読み取りポリシーの設定

パフォーマンスを向上させるために、すべての読み取りとクエリが結果整合になるように、Datastore の読み取りポリシーを設定できます(API を使用して強整合性のポリシーを明示的に設定することもできますが、現実的な効果はありません。これは、ポリシーに関係なく、非祖先クエリは常に結果整合になるためです)。

Datastore の呼び出し期限を設定し、Datastore から結果が返されるのを待機する時間の最大値(秒)を指定することもできます。この時間が経過するとアプリケーションは処理を中止し、エラーを返します。期限のデフォルト値は 60 秒です。現時点ではデフォルト値を超える値は設定できませんが、デフォルトより短い値に設定することは可能です。これにより、特定のオペレーションが失敗と判定されるまでの時間を短くできます(ユーザーへのレスポンスの迅速化などの目的に利用できます)。

Java で Datastore の読み取りポリシーを設定するには、ネストされたヘルパークラス DatastoreServiceConfig.Builder を使用して Datastore サービス構成DatastoreServiceConfig)を作成し、クラス ReadPolicy のインスタンスに渡します。次の例は、読み取りポリシー、呼び出し期限、またはその両方を設定する方法を示しています。

double deadline = 5.0;

// Construct a read policy for eventual consistency
ReadPolicy policy = new ReadPolicy(ReadPolicy.Consistency.EVENTUAL);

// Set the read policy
DatastoreServiceConfig eventuallyConsistentConfig =
    DatastoreServiceConfig.Builder.withReadPolicy(policy);

// Set the call deadline
DatastoreServiceConfig deadlineConfig = DatastoreServiceConfig.Builder.withDeadline(deadline);

// Set both the read policy and the call deadline
DatastoreServiceConfig datastoreConfig =
    DatastoreServiceConfig.Builder.withReadPolicy(policy).deadline(deadline);

// Get Datastore service with the given configuration
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(datastoreConfig);

次のステップ