google-app-engine - 在 NDB(Python 的 Google App Engine 数据存储库)中自动使用缓存是否会使事务模型无效?

标签 google-app-engine google-cloud-datastore app-engine-ndb google-app-engine-python

一大卖点Google Cloud Datastore是它提供了实体组内的强一致性。

Cloud Datastore ensures that entity lookups by key and ancestor queries always receive strongly consistent data.

[Datastore is good for] Transactions based on ACID properties, for example, transferring funds from one bank account to another.

NDB library是从 Google App Engine for Python 访问数据存储区的记录方式。

但是,默认情况下,NDB library uses caching以加快结果。使用的缓存是“上下文缓存”和memcache .但是这些缓存都不能通过数据存储进行事务更新。因此,似乎必须放弃重要的一致性属性(强调我的):

when the transaction is committed, its context will attempt to delete all such entities from memcache. Note, however, that some failures may prevent these deletions from happening.

我的理解对吗?也就是说,在默认配置下使用NDB库时,即使在实体组内访问也没有一致性保证?

如果我是对的,这就是个大问题。

它几乎牺牲了 Datastore 的最大属性。所有这些文档都是关于一致性和 ACID 事务的。在 Google IO 上讨论如何使用实体组来获得一致性。甚至研究论文。悄悄地,在文档的一个小角落,用最随意的句子,我了解到我没有在默认配置中获得这些属性。

这是令人难以置信的误导。我相信大多数人都没有看到这一点。大多数实现可能期望实体组内的 ACID 事务,但他们没有得到它。这些是生产代码中的严重错误。

这是实现和文档的重大失败。默认值不应该为了速度而牺牲一致性。一致性是实体组的重点。如果实现做了这种意想不到的事情,如此显着地改变了语义,那么文档应该已经把它说得非常清楚了。

最佳答案

据我所知,如果您没有使用带有事务缓存的实体,那么您可以进行数据修改。

通过键直接读取数据存储是一致的。因此,如果你想在读取时获得高度一致的结果,你需要在需要的地方禁用 ndb 缓存。否则你会得到最终的一致性,例如如果缓存失效成功或缓存过期/被逐出。

您可能还希望在使用 ndb.delete()_use_datastore=False 完成事务后手动从缓存中删除实体,以确保缓存是干净的。

关于google-app-engine - 在 NDB(Python 的 Google App Engine 数据存储库)中自动使用缓存是否会使事务模型无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45043643/

相关文章:

python - 在 Google App Engine Python 2.7 上安装 opencv

google-app-engine - AppEngine 上 myapp/static 中文件的路径是什么

google-app-engine - Google App-Engine Objectify 实体可以有多个 @Id 字段吗?

reactjs - 使用 Google Cloud Datastore 和 ReactJS 登录表单

python - 将 ndb.Tasklets 与 memcache 读取相结合

python - 如何在 Python for 循环中获取 GAE ndb 中当前记录的键?

Android Google App Engine 教程不会工作

python - GAE 模拟器如何限制可用 Python 模块的列表?

java - 硬删除的对象仍然出现在 AppEngine 管理控制台中

google-app-engine - 在本地环境中重定向后,我是否应该期待过时的结果?