【问题标题】:How to know when updates to the Google AppEngine HRD datastore are complete?如何知道 Google AppEngine HRD 数据存储区的更新何时完成?
【发布时间】:2012-02-13 01:23:29
【问题描述】:

我有一项长期运行的工作来更新 1000 个实体组。之后我想开始第二份工作,必须假设所有这些项目都已更新。由于实体组太多,我无法在事务中执行此操作,因此我刚刚使用任务队列将第二个作业安排在第一个作业完成后 15 分钟运行。

有没有更好的办法?

是否可以假设 15 分钟可以保证数据存储与我之前的调用同步?

我正在使用高复制。

在有关 HRD 的 google IO 视频中,他们列出了处理最终一致性的方法。其中之一是“接受”。一些更新(如推特帖子)不需要与下一次阅读保持一致。但他们也说了类似“嘿,我们只是说几毫秒到几秒,然后它们就一致了”。该时间框架是否记录在其他任何地方?假设在写入后等待 1 分钟再读取是否意味着我之前的所有写入都在读取中?

在视频http://www.youtube.com/watch?feature=player_embedded&v=xO015C3R6dw 39:30 处提到了这一点

【问题讨论】:

  • 我在下面给出了部分答案,但你能提供更多关于你到底想要做什么的信息吗?
  • 基本上我正在插入或更新 1000 个实体。完成该工作后,我需要对这些项目应用等级。因此,我运行一个查询,选择所有记录并按我关心的排名字段对它们进行排序。然后我在另一个实体类型中更新排名。如果查询中缺少实体,该排名显然会下降。

标签: java google-app-engine google-cloud-datastore


【解决方案1】:

我认为没有任何内置方法可以确定更新是否完成。我建议向您的实体添加一个 lastUpdated 字段并使用您的第一份工作对其进行更新,然后在运行之前检查您正在使用第二份更新的实体上的时间戳......这是一种黑客行为,但它应该可以工作。

有兴趣看看是否有人有更好的解决方案。有点希望他们这样做;-)

【讨论】:

    【解决方案2】:

    只要您在不将一致性更改为最终的情况下获取实体,这是自动的。 HRD 在返回之前将数据放入大多数相关的数据存储服务器。如果您正在调用 put 的异步版本,则需要在所有 Future 对象上调用 get 才能确定它已完成。

    但是,如果您在第一个作业中查询项目,则无法确定索引是否已更新。

    比如说……

    如果您要更新每个实体的属性(但不创建任何实体),则检索该类型的所有实体。您可以执行仅键查询,然后执行批量获取(这与执行普通查询差不多快/便宜),并确保您已应用所有更新。

    另一方面,如果您在第二个进程查询的第一个进程中添加新实体或更新属性,则无法确定。

    【讨论】:

    • 我的第一个过程既更新又创建新实体。因此,无论我等待多长时间,都无法确保实体会立即出现在从数据存储中读取相同项目的调用中执行第二个流程(15 分钟或 15 天)?
    • 这取决于您所说的“阅读” - 如果您的意思是“获取”,那么是的,它们将永远存在。但是,如果您的意思是“查询”或“查找”,那么没有。但是,您可以对已添加的每个实体执行仅键查询 - 仅在查询结果中存在每个添加的实体时才允许执行第二个进程。
    • 您的意思是持久化或更新 1000 个项目并将其密钥保存在内存中。然后,当我通过查询读回它们时,确保所有键都出现在结果中?如果它们存在,是否保证数据与几秒钟前运行的更新同步?即使这是一种有效的方法,在某些时候我的 1,000 会变成 1,000,000 并且我不想在内存中保留这么多数据。现在我通过使用光标来避免这种情况,并且一次只操作几个 100 个项目。
    • 我的意思是保留您添加的项目列表。如果这可能是 1,000,000 则足够公平,但我假设尽管您可能正在更新一个巨大的数据集,但新项目的数量最多会很大。
    【解决方案3】:

    我确实找到了这个说法:

    在最终一致性的情况下,超过 99.9% 的写入可在几秒钟内用于查询。

    在本页底部: http://code.google.com/appengine/docs/java/datastore/hr/overview.html

    因此,对于我的应用程序,0.1% 的机会在下一次读取时不存在可能是可以的。但是,我确实计划重新设计我的架构以使用祖先查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多