【问题标题】:Can this strange behaviour be explained by Eventual Consistency on the App Engine Datastore?App Engine Datastore 上的最终一致性能否解释这种奇怪的行为?
【发布时间】:2013-04-18 18:07:19
【问题描述】:

我已经实现了两个服务器端 HTTP 端点,它们 1) 存储一些数据并 2) 处理它。方法 1) 通过 App Engine Tasks 调用方法 2),因为它们是我不希望客户端等待的耗时任务。该过程如下面的序列图所示。

现在我有时会遇到处理任务(在下面的序列图中名为 processSomething)在尝试处理时找不到数据 - 用下面的黄色 throw WtfException() 说明。这可以用最终一致性模型described here来解释吗?

文档说读取的强一致性,但写入的最终一致性。我不确定这与此案有关的确切含义。任何澄清表示赞赏。

编辑:我意识到我在这里问的是一个布尔问题,但我想我正在寻找一个答案,该答案有一些关于最终一致性通常是什么的文档,特别是在 Google Datastore 上

编辑 2: 应要求在此处提供有关实际读/写操作的详细信息:

写操作:

entityManager.persist(hand); 
entityManager.close() 

我正在使用 JPA 进行数据持久性。对象 'hand' 是从客户端接收的,并且之前没有存储在数据库中,因此将分配一个新键 Id

读操作

SELECT p FROM Hand p WHERE p.GameId = :gid AND p.RoundNo = :rno

GameIdRoundNo 都不是主键。 GameId 是一个“外键”,尽管 Datastore 在设计上没有注意到这一点。

【问题讨论】:

  • 如果你按键加载(id),我认为你应该得到更新的实体。来自文档“因为 Datastore 获取和祖先查询在执行之前应用了任何未完成的修改,所以这些操作始终会看到所有先前成功事务的一致视图。这意味着获取操作(通过其键查找更新的实体)可以保证看到该实体的最新版本。”

标签: database google-app-engine google-cloud-datastore database-replication acid


【解决方案1】:

如果您显示实际代码会有所帮助,显示您如何保存实体以及如何检索它,但假设 id 是实际数据存储 ID,是密钥的一部分,并且您的 load 是 @ 987654324@ 在其他属性上使用 id 而不是 query,那么最终一致性不是您的问题。

(这方面的文档是further down the page you linked。)

【讨论】:

  • 我已经用数据库交互代码的细节更新了这个问题。如您所见,您的两个假设都是错误的,但我想可以推断出我的问题的主要答案是:最终一致性可能是这里的问题.同意吗?
  • 是的,绝对是候选人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 2011-12-22
  • 1970-01-01
相关资源
最近更新 更多