ndb和一致性:为什么在没有父项的查询中发生此行为

gab*_*ese 4 python google-app-engine app-engine-ndb

我正在用Python和ndb做一些工作,无法理解为什么.我将发布案例和上面的代码:

models.py

class Reference(ndb.Model):
  kind = ndb.StringProperty(required=True)
  created_at = ndb.DateTimeProperty(auto_now_add=True)
  some_id = ndb.StringProperty(indexed=True)
  data = ndb.JsonProperty(default={})
Run Code Online (Sandbox Code Playgroud)

这些测试在交互式控制台中运行,而--high_replication选项在dev_appserver.py中运行:

测试1

from models import Reference
from google.appengine.ext import ndb
import random

some_id = str(random.randint(1, 100000000000000))
key_id = str(random.randint(1, 100000000000000))

Reference(id=key_id, some_id=some_id, kind='user').put()
print Reference.query(Reference.some_id == some_id, Reference.kind == 'user').get()

# output:
# >> None
Run Code Online (Sandbox Code Playgroud)

为什么????? 现在,让我们在打印前添加一个sleep(1):

测试2

from models import Reference
from google.appengine.ext import ndb
import random
from time import sleep

some_id = str(random.randint(1, 100000000000000))
key_id = str(random.randint(1, 100000000000000))

Reference(id=key_id, some_id=some_id, kind='user').put()
sleep(1)
print Reference.query(Reference.some_id == some_id, Reference.kind == 'user').get()

# output:
# >> Reference(key=Key('Reference', '99579233467078'), createdAt=datetime.datetime(2013, 1, 31, 16, 24, 46, 383100), data={}, kind=u'user', some_id=u'25000975872388')
Run Code Online (Sandbox Code Playgroud)

K,让我们假设它正在模仿将文档传播到所有Google桌面的时间,我永远不会在我的代码中睡觉.现在,让我们删除睡眠并添加一个父亲!

测试3

from models import Reference
from google.appengine.ext import ndb
import random
from time import sleep

some_id = str(random.randint(1, 100000000000000))
key_id = str(random.randint(1, 100000000000000))

Reference(id='father', kind='father').put()

Reference(parent=ndb.Key(Reference, 'father'), id=key_id, some_id_id=some_id, kind='user').put()
print Reference.query(Reference.some_id == some_id, Reference.kind == 'user', ancestor=ndb.Key(Reference, 'father')).get()

# output:
# >> Reference(key=Key('Reference', '46174672092602'), createdAt=datetime.datetime(2013, 1, 31, 16, 24, 46, 383100), data={}, kind=u'user', some_id=u'55143106000841')
Run Code Online (Sandbox Code Playgroud)

现在这令人困惑!设置一个父母,给我强大的一致性!为什么?如果需要提供强一致性,那么为什么在将所有文档插入数据存储区时,为什么不将所有文档放在同一个父文件中?也许我完全错了,有办法做得更好.请有人指导我!

提前致谢

小智 7

祖先查询在同一实体组中运行(因此物理上接近)并且非常一致.

在测试1中,HRD可能看不到put(),因为它最终是一致的,因为它具有分布式特性.

在测试2中,HRD有足够的时间变得一致,因此您可以在查询中看到实体.

在测试3中,您将它放在同一个实体组中,因此它非常一致.

:为什么不将所有东西都放在同一个实体组中?
:GAE不能分发大量数据集,除非有一堆实体组(然后他们可以将它们推送到大量不同的服务器).实体组应该与您需要它们一样大,并且不大(G有时使用在User对象下放置用户"消息"的示例).此外,由于写入实体组的成员会锁定整个组,因此您将面临写入速度限制(如果我记得,则写入1秒/秒,Alfred会对其进行讨论).

:我的get()没有得到对象,是不是应该?
:不,只有按键获得强烈一致,你做了一个查询().get()这实际上只是LIMIT 1的简写.