【问题标题】:Does giving a Google App Engine (Java) entity a parent guarantee consistency?是否为 Google App Engine (Java) 实体提供父级保证一致性?
【发布时间】:2015-08-25 14:28:47
【问题描述】:

我有一个 Java 风格的 Google App Engine 应用程序,我需要在其中经历多个读取周期,然后将数据写入数据存储区。每个周期都取决于能否从最后一次写入中读取最新数据。

阅读 Google 文档,似乎保证这种行为的方法是将创建的实体绑定到一个共同的父级,即 new Entity(entity, parentKey)。

这里的问题是用相同的祖先(父)实体编写实体真的能保证一致性吗?父实体似乎与子实体存在相同的问题 - 多个实例可能存在于不同的数据存储中。非常感谢您澄清这一点。

【问题讨论】:

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


    【解决方案1】:

    用相同的祖先(父)实体编写实体确实确实保证了一致性。

    怎么做?

    您想知道这是怎么回事:“似乎父实体与子实体存在相同的问题 - 多个实例可能存在于不同的数据存储中。”

    答案是有一个非常复杂的算法(谷歌查看 Megastore 论文,如果您对技术细节感兴趣,可以使用 PAXOS 算法)在实体组上实现 ACID 事务即使实体在不同的机器

    为什么要将 ACID 限制在实体组中?

    您可能想知道为什么他们不对整个数据存储区执行此操作。似乎他们想出了如何在分布式实体上进行 ACID 事务,那么为什么不考虑实体分组来实现它呢?

    那个的答案是 ACID 事务是有代价的,代价是这样的:你每秒最多只能对一个实体组进行 5 次写入(实际上它更像每秒 5 个写入事务,因此您可以在相同的事务中批量写入以获得更好的写入吞吐量)。因此,如果他们对整个数据库执行此操作,那么对于他们所瞄准的互联网规模而言,这实际上是无用的。

    先写后读:

    附带说明,如果您在修改实体后(在同一事务中)读取该实体,则必须小心。数据存储事务的语义是这样的,读取会看到出现在事务开始处的数据。这意味着它不会看到事务中发生的写入。

    推荐阅读(嗯,看)

    如果您使用数据存储区,这几乎是必须观看的视频。它将为您解决很多这些问题:Google I/O 2011: More 9s Please: Under The Covers of the High Replication Datastore

    【讨论】:

      【解决方案2】:

      似乎保证这种行为的方法是将创建的实体绑定到一个共同的父级,即 new Entity(entity, parentKey)。

      正确,这使得子实体属于同一个实体组。

      似乎父实体与子实体存在相同的问题 - 多个实例可能存在于不同的数据存储中。

      这也是正确的。每个根实体(即本身没有父实体的实体)都属于自己的实体组。

      我解决此问题的方法是对数据库进行建模,以使当前处理周期所需的所有数据共享同一个实体组并在事务中对其进行读/写,以便仍然能够在某个级别上保持并发性(比如“在不同的实例上处理不同的用户”,每个用户的所有数据都在同一个组中)。

      如果您需要同时处理一种类型的所有实体,例如在快照中,恐怕 AppEngine 的 Datastore 并不是最好的选择。您可以让所有实体成为硬编码 root 的子代,如下所示:

      Key root = KeyFactory.createKey(kind, "root");
      new Entity(entity, root);
      

      它有效,但它带来了很多问题 - 主要问题是它会减慢您的应用程序,因为您不能一次执行许多写入。你可以阅读更多关于它的信息here

      【讨论】:

      • 注意使用单个实体组不仅会减慢速度,还会限制您可以在那里保存的总数据量。
      • @ZigMandel。这是不正确的。您可以在单个实体组中拥有的总数据没有限制(超出数据存储配额限制)。唯一的限制是写入吞吐量。如果您愿意,我可以挖掘文档,但他们对此非常明确。
      • 没有。它在文档中的某处说将实体组的大小限制为用户的数据。数据不会被分片,所以应该是大小限制。
      • 我几年前读过它,所以知道它在某个地方:“文档建议保持实体组不超过单个用户的数据价值”cloud.google.com/appengine/articles/scaling/contention
      • @ZigMandel。您误解了文档。由于写入吞吐量限制(争用),您所指的部分建议您将实体组保持较小。如果您的写入吞吐量很小,您可以在单个实体组中存储任意数量的内容。以下是 Google I/O 演讲的链接,其中明确指出实体组可以是任意大小(6:16 分):youtu.be/xO015C3R6dw?t=376
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多