GAE HR是迈向可伸缩性,分离提交和可见性的一步,但是在可用性方面又退了一步。这种分离会产生一个问题("最终的一致性"?),它会在一些应用程序设计中使用它。通常,我在http请求中提交并重定向到另一个显示结果的页面,但是我必须做一个小延迟(很多毫秒)来尝试获取该提交的更改。这是我找到的最简单的解决方法,而非修复。不幸的是,我无法保证我得到了该提交的更改。由于多种计算同步范式,我认为不可能知道更改更新需要多长时间,可能需要几毫秒,几分钟甚至几天(在不可能的情况下)。
我想知道我能"修复"这通过使用时间戳,容易传递给查询字符串中的另一个请求或存储在会话memcache变量中。如果我有上次提交的时间戳,那么以后对数据库的任何查询都可以使用此时间戳来检查检索到的数据是否在该时间戳之后提交,如果没有,则会一次又一次地重试查询。通过这种方式,我可以保证正确的可见性("强一致性"?),即使需要很长时间。它最终可以在该时间戳之后读取由另一个用户/进程提交的数据,我不认为是一个问题。这种方法是否正确?
我可以在每个表中使用时间戳字段来实现它,但是lib会更好(内置时间戳字段,轮询时间的自动调整,上次提交的内部缓存会话时间戳,也许是一些低级数据库回调而不是投票)。有这样的第三方lib吗?我知道使用GAE低级数据库API的ORM库,但我不知道如何开始这样的事情。
答案 0 :(得分:0)
为了在GAE数据存储中保持一致性 - 使用祖先查询。
https://cloud.google.com/appengine/docs/python/datastore/queries#Python_Ancestor_queries