【问题标题】:Datastore delay on creating entities with put()使用 put() 创建实体时的数据存储延迟
【发布时间】: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


【解决方案1】:

这个问题与试图复制最终一致性的模拟器有关。

与关系数据库不同,Datastore 不保证数据在发布后立即可用。这是因为经常存在复制和索引延迟。

对于像单元测试这样的事情,这可以通过将--consistency=1.0 传递给datastore start 命令来解决,如记录的here。

【讨论】:

    猜你喜欢
    • 2012-06-19
    • 2015-07-19
    • 2021-02-05
    • 1970-01-01
    • 2013-06-22
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多