【发布时间】:2021-01-10 19:24:08
【问题描述】:
我正在开发一个使用 Cloud Datastore Emulator (2.1.0) 和 google-cloud-ndb Python 库 (1.6) 的应用程序。
我发现可通过查询检索的实体存在间歇性延迟。
例如,如果我创建一个这样的实体:
my_entity = MyEntity(foo='bar')
my_entity.put()
get_my_entity = MyEntity.query().filter(MyEntity.foo == 'bar').get()
print(get_my_entity.foo)
因为get() 方法返回None,所以它会间歇性失败。
这只发生在大约十分之一的电话中。
为了演示,我创建了这个脚本(也可以在 GitHub 上运行 docker-compose setup):
import random
from google.cloud import ndb
from google.auth.credentials import AnonymousCredentials
client = ndb.Client(
credentials=AnonymousCredentials(),
project='local-dev',
)
class SampleModel(ndb.Model):
"""Sample model."""
some_val = ndb.StringProperty()
for x in range(1, 1000):
print(f'Attempt {x}')
with client.context():
random_text = str(random.randint(0, 9999999999))
new_model = SampleModel(some_val=random_text)
new_model.put()
retrieved_model = SampleModel.query().filter(
SampleModel.some_val == random_text
).get()
print(f'Model Text: {retrieved_model.some_val}')
避免这种间歇性故障的正确方法是什么?有没有办法确保实体在put() 调用后始终可用?
更新
我可以确认这只是数据存储模拟器的问题。在 Datastore 模式下对应用引擎和 Firestore 进行测试时,实体在调用 put() 后立即可用。
【问题讨论】:
-
如果通过
id或key获取实体会发生这种情况吗?例如SimpleMOdel.get_by_id(<some-id>)或entity.key().get()(检查语法,我有一段时间没有使用数据存储) -
@snakecharmerb 刚刚测试过,如果使用
SampleModel.get_by_id(int_id),则不会出现问题...这让我认为问题是索引延迟。我想知道是否有办法强制索引发生? -
可能是在尝试模拟最终一致性?
-
@snakecharmerb 刚刚查了一下,有一个标志
--consistency可以设置为1.0来关闭它...但是问题仍然存在。 -
更正:我没有正确应用更改...
--consistency=1.0解决了问题。
标签: python google-app-engine google-cloud-datastore app-engine-ndb