App Engine高复制数据存储区

时间:2011-05-30 07:44:28

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

我是App Engine的新手,我想确认我对高复制数据存储的理解。

文档说实体组是“一致性单位”,并且所有数据最终都是一致的。同样,它也说“跨实体组的查询可能是陈旧的”。

有人可以提供一些查询可能“陈旧”的示例吗?它是说我可以在没有任何父级(即它自己的组)的情况下保存一个实体,然后很快就会查询它并找不到它?这是否也意味着如果我希望数据始终是100%最新的,我需要将它们全部保存在同一个实体组中?

此常见的解决方法是使用memcache缓存实体的时间比数据在所有数据中心内变得一致所需的平均时间长吗?那个球场的延迟是什么?

由于

3 个答案:

答案 0 :(得分:18)

  

它是说我可以保存   没有任何父母的实体(即它是   自己的小组),然后非常查询   很快就找不到了?

正确。从技术上讲,这也是常规Master-Slave数据存储区的情况,因为索引是异步更新的,但实际上可能发生的时间窗口非常小,你永远不会看到它。

如果通过“查询”表示“按密钥进行操作”,那么在任一实现中都会返回强烈一致的结果。

  

如果我想要数据,它是否也意味着它   总是100%最新我需要   将它们全部保存在同一个实体中   组?

在有可能回答之前,您需要定义“100%最新”的含义。

  

这是常见的解决方法吗?   使用memcache缓存实体   一段时间比平均时间长   数据成为时间   所有数据中心都保持一致吗?

没有。 Memcache严格用于改善访问时间;你不应该在任何缓存驱逐会导致麻烦的情况下使用它。

如果您需要保证看到最新版本,则始终可以获得强大的一致性。但是,如果没有你要做的具体例子,很难提供推荐。

答案 1 :(得分:11)

强制博客示例设置; AuthorsPosts

class Author(db.Model):
    name = db.StringProperty()

class Post(db.Model):
    author = db.ReferenceProperty()
    article = db.TextProperty()

bob = Author(name='bob')
bob.put()
首先要记住的是,单个实体组(包括单个实体)的常规get / put / delete将按预期工作:

post1 = Post(article='first article', author=bob)
post1.put()

fetched_post = Post.get(post1.key())
# fetched_post is latest post1

如果您开始跨多个实体组查询,您将只能注意到不稳定。除非您指定了parent属性,否则您的所有实体都位于不同的实体组中。因此,如果在bob创建帖子后直接重要,那么他可以看到自己的帖子,那么我们应该注意以下事项:

fetched_posts = Post.all().filter('author =', bob).fetch(x)
# fetched_posts _might_ contain latest post1

fetched_posts 可能包含来自post1的最新bob,但可能不会。这是因为所有Posts都不在同一个实体组中。当你在人力资源中查询时,你应该认为“可能会给我带来最新的bob帖子”

由于在我们的应用程序中,作者可以在创建后直接在列表中查看他的帖子,因此我们将使用parent属性将它们绑定在一起,并使用ancestor查询仅从该组中获取帖子:

post2 = Post(parent=person, article='second article', author=bob)
post2.put()

bobs_posts = Post.all().ancestor(bob.key()).filter('author =', bob).fetch(x)

现在我们知道 post2会在bobs_posts个结果中。

如果我们的查询目的是获取“可能所有最新帖子+绝对是bob的最新帖子”,我们需要再做一次查询。

other_posts = Post.all().fetch(x)

然后将结果other_postsbobs_posts合并在一起以获得所需的结果。

答案 2 :(得分:5)

刚刚将我的应用程序从Master / Slave迁移到High Replication数据存储区,我不得不说实际上,对于大多数应用程序来说,最终的一致性不是问题。

考虑经典留言板示例,您put()新留言簿发布实体,然后立即查询留言簿中的所有帖子。使用High Replication数据存储区,您将看不到新帖子在几秒钟后出现在查询结果中(在Google I / O上,Google工程师表示滞后时间大约为2-5秒)。 / p>

现在,在实践中,您的留言簿应用程序可能会在新留言板帖子条目中执行AJAX帖子。提交新帖子后无需重新提取所有帖子。一旦AJAX请求成功,webapp就可以简单地将新条目插入UI。当用户离开网页并返回到该网页,或甚至点击浏览器刷新按钮时,将经过几秒钟,并且很可能新的帖子将由提取所有留言板帖子的查询返回。

最后,请注意,最终的一致性效果仅适用于查询。如果您put()一个实体并立即调用db.get()来获取它,结果将非常一致,即您将获得该实体的最新快照。