Обновлено: 30 апреля 2026 г. в 07:40

Content Delivery Network (CDN)

средний

Классическая задача: сеть доставки контента, маршрутизация по регионам, инвалидация кэша, защитный слой origin и выбор между предзагрузкой и кэшированием по запросу.

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

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

В интервью и инженерных обсуждениях этот кейс быстро показывает, умеете ли вы мыслить за пределами одного региона, считать цену промаха кэша и защищать origin при массовом трафике.

География трафика

Важно управлять тем, куда именно попадает пользовательский запрос: через маршрутизацию, ближайшую точку присутствия и резервные пути при сбое региона.

Иерархия кэшей

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

Свежесть контента

Нужно заранее определить, где хватает времени жизни, где нужен принудительный сброс, а где обязательны версионированные URL.

Защита origin

При промахах кэша и резких всплесках трафика важно ограничить число одновременных обращений к origin, объединять одинаковые запросы и иметь понятный режим деградации.

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

Источник

Acing the System Design Interview

Подробный разбор архитектуры сети доставки контента, инвалидации кэша и ключевых компромиссов.

Читать обзор

Зачем нужна сеть доставки контента?

  • Снижение задержки: контент приходит с ближайшего пограничного узла
  • Разгрузка исходного слоя: большая часть запросов завершается до обращения к исходному серверу
  • Масштабируемость: трафик распределяется по регионам и точкам присутствия
  • Отказоустойчивость: при сбое одной точки присутствия трафик можно увести на соседнюю
  • Защита от массовых атак: распределённая инфраструктура лучше выдерживает всплески и злонамеренную нагрузку

Функциональные требования

Основные возможности

  • Кэширование статического контента
  • Географическая маршрутизация трафика
  • Инвалидация и обновление кэша
  • Переключение на резервный исходный сервер

Дополнительные возможности

  • Ускорение динамического контента
  • Выполнение простых вычислений на периферии
  • Завершение защищённого соединения
  • Преобразование запросов и ответов

Нефункциональные требования

ТребованиеЦелевое значениеОбоснование
Задержка< 50 мс (p99)Пользователь не должен ждать начало загрузки
Доля попаданий в кэш> 95%Минимизировать нагрузку на исходный слой
Доступность99.99%Это критическая часть внешнего контура сервиса
Пропускная способностьTbps+Нужно выдерживать глобальный трафик и пиковые всплески

Архитектура сети доставки контента

Компоненты системы

1. Маршрутизация через систему доменных имен

На входе работает . В глобальном контуре её часто дополняют GeoDNS и , чтобы направить пользователя в ближайшую точку присутствия с минимальной задержкой.

2. Пограничные узлы в точках присутствия

Эти узлы принимают пользовательские запросы, отдают данные из локального кэша и при необходимости проксируют запрос глубже по цепочке.

3. Промежуточный защитный слой

Промежуточный собирает промахи кэша от множества точек присутствия и не даёт исходному слою получить лавину одинаковых запросов.

4. Исходный сервер

Это сервер или объектное хранилище, к которому сеть обращается только тогда, когда контент не найден в промежуточных кэшах.

Путь запроса через сеть доставки контента

Пользователь
DNS
Узел PoP
Промах
Shield

Готово к запуску

Нажмите кнопку, чтобы показать путь запроса.

10-50ms
Попадание в кэш на edge
50-150ms
Попадание в кэш Shield
200-500ms+
Запрос к origin

Предварительная загрузка и кэширование по запросу

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

Предварительная загрузка

Контент раскладывается по узлам заранее, ещё до первого пользовательского запроса.

Преимущества:

  • Нет задержки первого обращения
  • Предсказуемая производительность
  • Полный контроль над распространением

Ограничения:

  • Нужно заранее управлять выкладкой
  • Редкий контент занимает место зря
  • Сложнее поддерживать синхронность между регионами
Подходит для: статических сайтов, дистрибуции ПО, важных фронтенд-ассетов

Кэширование по запросу

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

Преимущества:

  • Автоматически подстраивается под реальный спрос
  • Экономит место на редком контенте
  • Проще в эксплуатации

Ограничения:

  • Первый запрос платит за промах кэша
  • Промахи увеличивают нагрузку на исходный слой
  • Задержка менее предсказуема
Подходит для: динамических сайтов и больших библиотек пользовательского контента

Инвалидация кэша

Главный рычаг управления свежестью — правильно выбранное , понятный механизм принудительного сброса и правило, какие объекты можно обновлять в фоне, а какие нет.

Стратегии инвалидации кэша

Пограничный кэш
TTL: 01:00
Кэш актуален

Истечение по TTL

Контент автоматически перестаёт считаться свежим после заданного времени жизни.

НизкаяС задержкой
Преимущества
  • Простая настройка через HTTP-заголовки
  • Не требует интеграции с API провайдера
  • Предсказуемое поведение кэша
Ограничения
  • Обновление ждёт истечения TTL
  • Сложно подобрать правильное значение
  • Нет мгновенной инвалидации
Когда применять: Статический контент с редкими обновлениями

Стратегии кэширования

Что стоит кэшировать?

Тип контентаКэшируемостьРекомендуемое время жизни
Статические файлы (JS, CSS)Высокая1 год с версионированием
ИзображенияВысокаяОт 1 месяца до 1 года
HTML-страницыСредняяОт 5 минут до 1 часа
Публичные API-ответыСредняяОт 1 минуты до 1 часа
Персонализированный контентНизкаяОбычно не кэшировать

