在Google App Engine /基于云的托管中缓存

时间:2010-12-09 06:01:16

标签: google-app-engine caching

我很好奇缓存如何在Google App Engine或任何基于云的应用程序中运行。由于无法保证将请求发送到同一服务器,这是否意味着如果数据在服务器A上的第一个请求上缓存,那么在服务器B处理的第二个请求上,它将无法访问缓存?

如果是这种情况(仅缓存本地服务器),请求使用缓存是不是不太可能(取决于用户数量)?例如。谷歌可能拥有数千台服务器

2 个答案:

答案 0 :(得分:2)

使用App Engine,您可以使用memcached进行缓存。这意味着缓存服务器将数据保存在内存中(而不是每个应用程序服务器)。应用程序服务器(对于给定的应用程序)都使用相同的缓存服务器(从概念上讲,可能会有分片或复制)。

应用程序服务器本身的内存缓存可能不会非常有效,因为它们不止一个(尽管对于您的给定应用程序,只有少数实例处于活动状态,但它并不会分布在所有Google的实例上服务器),也是因为谷歌可以随时关闭它们(这对于需要一些时间再次启动的Java应用程序来说是一个真正的问题,所以现在你可以付钱让空闲实例保持活动状态。)

除了这些性能/效果问题之外,应用程序服务器上的内存中缓存可能会导致一致性问题(当缓存不同步时,每次刷新都会显示不同的数据)。

答案 1 :(得分:1)

取决于您想要实现的缓存类型。

如果您有复杂的内存中对象结构需要花时间从数据库加载的数据进行重建,那么在应用程序服务器本身上进行缓存会很有趣。在该特定情况下,您可能希望缓存计算结果。如果结构很大,使用本地缓存比加载共享内存缓存会更快。

如果在内存和数据库之间具有一致的值是最重要的,那么每次使用缓存值时,都可以使用数据存储上的存储值进行一些校验和/时间戳检查。在小对象或全局缓存中存储校验和/时间戳将加快该过程。

使用全局内存缓存的一个大问题是,当某个值尚未存在或已刷新时,确保在“重新填充”它时进行正确同步。如果您有多个服务器在完全相同的时间进行检查并在缓存中重新填充值,您最终可能会有几个不同的服务器同时进行重新填充。如果操作具有同等效力,那么这不是问题;如果没有,一个潜在的,很难追踪的bug。