Мой сайт использует много изображений. В ненастный день пользователи будут загружать сотни новых изображений. Я пытаюсь выяснить, как лучше всего управлять размерами изображений.
Этот проект использует Node.js с модулем gm для управления изображениями, но я не думаю, что этот вопрос специфичен для узла или gm.
Я придумал несколько стратегий, но не могу решить, какая из них лучше, и не уверен, что упускаю очевидную передовую стратегию.
Пожалуйста, просветите меня своими мыслями и опытом.
Вариант 1. Изменяйте размер файла с помощью gm при каждом запросе клиента.
Плюсы варианта 1:
Если я запускаю функцию gm каждый раз, когда обслуживаю файл, я могу контролировать размер, качество, сжатие, фильтры и т. д., когда мне это нужно.
На сервере сохраняю только 1, полное качество - полноразмерная версия файла и экономия места на диске.
Минусы варианта 1:
gm очень требователен к ресурсам, и это означает, что я буду злоупотреблять своей оперативной памятью для каждого отдельного сервера изображений для каждого отдельного клиента.
Это означает, что я всегда буду работать с большим файлом, что еще хуже.
Мне всегда придется извлекать файл из моего хранилища (в моем случае S3) на сервер, затем манипулировать им, а затем обслуживать его. Похоже, это создаст избыточные проблемы с пропускной способностью.
Вариант 2: измените размер файла при первой загрузке и сохраните несколько размеров файла на сервере.
Плюсы варианта 2:
Мне нужно будет использовать gm только для загрузки.
Обслуживание файлов практически не потребует ресурсов.
Минусы варианта 2:
Я буду использовать больше памяти, потому что буду сохранять несколько версий одного и того же файла (т. е. полную, большую, среднюю, маленькую, x-small) вместо одной версии.
Я буду ограничен использованием только тех размеров, которые были созданы, когда пользователь загрузил свое изображение.
Не гибкий. Если в будущем я решу, что мне нужна версия дополнительного размера (например, x-x-small), мне придется запустить сценарий, который обрабатывает каждое изображение в моем хранилище, чтобы создать новую версию изображения.
Вариант 3. Используйте вариант 2, чтобы обрабатывать файлы только при загрузке, но сохраняйте модуль изменения размера при обслуживании размеров файлов, версия которых не сохранена в моем хранилище.
Плюсы варианта 3:
- Я смогу значительно сократить использование ресурсов при обслуживании файлов различных размеров.
Минусы варианта 3:
Я бы все равно взял больше памяти, как в варианте 2, а не в варианте 1.
Мне все равно придется обрабатывать файлы, когда я их обслуживаю, в случаях, когда у меня нет файла нужного размера.
Вариант 4. Я не создаю несколько версий файлов при загрузке. Я изменяю размер изображений при их подаче, НО всякий раз, когда запрашивается размер изображения, эта версия файла будет сохранена в моем хранилище, и для будущих запросов мне не придется снова обрабатывать изображение. .
Плюсы варианта 4:
Я буду использовать хранилище только для тех версий, которые использую.
Я мог бы добавить новый размер файла, когда мне нужно, он будет автоматически создан по мере необходимости, если он еще не существует.
Будет использовать много ресурсов только один раз на файл
Минусы варианта 4:
- Files that are only accessed once will be both resource intensive AND storage intensive. Because I will access the file, see that the size version I need doesn't exist, create the new file version, use the resources needed, and save it to my storage wasting storage space for a file that will only be used once (note, I can't know how many times files will be used)
- I will have to check if the file already exists for every request.
Итак,
Что бы вы выбрали? Почему?
Есть ли лучший способ, чем способы, которые я предложил?