5. Файловое хранилище

[к списку решений]

Дата: 2025-01-24

Статус

Предложено

Контекст

Требуется надёжно хранить файлы и пользоваться ими в различных микросервисах. Это должен быть сервис с репликацией, REST API и Java-клиентом.

Даже если проект развёрнут в облаке, желательна независимость от облачного провайдера, чтобы, например, иметь возможность переехать в другое облако, если в какой-то момент это станет целесообразным.

Решение

MinIO.

Что даст внедрение решения?

Хранение файлов в облачном стиле, даже если проект не облачный.

Варианты

MinIO

[наверх]

Это популярное решение.

Преимущества и недостатки

Преимущества
  • Поддерживает репликацию.
  • Поддерживает шифрование данных на диске.
  • Если проект запущен в облаке, то стоит упомянуть, что, в отличие от нативных решений, это решение бесплатно, если хостить самому.
  • Работает по тому же REST API, что AWS S3, – это позволяет использовать в Java нативный S3-клиент и снижает порог вхождения.
Недостатки
  • REST API вносит задержку по сравнению с прямым доступом к файлам (как и S3, но в облаке AWS все используют S3 и никто не жалуется 🤷).
  • По некоторым отзывам, при большой нагрузке эта система, если запущена в виде Docker-контейнера, начинает сильно тормозить. В таком случае надо её запустить без Докера на отдельной виртуалке.

Docker volume

[наверх]

Можно подмонтировать диск ко всем Docker-контейнерам.

Преимущества и недостатки

Преимущества
  • Максимальная скорость доступа к файлам, что может быть необходимо для mission-critical задач.
Недостатки
  • В микросервисной среде возникают риски, связанные с одновременным чтением и записью одного файла (это не БД, блокировок нет).

Сервис облачного провайдера

[наверх]

Если проект развёрнут в облаке, можно пользоваться нативным решением, например AWS S3.

Преимущества и недостатки

Преимущества
  • Лёгкость интеграции с другими облачными ресурсами.
Недостатки
  • Плата за использование - сразу или при превышении некоторого бесплатного порога.
  • Привязка проекта к облачному провайдеру (vendor lock-in). Частично нивелируется в коде созданием абстракции (Java-интерфейса) «Файловое хранилище», что позволит прозрачно подключать другие реализации. Этот подход желательно применять ко всем облачным сервисам, т.к. в будущем может потребоваться переехать в другое облако.