Что такое CDN и зачем он нужен?
CDN (Content Delivery Network) — географически распределённая сеть серверов (edge servers), предназначенная для быстрой доставки контента пользователям путём размещения копий контента на серверах, расположенных максимально близко к конечным пользователям.
Аналогия из жизни: CDN — это сеть складов интернет-магазина по всей стране. Вместо того чтобы отправлять каждый заказ из центрального склада в Москве (origin-сервер), магазин хранит популярные товары на складах в каждом крупном городе (edge-серверы). Покупатель из Новосибирска получает товар с местного склада за 1 день, а не за 5.
Как работает CDN
Пример
Без CDN:
Пользователь (Москва) ──── 200 мс ────→ Origin-сервер (Нью-Йорк)
С CDN:
Пользователь (Москва) ── 20 мс ──→ CDN Edge (Москва)
├── cache hit → ответ сразу (~20 мс)
└── cache miss → Origin → кэширование → ответ
- Пользователь запрашивает
https://cdn.example.com/image.jpg - DNS направляет запрос на ближайший edge-сервер CDN (через anycast или geo-DNS)
- Если контент есть в кэше edge-сервера (cache hit) — возвращается сразу
- Если нет (cache miss) — edge-сервер запрашивает origin-сервер, кэширует ответ и возвращает пользователю
- При последующих запросах от других пользователей из того же региона — ответ из кэша
Зачем нужен CDN
| Преимущество | Описание |
|---|---|
| Снижение задержки | Контент ближе к пользователю → быстрее загрузка |
| Снижение нагрузки на origin | Большинство запросов обслуживается кэшем CDN |
| Высокая доступность | Если один edge-сервер недоступен, запрос перенаправляется на другой |
| Защита от DDoS | CDN поглощает трафик атаки на своих серверах, не пропуская его к origin |
| Пропускная способность | CDN может обслуживать терабайты трафика (видео, обновления ПО) |
Что обычно раздаётся через CDN
- Статические файлы: изображения, CSS, JavaScript, шрифты, иконки
- Видеостриминг: Netflix, YouTube, Twitch
- Загрузка файлов: обновления ОС, дистрибутивы, патчи игр
- API-ответы: read-heavy API с правильными заголовками кэширования
Популярные CDN-провайдеры
| Провайдер | Особенности |
|---|---|
| Cloudflare | Бесплатный тариф, DDoS-защита, DNS, WAF |
| AWS CloudFront | Интеграция с AWS (S3, EC2, Lambda@Edge) |
| Akamai | Крупнейшая CDN, enterprise-уровень |
| Google Cloud CDN | Интеграция с GCP |
| Fastly | Instant purge, edge computing (VCL/Wasm) |
Заголовки кэширования (ключевые для работы CDN)
| Заголовок | Значение | Эффект |
|---|---|---|
Cache-Control: public, max-age=31536000 |
Кэшировать публично, 1 год | CDN и браузер кэшируют |
Cache-Control: private, max-age=3600 |
Кэшировать только у клиента | CDN НЕ кэширует |
Cache-Control: no-cache |
Проверять у origin перед отдачей | Условные запросы (ETag/304) |
Cache-Control: no-store |
Не кэшировать вообще | Конфиденциальные данные |
ETag / Last-Modified |
Для условных запросов | 304 Not Modified (экономия трафика) |
Для Java-разработчика
Статические ресурсы приложения (JS, CSS) лучше отдавать через CDN. Правильная настройка Cache-Control в Spring Boot:
Конфигурация кэширования статики в Spring Boot
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/")
.setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS)
.cachePublic()
.immutable());
}
}
Дополнительные аспекты:
- API-ответы обычно не кэшируются на CDN, но для read-heavy API (каталоги, справочники) это может значительно снизить нагрузку
- Для инвалидации кэша используйте versioned URLs (
app.v2.js) или content hash (app.a1b2c3.js) вместо ручного purge - Spring Boot с
spring.resources.chain.strategy.content.enabled=trueавтоматически добавляет content hash к именам файлов
Вывод
CDN — критически важный компонент инфраструктуры для любого продукта с пользователями в разных регионах. Он ускоряет доставку контента, снижает нагрузку на origin и обеспечивает защиту от DDoS. Правильная настройка заголовков кэширования — ключ к эффективному использованию CDN.
На собеседовании: объясните механизм работы (DNS → edge → cache hit/miss → origin), разницу между
Cache-Control: publicиprivate, и стратегию инвалидации кэша (versioned URLs vs manual purge). Часто спрашивают в связке с оптимизацией производительности веб-приложений.