Быстрое обслуживание нескольких изображений из хранилища данных GAE - PullRequest
1 голос
/ 24 февраля 2012

Я использую jinja для рендеринга страницы, заполненной переменным количеством изображений, используя формат

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

URL-адрес изображения указывает на механизм, который извлекает соответствующее изображение из хранилища данных и возвращает егов качестве ответа, как описано здесь: http://code.google.com/appengine/articles/python/serving_dynamic_images.html

Проблема, с которой я сталкиваюсь, заключается в том, что между каждым загружаемым изображением и каждой загружается последовательно небольшая задержка, что означает, что страница содержит 50 изображенийзагрузка занимает недопустимое количество времени.

Кто-нибудь знает способ обойти это?Такое ощущение, что мне нужно каким-то образом настроить сервер для запуска обработчика обслуживания изображений в нескольких потоках.

Ответы [ 5 ]

1 голос
/ 25 февраля 2012

Как указывал Воббл, сервер dev_appserver.py является однопоточным. Рабочий сервер сможет одновременно обслуживать более одного изображения, в зависимости от браузера.

Но есть еще один совет: вы должны использовать URL-адреса, такие как /image_xxx.jpg или /images/xxx.jpg, и отправлять заголовок expires. Это должно предотвратить повторные загрузки ваших изображений. Кроме того, было бы проще направить кэш на ваш бэкэнд и обслуживать кэшированные версии ваших изображений оттуда, а не из App Engine и вашего приложения.

Эти идеи должны завести вас очень далеко. Если вы достигнете этого предела, вы можете нанять услугу CDN и поставить ее перед кэшируемыми изображениями.

1 голос
/ 24 февраля 2012

Вероятно, это не ограничение AppEngine.AppEngine будет автоматически масштабироваться для обслуживания запросов.Однако браузеры ограничены определенным количеством одновременных запросов к одному и тому же имени хоста - это варьируется в зависимости от браузера, и некоторые позволяют пользователю настраивать, но в большинстве последних браузеров ограничение составляет 6. См. эту диаграмму для более.

Теперь ограничение на имя хоста , а не на домен.Таким образом, вы можете использовать тот факт, что AppEngine будет обслуживать ваше приложение на любом поддомене с использованием синтаксиса FOO-dot-APPNAME.Например, если ваше приложение myblog, вы можете использовать его на img1-dot-myblog.appspot.com, img2-dot-myblog.appspot.com и т. Д., И они не считаются одновременными соединениями с точки зрения браузера.

0 голосов
/ 26 февраля 2012

Статья, на которую вы ссылаетесь, очень старая.Используйте фантастический API высокоскоростных изображений с: get_serving_url (blob_key, size = None, crop = False) И изображения будут обслуживаться Google с NO load для вашего приложения и высокой скоростью.

Я использую загрузчик функций Jinja для генерации URL-адресов.Чтобы дать вам представление: эта строка шаблона:

<img  {% include "front=698.jpg" %} /> 

будет переведена примерно так:

<img   alt="front=698.jpg" src="http://lh3.ggpht.com/-obCxGmlnWZFU-UGRTA6juHNpNPJ90-XafQsYdCW_53ANDlzA4l33n-DBvevcI4urHu9Qa205ZOx5YBg3IU=s698" />

Вы можете даже изменить размер изображения во время выполнения.Кстати: вы должны загрузить свои изображения в свой интернет-магазин приложений.Но обслуживание сделано: Google.с без нагрузки

0 голосов
/ 24 февраля 2012

вам следует рассмотреть возможность использования serve_urls в рабочей среде, поэтому, если вы предварительно установите эти URL-адреса, вам не нужно обрабатывать показ изображений на вашей стороне, и они будут загружаться намного быстрее.

как только изображение загружено, создайте serve_url и установите его для вашей сущности, чтобы вы могли поместить URL-адрес непосредственно в шаблон, не обращаясь к обработчику.

это ничего не изменит на вашем локальном компьютере с использованием SDK.

0 голосов
/ 24 февраля 2012

Сначала прочитайте ответ @Daniel Roseman.Он прав, отметив, что ограничение на стороне браузера.Современные браузеры для настольных компьютеров ограничивают количество параллельных запросов до 6 для каждого домена или всего 35-40.

Чтобы обойти это:

  1. Попробуйте распределить запросы ваших изображений на несколько имен хостов,Вы можете просто сделать это в GAE, загрузив в разные версии, например, img1.yourapp.appspot.com, img2.yourapp.appspot.com и т. Д. Затем вы можете просто сгенерировать префикс версии, добавив случайный номер диапазона к img.

  2. Если у вас есть несколько фиксированных надмножеств изображений, вы можете объединить их в одном изображении и обратиться к конкретному изображению с помощью спрайтов изображений .Таким образом, в одном запросе будет загружено только одно большое изображение.Вы можете объединить изображения в App Engine, создав композит ImagesServiceFactory.makeComposite(image, ...), а затем объединить композиты в одно изображение с ImagesService.composite(composites, ...).

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...