从app引擎提供缓存数据时的多线程

时间:2012-07-08 23:18:13

标签: java multithreading google-app-engine gwt memcached

我有一个非常简单的问题,找不到答案,这让我觉得我很可能错过了一些基本事实。

我正在使用memcache来缓存和提供大型静态数据,这通常应该使我们能够从单个实例为数千名用户提供服务;然而,似乎因为app引擎是单线程的,所以每个请求都按顺序排队并按顺序提供,然后在为很多用户提供服务时最终启动多个实例......

除了延迟,特别是在启动新实例时,这甚至会导致更大的定价问题。由于Google现在正在收取小时数而不是CPU利用率,并且通过提供缓存数据,我们很可能只使用每个实例的一小部分可用CPU,因此需要为许多不必要的额外实例付费,类似于{{3} } post ...

我错过了什么吗?

提前感谢您的回答

1 个答案:

答案 0 :(得分:0)

如果通过在appengine-web.xml文件中将“threadsafe”元素设置为“true”来启用多线程,则App Engine不再是单线程的。

但是,在MemCache中缓存数据并不意味着您可以从单个实例提供无限数量的请求。内存缓存没有运行您的应用程序代码,只是为了节省您前往数据存储区的速度,因此速度更快。

根据您的代码和内存使用情况等,当App Engine看到一个实例(现在由于多线程而一次提供多个请求)变得“太忙”时,它将启动新实例(这取决于许多仪表板设置以及appengine-web.xml中的预热请求设置和更新的请求可能由这些设置提供。

因此,实例使用取决于为您的请求提供服务的代码的持续时间,以及每个内存的使用情况 - 而不是MemCache。

如果通过说“静态数据”,你指的是html文件等,通过在appengine-web.xml中将它们称为“静态”,那么实际上你根本不需要任何实例。它们由Google的COntent分发网络(“CDN”)提供服务,无需启动您的实例或运行任何代码。

为此,客户端请求(例如来自浏览器)只需要请求静态文件,而不会导致任何应用程序代码运行。

所以,基于这一切 - 您可能需要重新表述您的问题 - 无论哪种方式,我希望它有所帮助。