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 позволяет грузить файлы напрямую, минуя приложение.