我正在为使用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
加载实体将会破坏测试的目的。[1] - https://cloud.google.com/appengine/docs/standard/go/datastore/structuring_for_strong_consistency
答案 0 :(得分:0)
所以,让我们从地点开始吧。 我从两个地方遇到了最终的一致性问题:办公室和家庭。
从办公室开始,他们通常会在5秒钟内匆匆过夜,在重大案件中。 从家里这样的复制品发行可能持续超过20秒。
所以我不会说,有一些非常粗略的定义时间。我相信你也能看到90秒这样疯狂的时间,但是为此你需要在数据存储区中真正脏的索引表和它中的大量数据。
尽管如此,我不会说,您将能够理解有保证的副本分发时间。正如文件所说,在正常情况下,这将是几秒钟。
相反,你可以尝试以某种方式开发你的应用程序,这将处理这种不一致的情况,或者具有最小的失败机会(罕见的操作)。
我们在redis上添加了缓存层,所以现在已经解决了这种不一致问题,但这也不是最干净的解决方案。