Datastore 查询中的数据一致性

数据一致性级别

Datastore 查询可以按以下任何一种一致性级别交付结果:

  • 强一致性查询可以保证获得最新的结果,但可能需要更长时间才能完成。
  • 具备最终一致性的查询通常运行速度更快,但有时会返回过时的结果。

在最终一致性查询中,也会按最终一致性访问用于收集结果的索引。因此,此类查询有时可能返回不再符合最初查询条件的实体,而高度一致性查询在事务上始终一致。

Datastore 查询数据一致性

查询返回的结果具有不同级别的一致性保证,具体取决于查询的性质:

  • 祖先查询实体组内的查询)在默认情况下高度一致,但可以通过设置 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);

后续步骤