在Google App Engine /云托管中缓存

问题描述:

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

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

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

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

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

+0

您是否有任何参考资料解释App Engine拓扑结构,缓存服务器与应用程序服务器分开? – systempuntoout 2010-12-09 07:51:15

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

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

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

使用全局内存缓存的一个主要问题是确保在“重新填充”它时有适当的同步,当值尚未存在或已被刷新时。如果您有多台服务器在同一时间进行检查并在缓存中重新填充值,则最终可能会有几个不同的服务器同时进行重新填充。如果手术是同等效力的,这不是问题;如果不是,潜在的并且很难追踪错误。