【问题标题】:Rapidly serving multiple images from GAE datastore从 GAE 数据存储中快速提供多个图像
【发布时间】:2012-02-24 11:48:28
【问题描述】:
【问题讨论】:
标签:
python
http
google-app-engine
http-headers
【解决方案1】:
就像 Wobble 指出的那样,dev_appserver.py 服务器是单线程的。生产服务器将能够在任何给定时间轻松地提供多个图像,直至浏览器的限制。
但还有进一步的建议:您应该使用 /image_xxx.jpg 或 /images/xxx.jpg 之类的 URL,并发送过期标头。这应该可以防止重复下载您的图像。它还可以更轻松地将缓存指向您的后端,并从那里而不是从 App Engine 和您的应用程序提供图像的缓存版本。
这些想法应该会让你走得很远。如果达到该限制,您可以租用 CDN 服务并将其放在可缓存图像的前面。
【解决方案2】:
这可能不是 AppEngine 的限制。 AppEngine 将自动扩展以服务请求。但是,浏览器被限制为对同一主机名的一定数量的同时请求 - 这取决于浏览器,并且有些允许用户配置,但在最近的浏览器中,限制似乎是 6。有关更多信息,请参阅this chart .
现在,限制是每个主机名,而不是每个域。因此,您实际上可以利用 AppEngine 将使用 FOO-dot-APPNAME 语法在任何子域上为您的应用程序提供服务这一事实。例如,如果您的应用程序是 myblog,您可以在 img1-dot-myblog.appspot.com、img2-dot-myblog.appspot.com 等上提供它,从浏览器的角度来看,这些都不算同时连接。
【解决方案3】:
首先阅读@Daniel Roseman 的答案。他正确地指出,限制在浏览器方面。现代桌面浏览器将并行请求限制为每个域 6 个或总共 35-40 个。
要解决这个问题:
尝试将您的图像请求分散到多个主机名。您可以通过上传到不同的版本在 GAE 上简单地做到这一点,例如img1.yourapp.appspot.com、img2.yourapp.appspot.com 等。然后,您可以通过将随机范围号附加到 img 来简单地生成版本前缀。
如果您有一些固定的图像超集,则可以将它们组合成一张图像并通过image sprites 引用特定图像。这样一来,您只需在一个请求中下载一张大图像。您可以在 App Engine 上组合图像,方法是创建一个合成 ImagesServiceFactory.makeComposite(image, ...),然后使用 ImagesService.composite(composites, ...) 将合成合成一张图像。
【解决方案4】:
您应该考虑在生产环境中使用 serving_urls,因此如果您预设了这些 url,您就不需要处理您身边的图像服务,它们的加载速度会更快。
上传图片后,创建一个 serving_url 并将其设置在您的实体上,这样您就可以将 url 直接放入模板中,而无需访问处理程序。
这不会使用 sdk 更改本地计算机上的任何内容。
【解决方案5】:
你提到的文章很老了。使用出色的高速图像 API:
get_serving_url(blob_key, size=None,crop=False)
并且图像将由 Google 以无负载为您的应用程序和高速提供服务。
我使用 Jinja 函数加载器来生成服务 URL。给你一个想法:
此模板行:
<img {% include "front=698.jpg" %} />
将被翻译为:
<img alt="front=698.jpg" src="http://lh3.ggpht.com/-obCxGmlnWZFU-UGRTA6juHNpNPJ90-XafQsYdCW_53ANDlzA4l33n-DBvevcI4urHu9Qa205ZOx5YBg3IU=s698" />
您甚至可以在运行时调整图像大小。顺便说一句:您必须将图像上传到您的应用程序 blobstore。但服务是由谷歌完成的。 无负载