【问题标题】:Rapidly serving multiple images from GAE datastore从 GAE 数据存储中快速提供多个图像
【发布时间】:2012-02-24 11:48:28
【问题描述】:

我正在使用 jinja 来渲染一个填充了可变数量图像的页面,使用格式

<img src="/image?id=x" />

图像 URL 指向从数据存储中检索相关图像并将其作为响应返回的处理程序,如下所述:http://code.google.com/appengine/articles/python/serving_dynamic_images.html

我遇到的问题是,每张图片加载之间都有一个小的延迟,并且每张图片都是按顺序加载的,这意味着一个包含 50 张图片的页面需要不可接受的时间来加载。

有人知道解决这个问题的方法吗?感觉我应该以某种方式将服务器设置为在多个线程上运行图像服务处理程序。

【问题讨论】:

标签: 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.comimg2-dot-myblog.appspot.com 等上提供它,从浏览器的角度来看,这些都不算同时连接。

    【讨论】:

      【解决方案3】:

      首先阅读@Daniel Roseman 的答案。他正确地指出,限制在浏览器方面。现代桌面浏览器将并行请求限制为每个域 6 个或总共 35-40 个。

      要解决这个问题:

      1. 尝试将您的图像请求分散到多个主机名。您可以通过上传到不同的版本在 GAE 上简单地做到这一点,例如img1.yourapp.appspot.comimg2.yourapp.appspot.com 等。然后,您可以通过将随机范围号附加到 img 来简单地生成版本前缀。

      2. 如果您有一些固定的图像超集,则可以将它们组合成一张图像并通过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。但服务是由谷歌完成的。 无负载

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-08-06
            • 2017-05-01
            • 2014-06-20
            • 2014-03-28
            • 2018-03-15
            • 2021-05-27
            • 2014-05-07
            • 1970-01-01
            相关资源
            最近更新 更多