gpt4 book ai didi

python - Google 应用程序引擎数据存储 : Dealing with eventual consistency

转载 作者:太空宇宙 更新时间:2023-11-03 18:01:19 25 4
gpt4 key购买 nike

我正在开发一个GAE Web应用程序,我需要创建和删除两个没有祖先关系的实体的实例之间的关联(还考虑到同一个实例可能有多个关联,这些关联可能会随着时间的推移而变化,而祖先关系一旦创建,无法删除)。我经历过“最终一致性”策略,这意味着我的网页中的数据不会与我正在创建/删除的关系一致地刷新。然而,我发现通过执行 put() 方法两次,一致性似乎是强制的。

这符合“最终一致性”定义,该定义指出“...如果没有进行新的更新...”数据最终将保持一致,因为我正在进行另一次更新(实际上是相同的两次)我猜系统会强制保持一致性。

我说得对吗?还有其他更优雅的方法吗?

更新:我的目标

假设我有一个 A 类型实体列表,它们实际代表什么并不重要,假设它们代表我业务的主要实体我有一个 B 类型实体的列表,代表 A 类型实体可以依赖的服务。这是多对多的关系,所以服务 b 可以被许多类型 A 的实体 a 使用实体 a 可以由许多 B 类型的服务 b 提供服务

我有一个网页允许我创建这样的关系(一个 Jinja2 模板,带有来自客户端的 Jquery Ajax 回调和一个依赖于服务器端数据存储的 webapp2 python 请求处理程序)。当从数据存储中删除关系时,我通过对 a 实体进行另一个查询并描述其相关的 b 键列表来刷新数据。在这种情况下,我仍然在与 a 相关的 b 键列表中看到已删除的 b.key。这不是我所期望的。

更新:一些代码

这是模型

class A(ndb.Model):
name = ndb.StringProperty()
services = ndb.KeyProperty(repeated=True)

class B(ndb.Model):
name = ndb.StringProperty()
servedEntities = ndb.KeyProperty(repeated=True)

这是我用来创建关系的代码

                a.services.append(b.key);
b.servedEntities.append(a.key);
a.put()
b.put()

这是我用来删除关系的代码

               a.services.remove(b.key);
b.servedEntities.remove(a.key);
a.put()
b.put()

a和b之间没有祖先关系(也不可能有)关系删除后,如果再次从数据存储区检索 a,我仍然可以看到 a.services 中列出的 b.key

最佳答案

您的问题的答案在于以下声明:

When a relationship is removed from the datastore I refresh the data by making another query on the a entity.

为什么需要新查询?

假设用户订阅了服务 x、y 和 z。现在,用户告诉您从列表中删除服务 z。您转到数据存储区并进行必要的更改。但是,您可以简单地从客户端的用户实体中删除 z 并相应地更新 UI,而不是运行新的查询(这可能仍会在返回的实体中显示 z)。

这显然是一个简化的示例。当我编写学校安排应用程序时,我遇到了类似的挑战,该应用程序有一个更复杂的用例 - 单个更改可能会影响选定时间段内的许多实体(例如“在每个教学日安排一个类直到季度末”) ,所以我想简单地运行一个新查询来刷新计划 View 。显然,我遇到了最终一致性问题,由于有时必须创建数十个实体,这一问题被放大了。然后我意识到我已经拥有刷新 View 所需的所有数据,而无需运行新查询。虽然代码有点多,但它是一个干净可靠的解决方案。

关于python - Google 应用程序引擎数据存储 : Dealing with eventual consistency,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27633835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com