【发布时间】:2011-02-21 12:56:41
【问题描述】:
您好!
我有一个 Google App Engine 设置,其中 memcached 键以 os.environ['CURRENT_VERSION_ID'] 为前缀,以便在部署时生成新缓存,而无需手动刷新缓存。
这一直很好,直到开发需要同时运行两个版本的应用程序。当然,这会导致缓存不一致。
我现在正在寻找有关如何为键添加前缀的建议。本质上,当部署任何版本时,都需要有一个跨版本变化的变量。 (嗯,这不太理想,因为缓存被完全耗尽了。)
我在考虑以下几种可能性:
创建一个
RuntimeEnvironment实体来存储最新的缓存前缀。缺点:即使被缓存,也会减慢每个请求。不能缓存在内存中,只能在memcached中,因为部署其他版本可能会改变。使用每个实体的版本号。这会产生非常好的粒度,因为缓存可以为未修改的实体保持温暖。缺点是我们需要在模型更改时推送到所有版本,我想避免这种情况,以便在部署到生产之前测试模型更改。
忘记密钥前缀。键的全局命名空间。编写脚本以在每次部署时刷新缓存。这实际上似乎与第一个想法一样好,如果不是更好的话:缓存在两种情况下都完全被破坏了,而且这个避免了运行时实体的开销。
任何想法,不同的想法都非常感谢!
【问题讨论】:
-
我不明白;由于您使用
os.environ['CURRENT_VERSION_ID']为缓存键添加前缀,因此两个不同的版本如何在缓存中存在不一致?你能解释一下这一点吗? -
所以你想在两个不同的主要版本之间共享缓存,你不想处理向后兼容性,但你也不想把更新的副本推送到两个版本?在我看来,你们的目标是互不相容的。
-
@systempuntoout:两个不同的应用程序版本产生两个不同的
os.environ['CURRENT_VERSION_ID'],因此两个版本的内存缓存对象不同。 -
@nick:啊对,你的意思是,给定一个模型的两个版本,protobuf 表示会不兼容,对吗?
-
一点也不。但是您似乎在寻求一种可以在版本之间共享缓存的方式,但也不必在更改模型时更新代码,也不必明确地满足兼容性。不可能同时拥有所有三个:要么您需要考虑向后兼容性进行升级,要么您需要确保可以访问给定缓存实体的所有版本都有最新的代码。跨度>
标签: google-app-engine memcached versions