Проектирование ключа кэша

Ключ кэша определяет, какие версии контента считаются разными объектами. Ошибка на этом уровне приводит либо к загрязнению кэша, либо к низкой доле попаданий.

# Простой ключ (только URL):
cache_key = hash(url)

# Расширенный ключ:
cache_key = hash(url + headers["Accept-Encoding"] +
                 headers["Accept-Language"] +
                 query_params["version"])

# Заголовок Vary указывает, какие поля включать в ключ:
Vary: Accept-Encoding, Accept-Language

Безопасность и защита исходного слоя

Внешний контур сети почти всегда принимает первую волну угроз и шифрования, поэтому здесь важны , корректное завершение , а также политики вроде и проверки сертификатов через .

Защита от массовых атак

  • Ограничение частоты запросов на пограничном узле
  • Эникаст для распределения всплесков трафика
  • Центры очистки трафика
  • Выявление ботов и аномалий

Шифрование соединений

  • Завершение защищённого соединения на пограничном узле
  • Общие и выделенные сертификаты
  • Шифрование соединения с исходным сервером
  • Строгая политика HTTPS и stapling статуса сертификатов

Контроль доступа

  • Подписанные URL и cookies
  • Токены доступа
  • Белые списки IP-адресов
  • Ограничения по географии

Защита исходного слоя

  • Промежуточный защитный слой
  • Объединение одинаковых запросов
  • Скрытое имя исходного сервера
  • Правила firewall только для IP-адресов сети доставки

Метрики и наблюдаемость

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

Доля попаданий в кэш

Процент запросов, обслуженных без похода в исходный слой

TTFB

Скорость, с которой пользователь получает первый байт ответа

Трафик

Объём переданных данных и всплески по регионам

Ключевые алерты:

  • Доля попаданий в кэш < 90% → проверить время жизни и структуру ключей
  • Ошибки исходного слоя > 1% → проблема в origin или промежуточной защите
  • Время до первого байта на p99 > 100 мс → проверить маршрутизацию и путь до исходного слоя
  • Резкий всплеск трафика → возможна атака или внезапный рост популярности контента

Вопросы на интервью

Как обеспечить согласованность при инвалидации кэша?

Использовать версионированные URL для неизменяемого контента, API принудительного сброса для срочных обновлений и подходы вроде stale-while-revalidate там, где допустим короткий период устаревших данных.

Как защитить исходный слой от лавины одинаковых запросов при промахе кэша?

Использовать объединение одинаковых запросов, защитный слой origin, и предварительный прогрев кэша для популярных объектов.

Когда выбирать предварительную загрузку, а когда кэширование по запросу?

Предварительная загрузка подходит для ограниченного набора критичного контента. Кэширование по запросу лучше работает для больших библиотек и длинного хвоста редко востребованных объектов.

Как работать с динамическим контентом?

Использовать , кэширование фрагментов, короткое время жизни с stale-while-revalidate или для сборки персонализированного ответа ближе к пользователю.

Ключевые выводы

  • 1.Сеть доставки контента критична для глобального масштаба: она уменьшает задержку и снимает нагрузку с исходного слоя.
  • 2.Инвалидация кэша остаётся главным источником сложности, поэтому время жизни, версионирование и принудительный сброс нужно проектировать вместе.
  • 3.Защитный слой origin снижает число одновременных обращений к исходному серверу и помогает переживать массовые промахи кэша.
  • 4.Выбор между предварительной загрузкой и кэшированием по запросу зависит от характера контента, требований к свежести и цены промаха.
  • 5.Доля попаданий в кэш и время до первого байта дают наиболее полезную картину того, как сеть доставки контента влияет на пользовательский путь.

Связанные главы

  • Acing the System Design Interview (краткий обзор) - даёт базовую рамку для разбора кейса: требования, оценка масштаба, архитектура и ключевые компромиссы.
  • Object Storage (S3) - раскрывает исходный слой: хранение объектов, долговечность, жизненный цикл данных и поведение при промахе кэша.
  • Designing Data-Intensive Applications, 2nd Edition (short summary) - усиливает фундамент по репликации, консистентности и распределённым компромиссам в глобальной сети доставки.
  • Стратегии кэширования: Cache-Aside, Read-Through, Write-Through, Write-Back - дополняет практику выбора времени жизни, инвалидации и управления долей попаданий в кэш на пограничных узлах.
  • Лента видеохостинга - показывает тяжёлый медиасценарий, где геораспределённая доставка и защита исходного слоя становятся критичными.
  • Система доменных имен (DNS) - поясняет маршрутизацию через систему доменных имен и выбор ближайшей точки присутствия с помощью GeoDNS и эникаста.
  • Примеры задач по системному дизайну - ставит задачу про сеть доставки контента в общий контекст интервью и облегчает сравнение с другими архитектурными кейсами.
  • Uber/Lyft - даёт пример глобальной системы с жёсткими требованиями по задержке, где распределение трафика между регионами критично.
  • URL Shortener (TinyURL) - показывает смежный сценарий с глобальными редиректами, где ответ ближе к пользователю разгружает исходный слой.

Чтобы отмечать прохождение, включи трекинг в Настройки