框架,以帮助使用App Engine的最终一致性+缓存

时间:2012-12-08 21:35:30

标签: python google-app-engine google-cloud-datastore eventual-consistency

我相信我有一个相当典型的用例,最终的一致性非常困难。我想知道是否有人已经创建了一个python框架来帮助解决这个问题。

我有一个GET请求,它为一组实体发出查询。它们很少更新。 我有POST请求一次更新一个实体,更新实体会影响它们是否/如何出现在GET请求中。

由于实体很少改变,我想长时间记住GET请求,比方说几天或几周。所以我很难有机会更新实体,我可以清除内存缓存。

如果我处理POST请求,更新实体,清除缓存,并且很快就会出现GET请求,则会出现问题,最终一致的数据存储区查询可能会显示旧的查询结果,然后将其存储为memcached接下来的几天或几周。

我不需要简单地更新数据存储区和清除缓存,而是需要:

1. update the datastore
2. get the cached query
3. modify the cached query (with the proper sorting too!)
4. update the cache with the new modified query results (with a cas() operation)

这似乎是一个常见的问题。是否有任何python框架可以帮助缓解这个问题?

ndb没有帮助,因为数据存储区查询会绕过所有缓存。

如果重要,我现在正在使用django-nonrel,而django-tastypie处理GET请求。

1 个答案:

答案 0 :(得分:0)

根据我对GAE的memcache的理解/经验,您的数据将被逐出,除非您驾驶的流量非常大,但即便如此,它也是not guaranteed

但是,我认为您应该能够使用Ancestor queries,因为它们通过将查询的范围限制为实体组来提供强一致性。来自文档:

  

要获得强一致的查询结果,您需要使用   祖先查询将结果限制为单个实体组。这个   是因为实体组是一致性的单位   事务性。所有数据操作都应用于整个组;   祖先查询在整个实体之前不会返回其结果   小组是最新的。如果您的应用程序依赖于强烈一致性   对于某些查询的结果,您可能需要将其纳入   在设计数据模型时要考虑。

假设您的GET请求与某种用户或其他可识别的“父”绑定,或者您可以创建由此GET将检索的所有实体共享的全局父级,您将能够按顺序使用该父级检索强烈一致的已发送。

Here's an example from the docs.

这是我提出的一个相关问题,它显示了设置父级,密钥和易于查询ID的一些不错技巧:NDB using Users API to form an entity group