CDN и хранение файлов

Как раздавать картинки и видео быстро по всему миру и не гонять терабайты через свои серверы.

CDN (Content Delivery Network) — сеть edge-серверов по всему миру, кэширующих статику ближе к пользователю, чтобы снизить латентность и разгрузить origin.

Объектное хранилище для файлов

Большие неизменяемые файлы (фото, видео, аватары) не хранят в БД — для этого есть объектные хранилища вроде S3. БД хранит лишь метаданные и ссылку (ключ объекта). Это дёшево, надёжно и масштабируемо по объёму.

БД: Photo(id, owner_id, s3_key, created_at)
Файл: s3://bucket/photos/abc.jpg  (само изображение)

CDN перед хранилищем

Раздавать картинки напрямую из одного региона — медленно для далёких пользователей и дорого по трафику. CDN кэширует файл на edge рядом с пользователем: первый запрос идёт к origin, остальные обслуживает ближайший узел.

Юзер (Азия) -> CDN edge (Азия) --(промах)--> Origin (S3, США)
                  ^---(попадание, быстро, без обращения к origin)

Прямая загрузка через presigned URL

Чтобы не гонять загружаемый файл через приложение, выдают presigned URL: клиент получает временную ссылку и заливает файл прямо в хранилище. Сервер не тратит трафик и CPU на байты файла — только выписывает разрешение.

Как работает под капотом

CDN опирается на кэшируемость: статике ставят длинный Cache-Control и версионируют имя файла (хэш в имени), чтобы новая версия = новый URL и не было проблем инвалидации. Динамику (персональный ответ) через CDN не кэшируют или кэшируют осторожно. На собеседовании это связывает оценку пропускной способности из раздела про масштаб с конкретным компонентом: «тяжёлый трафик статики -> CDN».

Частые ошибки

  • Хранить большие файлы прямо в реляционной БД.
  • Гонять загрузку/раздачу файлов через приложение вместо CDN/хранилища.
  • Кэшировать на CDN персональную динамику без разбора.

Итог

  • Файлы — в объектное хранилище, в БД — только метаданные и ключ.
  • CDN раздаёт статику с edge рядом с пользователем, разгружая origin.
  • Presigned URL позволяет грузить файлы напрямую, минуя приложение.
Проверьте себя
1. Где правильно хранить сами файлы изображений?
AВ реляционной БД как BLOB
BВ объектном хранилище (S3), а в БД — только метаданные и ключ
CВ оперативной памяти приложения
DНа диске балансировщика
2. Что даёт presigned URL при загрузке файлов?
AШифрование файла
BКлиент заливает файл прямо в хранилище, минуя приложение
CУскоряет работу БД
DЗаменяет CDN
3. Зачем версионировать имя статического файла (хэш в имени)?
AДля красоты
BЧтобы новая версия имела новый URL и не возникало проблем инвалидации CDN
CЧтобы файл нельзя было скачать
DЧтобы уменьшить размер файла