Кейс: хранение документов и файлов (MinIO)

↑ 8.4 Backend System Design · ← Предыдущая

Обязательно~3 мин чтенияУровень: senior

Зачем это на собесе

Задача на хранение больших бинарных данных, права доступа и доставку.

Объяснение

Требования: загрузка и скачивание файлов (от КБ до ГБ), версии документов, права доступа, предпросмотр, антивирус, срок хранения, аудит, высокая надёжность данных.

flowchart LR
  U[Клиент] -->|1. запрос на загрузку| API[Files API]
  API -->|метаданные + pre-signed PUT| U
  U -->|2. загрузка напрямую| S3[(MinIO / S3)]
  S3 -.событие ObjectCreated.-> QОчередь
  Q --> W[Воркер: антивирус, превью, метаданные]
  W --> DB[(БД метаданных)]
  U -->|3. скачивание| CDN[CDN/прокси] --> S3

Решения:

ВопросРешение
Хранениеобъектное хранилище (S3/MinIO); в БД только метаданные (id, ключ, размер, тип, владелец, версия, хэш)
Загрузкаpre-signed URL / multipart для больших файлов, докачка; файл не проходит через приложение
Скачиваниеpre-signed GET с коротким сроком либо прокси с проверкой прав; CDN для публичных
Правапроверка в API; ключи объектов не угадываются (GUID)
Версионированиеversioning bucket или версии в метаданных
Надёжностьerasure coding/репликация, несколько узлов/зон, бэкапы
Целостностьхэш (SHA-256), проверка после загрузки
Безопасностьшифрование в покое и в транзите, антивирус, ограничение типов/размеров, изоляция
Дедупликацияпо хэшу содержимого (content-addressable)
Жизненный циклlifecycle: перенос в холодное хранилище, удаление
Метаданные для поискаотдельный индекс (Elasticsearch)
Аудитжурнал доступа к документам

Готовые предпросмотры: генерируются воркером по событию, кэшируются.

Нюансы и подводные камни

  • Загрузка через приложение упирается в память и пропускную способность.
  • Файл появился в хранилище, но метаданные не записались (и наоборот): согласуйте через события/сверку и очистку «сирот».
  • Публичные ссылки без срока и проверки утекают.
  • Имена файлов клиента — только как метаданные.
  • Ограничения размера и время жизни pre-signed ссылок.

Практика

  1. Реализуйте загрузку через pre-signed multipart URL и обработку события ObjectCreated.
  2. Добавьте проверку хэша и антивирус в воркер.
  3. Настройте lifecycle для временных файлов и версионирование.

Вопросы с ответами

Связанные темы