Django + S3 (boto) + Sorl Thumbnail: Предложения по оптимизации
Я использую бэкэнд для хранения S3 на сайте Django, который я разрабатываю, чтобы уменьшить нагрузку с серверов EC2 и позволить нескольким веб-серверам (резервирование, балансировка нагрузки) получить доступ к одному и тому же набору загружаемых носителей.
Значки шаблонов Sorl.thumbnail(v11) используются в наших шаблонах, чтобы обеспечить гибкое изменение размера изображения/обрезку.
Производительность на страницах, богатых мультимедиа, не очень хороша, и когда доступ к странице, содержащей эскизы, которые необходимо создать в первый раз, запросы даже время ожидания.
Я понимаю, что это связано с тем, что миниатюра Sorl проверяет/загружает исходное изображение с S3 (которое может быть довольно большим и высоким разрешением), и рендеринг/проверка/загрузка миниатюры.
Что вы предложите, это лучшее решение для этой настройки?
Я видел предложения по хранению локальной копии файлов в дополнение к копии S3 (не очень хорошо, когда пара серверов используется для балансировки нагрузки). Также я видел, что он предложил хранить 0-байтные файлы, чтобы обмануть sorl.thumbnail.
Есть ли другие предложения или лучшие способы приблизиться к этому?
Ответы
Ответ 1
Сортировка миниатюр теперь создается с учетом отдаленных медленных хранилищ. Первое создание миниатюры, однако, выполняется с запросом на хранение, например, с первого обращения к шаблону, но после этого ссылки кэшируются в хранилище значений ключей. Тем не менее вам нужен первый запрос и создание, поэтому одним из решений является использование низкоуровневого api sorl.thumbnail.get_thumbnail с теми же параметрами при загрузке изображения. Когда загруженное изображение добавит это задание создания эскизов в очередь, как сельдерей.
Ответ 2
Вы можете использовать Sorlery. Он объединяет сор и сельдерей для создания эскизов через рабочих. Он очень осторожен, чтобы не делать доступ к файловой системе за пределами рабочего потока.
Миниатюра, возвращенная немедленно (до того, как у работника была возможность), можно контролировать, установив ваш THUMBNAIL_DUMMY_SOURCE
в соответствующий заполнитель.
Задача создается при первом запросе эскиза, последующие запросы обрабатываются фиктивным изображением до тех пор, пока рабочий поток не завершится.
Ответ 3
Почти так же, как и решение @Aidan, я сделал несколько настроек на миниатюре Sorl. Я также создаю эскизы с сельдереем. Мой код здесь sorl_thumbnail-async
Но я познакомился с easy_thumbnails делает именно то, что я пытался сделать, поэтому я использую его в своем текущем проекте. Вы можете найти полезный, короткий пост на тему здесь
Ответ 4
Самое простое решение, которое я нашел до сих пор, это на самом деле это сторонний сервис: http://cloudinary.com/
Ответ 5
Просто хедз-ап для пользователей Flask, которым нужны миниатюры на S3. Я отклонил flask-thumbnails и создал flask-thumbnails-s3. К сожалению, он не делает каких-либо причудливых очередей или асинхронных вещей, таких как различные Django-решения, связанные выше (вклад приветствуется!)... но он работает.