platform icon indicating copy to clipboard operation
platform copied to clipboard

Оптимизация создания и хранения динамически генерируемых картинок

Open monochromer opened this issue 3 years ago • 0 comments

Есть проблема - на каждую сборку запускается два очень тяжёлых процесса. Один - генерация картинок для социальных сетей, другой - генерация контентных картинок для элемента picture. Судя по разделу Github Actions, эти процессы занимают до 75%-80% всего времени сборки. Поэтому самое время задуматься об оптимизации.

Задачу можно разбить на две подзадачи:

  • [ ] Оптимизация создания картинок для социальных сетей
  • [x] Оптимизация создания картинок контента статей

Оптимизация создания картинок для социальных сетей

Варианты решения:

1. Self-hosted сервис с динамической генерацией картинок на каждый запрос

Nginx проверяет, есть ли изображение по данному пути. Если есть, то сразу отдаёт его. Если нет, то перенаправляет на сервис, который генерирует картинку и одновременно отдаёт её и сохраняет по заданному пути для оптимизации последующих запросов.

Недостаток способа - техническая поддержка сервиса - производительность, защита от большого числа запросов и др.

2. Хранение картинок в репозитории с контентом.

У такого способа есть несколько преимуществ - уменьшение ненужных повторных генераций картинок, проще в обслуживании, можно размещать для отдельных статей особые уникальные картинки (https://github.com/doka-guide/platform/issues/590).

Сценарий использования: на каждый push в ветку main проходимся по всем папкам images/covers/, если нет изображений, то создаём их и делаем commit в репозиторий. Если картинка устарела, то удаляем её - при следующем деплое будет создана новая.

Оптимизация создания картинок контента статей

Здесь вижу только одно решение - сервис для динамической генерации, так как хранение картинок в репозитории будет сильно раздувать его.

В качестве сервиса можно взять imgproxy.

monochromer avatar Feb 14 '22 14:02 monochromer