ama*_*awa 14 google-app-engine google-cloud-datastore
我是一个完全的App Engine新手,我想确认我对高复制数据存储的理解.
文档说实体组是"一致性单位",并且所有数据最终都是一致的.同样,它也说"跨实体组的查询可能是陈旧的".
有人可以提供一些查询可能"陈旧"的例子吗?它是说我可以在没有任何父级(即它自己的组)的情况下保存一个实体,然后很快就会查询它并找不到它?它是否也意味着如果我希望数据始终是100%最新的,我需要将它们全部保存在同一个实体组中?
这种常见的解决方法是使用memcache缓存实体的时间长于数据在所有数据中心内变得一致所需的平均时间吗?什么是球场延迟?
谢谢
Nic*_*son 18
它是说我可以在没有任何父级(即它自己的组)的情况下保存一个实体,然后很快就会查询它并找不到它?
正确.从技术上讲,这也是常规Master-Slave数据存储区的情况,因为索引是异步更新的,但实际上可能发生的时间窗口非常小,您永远不会看到它.
但是,如果通过"查询"表示"按键执行",那么在任一实现中都会返回强烈一致的结果.
它是否也意味着如果我希望数据始终是100%最新的,我需要将它们全部保存在同一个实体组中?
在有可能回答之前,您需要定义"100%最新"的含义.
这种常见的解决方法是使用memcache缓存实体的时间长于数据在所有数据中心内变得一致所需的平均时间吗?
不.Memcache严格用于改善访问时间; 你不应该在任何缓存驱逐会导致麻烦的情况下使用它.
如果您需要保证看到最新版本,则始终可以获得强大的一致性.但是,如果没有您尝试做的具体示例,则很难提供建议.
Chr*_*loe 11
强制博客示例设置; Authors有Posts
class Author(db.Model):
name = db.StringProperty()
class Post(db.Model):
author = db.ReferenceProperty()
article = db.TextProperty()
bob = Author(name='bob')
bob.put()
Run Code Online (Sandbox Code Playgroud)
首先要记住的是,单个实体组(包括单个实体)的常规get/put/delete将按预期工作:
post1 = Post(article='first article', author=bob)
post1.put()
fetched_post = Post.get(post1.key())
# fetched_post is latest post1
Run Code Online (Sandbox Code Playgroud)
如果您开始查询多个实体组,您将只能注意到不稳定.除非您指定了parent属性,否则所有实体都位于不同的实体组中.因此,如果重要的是直接bob创建一个帖子后,他可以看到自己的帖子,那么我们应该小心以下内容:
fetched_posts = Post.all().filter('author =', bob).fetch(x)
# fetched_posts _might_ contain latest post1
Run Code Online (Sandbox Code Playgroud)
fetched_posts 可能包含最新post1的bob,但可能没有.这是因为所有Posts不在同一实体组中.在HR中查询这样的时候你应该想"给我看一下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)
Run Code Online (Sandbox Code Playgroud)
现在我们知道这post2将在我们的bobs_posts结果中.
如果我们的查询的目的是获取"可能所有最新的帖子+绝对是bob的最新帖子",我们将需要做另一个查询.
other_posts = Post.all().fetch(x)
Run Code Online (Sandbox Code Playgroud)
然后合并结果other_posts,并bobs_posts合力得到期望的结果.
刚刚将我的应用程序从Master/Slave迁移到High Replication数据存储区,我不得不说实际上,对于大多数应用程序来说,最终的一致性不是问题.
考虑一下经典的留言簿示例,您put()可以在其中发布新的留言簿实体,然后立即查询留言簿中的所有帖子.使用High Replication数据存储区,几秒钟后您将看不到新帖子出现在查询结果中(在Google I/O上,Google工程师表示滞后时间大约为2-5秒).
现在,实际上,您的留言簿应用程序可能正在进行新留言簿帖子条目的AJAX帖子.提交新帖子后无需重新获取所有帖子.一旦AJAX请求成功,webapp就可以简单地将新条目插入UI.当用户离开网页并返回到该网页,或甚至点击浏览器刷新按钮时,将经过几秒钟,并且很可能新的帖子将由提取所有留言板帖子的查询返回.
最后,请注意,最终的一致性性能仅适用于查询.如果您put()是一个实体并立即调用db.get()以获取它,结果将非常一致,即您将获得该实体的最新快照.
| 归档时间: |
|
| 查看次数: |
2682 次 |
| 最近记录: |