放置实体后,查询中出现的最大预期延迟是多少?

时间:2018-01-12 00:01:58

标签: python google-cloud-datastore

我正在为使用Cloud Datastore的应用程序进行集成测试。 有时在新放置的实体和它在查询中的出现之间存在很长的延迟:我通常会看到延迟的分钟

[1]的文件让我相信出了问题。他们说的是:

  • "在提交的几秒钟内,几乎所有的写入都可用于非祖先查询。"
  • "复制延迟几乎总是少于几秒钟"

以下代码的访问模式与我的某个测试类似,我可以轻松触发扩展的不一致读取行为:

e1 = datastore.Entity(db.key('Thingy', 'tid1'))
e1['key1'] = 'value1'
db.put(e1)

e2 = datastore.Entity(db.key('Thingy', 'tid2'))
e2['key1'] = 'value1'
db.put(e2)

e3 = datastore.Entity(db.key('Thingy', 'tid3'))
e3['key1'] = 'value2'
db.put(e3)

e4 = datastore.Entity(db.key('Thingy', 'tid4'))
e4['key1'] = 'value2'
db.put(e4)

time.sleep(1)

q = db.query(kind='Thingy')
q.add_filter('key1', '=', 'value1')
results = list(q.fetch())
assert len(results) == 2

q = db.query(kind='Thingy')
q.add_filter('key1', '=', 'value2')
results = list(q.fetch())
assert len(results) == 2

我刚刚运行了这段代码。 90秒后,我只看到了后两个实体:

> list(db.query(kind='Thingy').fetch())
[<Entity('Thingy', 'tid3') {'key1': 'value2'}>,
 <Entity('Thingy', 'tid4') {'key1': 'value2'}>]

有趣的是,如果我得到另外两个实体,它们会立即显示在查询中:

>>> db.get(db.key('Thingy', 'tid1'))
<Entity('Thingy', 'tid1') {'key1': 'value1'}>
>>> list(db.query(kind='Thingy').fetch())
[<Entity('Thingy', 'tid1') {'key1': 'value1'}>,
 <Entity('Thingy', 'tid3') {'key1': 'value2'}>,
 <Entity('Thingy', 'tid4') {'key1': 'value2'}>]
>>> db.get(db.key('Thingy', 'tid2'))
<Entity('Thingy', 'tid2') {'key1': 'value1'}>
>>> list(db.query(kind='Thingy').fetch())
[<Entity('Thingy', 'tid1') {'key1': 'value1'}>,
 <Entity('Thingy', 'tid2') {'key1': 'value1'}>,
 <Entity('Thingy', 'tid3') {'key1': 'value2'}>,
 <Entity('Thingy', 'tid4') {'key1': 'value2'}>]

一些注意事项:

  • 相关测试的目的是检查我的应用的过滤功能是否有效。因此,使用get加载实体将会破坏测试的目的。
  • 由于测试模拟了四个不同的客户端添加数据,因此不会对个人进行批量处理。我宁愿保持原样,但改变也不可能。
  • 我想避免使用模拟器,因为我更喜欢测试来验证应用程序处理真正的数据存储最终一致性。
  • 我在Debian上使用了google-cloud-python v184的python3.5。

[1] - https://cloud.google.com/appengine/docs/standard/go/datastore/structuring_for_strong_consistency

1 个答案:

答案 0 :(得分:0)

所以,让我们从地点开始吧。 我从两个地方遇到了最终的一致性问题:办公室和家庭。

从办公室开始,他们通常会在5秒钟内匆匆过夜,在重大案件中。 从家里这样的复制品发行可能持续超过20秒。

所以我不会说,有一些非常粗略的定义时间。我相信你也能看到90秒这样疯狂的时间,但是为此你需要在数据存储区中真正脏的索引表和它中的大量数据。

尽管如此,我不会说,您将能够理解有保证的副本分发时间。正如文件所说,在正常情况下,这将是几秒钟。

相反,你可以尝试以某种方式开发你的应用程序,这将处理这种不一致的情况,或者具有最小的失败机会(罕见的操作)。

我们在redis上添加了缓存层,所以现在已经解决了这种不一致问题,但这也不是最干净的解决方案。