【问题标题】:Firestore in Datastore mode does not seem to be strongly consistentDatastore 模式下的 Firestore 似乎没有强一致性
【发布时间】:2022-08-03 08:33:21
【问题描述】:

我在 Datastore 模式下使用带有 objectify 和 Firestore 的云端点。尽管在documentation 中说所有查询都是强一致的,但我发现它们不在以下示例中:

示例 1

我创建了一个通过属性查询实体的端点,将 +1 添加到其上的 count 属性,然后将其保存回数据存储区。然后我有 50 个不同的客户端同时执行该方法。我希望count 属性为 50,但是,它通常最终在 25-30 之间。

示例 2

我有一个通过属性查询实体的端点。如果实体不存在,我将创建实体并将其保存到数据存储区。如果它存在,我只是返回它。同样,我同时使用 50 个不同的客户端访问了这个端点。我希望数据存储区中只有一个实体。但是,我可能会有 5-10 个相同的实体。

在我看来,这并不一致。如果我在上述端点中获取我的代码并将它们放入一个重试事务中,那么一切都会按预期工作。我在objectify中环顾四周,看看是否在某处设置了ReadOptions,但据我所知,没有,所以它应该使用默认的read_consistency=STRONG

  • NDB 库会自动缓存查询结果,如果您想确保拥有最新数据(对于像您这样的场景),您可以在执行查询时关闭缓存。数据存储库(或 Objectify)是否有类似的东西?
  • @NoCommandLine 根据我对 Objectify 文档的阅读,除非您明确设置它(我没有),否则它不会缓存。
  • 数据存储库呢?也许它拥有它。由于 NDB 库有它,并且 NDB 基本上是 Datastore 库的一个方便的包装器,所以底层 Datastore 库有它的可能性
  • 来自 github:Objectify v6+ uses the Cloud Datastore API - 我认为它可以直接访问它。

标签: google-cloud-platform google-cloud-datastore google-cloud-endpoints objectify


【解决方案1】:

例如 1,您需要使用事务来确保写入不会相互影响。

例如 2,您需要再次使用事务来获得跨客户端的一致性。

强一致性意味着如果客户端写入一个值,它可以在写入成功后读取或查询回来。不是如果一个客户端读取一个值,另一个读取相同的值,他们每个人都会进行转换,并尝试写入每个客户端的盲人写入将合并在一起。

【讨论】:

    猜你喜欢
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2018-08-06
    • 2017-01-06
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多