The Content Delivery Network (CDN)
Problem statement - Постановка задачи
Начнем с вопроса: если миллионы пользователей по всему миру используют наши ресурсоемкие приложения, а наш сервис развернут в едином дата-центре для обработки запросов пользователей, какие возможные проблемы могут возникнуть?
Возможные проблемы:
- Высокая задержка (High latency): Пользователи будут сталкиваться с высокой задержкой из-за физического расстояния от обслуживающего дата-центра. Задержка, воспринимаемая пользователем, имеет много компонентов, таких как задержки передачи (зависят от доступной пропускной способности), задержки распространения (функция расстояния), задержки очередей (зависят от загрузки сети) и задержки обработки узлов. Таким образом, передача данных на большие расстояния приводит к увеличению задержки. Реальному времени приложениям требуется задержка менее 200 миллисекунд (мс) в общем случае. Для телефонии через Интернет (VoIP) задержка не должна превышать 150 мс, тогда как приложения потокового видео не могут допускать задержку более нескольких секунд.
Примечание: Согласно одному из измерений, проведенному 21 декабря 2021 года, средняя задержка от US East (Вирджиния) до US West (Калифорния) составляла 62,9 мс. Между континентами, например, от US East (Вирджиния) до Африки (Кейптаун), задержка составляла 225,63 мс. Это двусторонняя задержка, известная как задержка "туда-обратно" (round-trip latency).

Data-intensive applications - Ресурсоемкие приложения
Ресурсоемкие приложения требуют передачи большого объема данных. На большом расстоянии это может стать проблемой из-за того, что сетевой путь проходит через различные типы интернет-провайдеров (ISP). Из-за некоторых сегментов с меньшим максимальным размером передаваемого пакета (MTU) пропускная способность приложений в сети может снижаться. Также разные участки сетевого пути могут иметь разные характеристики загрузки. Проблема усугубляется с ростом числа пользователей, поскольку исходные серверы будут вынуждены предоставлять данные каждому пользователю индивидуально. Это означает, что первичный дата-центр будет вынужден отправлять много избыточных данных при запросе от нескольких клиентов. Приложения, использующие потоковые сервисы, являются как ресурсоемкими, так и динамическими по своей природе.
Примечание: Согласно опросу, 78% потребителей в Соединенных Штатах используют потоковые сервисы, что на 25% больше за последние пять лет.
Scarcity of data center resources - Нехватка ресурсов дата-центра
Такие важные ресурсы дата-центра, как вычислительная мощность и пропускная способность, становятся ограничением, когда количество пользователей сервиса значительно увеличивается. Сервисы, обслуживающие миллионы пользователей одновременно, нуждаются в масштабировании. Даже если масштабирование достигается в одном дата-центре, он может стать единой точкой отказа, если дата-центр выйдет из строя из-за природных катастроф или проблем с подключением к Интернету.

Примечание: Согласно одному исследова нию, YouTube, Netflix и Amazon Prime в совокупности генерировали 80% интернет-трафика в 2020 году. В 2016 году CDN-провайдер Akamai обслуживал от 15% до 30% веб-трафика (около 30 терабит в секунду). Для 90% пользователей Интернета Akamai находился всего в одном переходе (hop) от них. Поэтому у нас есть веские причины для оптимизации доставки и потребления этих данных, не превращая ядро Интернета в узкое место.
How will we design a CDN? - Как мы будем проектировать CDN?
Мы разделили проектирование CDN на шесть уроков:
- Introduction to a CDN: Мы дадим подробное введение в CDN и определим функциональные и нефункциональные требования.
- Design of a CDN: Мы объясним, как спроектировать CDN. Также кратко опишем дизайн API.
- In-depth Investigation of CDN: Part 1: Этот урок объясняет стратегии кэширования и архитектуру CDN. Также обсудим различные подходы к поиску ближайшего прокси-сервера.
- In-depth Investigation of CDN: Part 2: Мы обсудим, как поддерживать консистентность контента в CDN и развертывание прокси-серверов. Также подробно рассмотрим специализированные и пользовательские CDN.
- Evaluation of CDN: Этот урок предоставит оценку нашего предложенного дизайна.
- Quiz on CDN System Design: Мы закрепим основные концепции проектирования CDN с помощью викторины.
Давайте подумаем над решением обсуждаемых проблем в следующем уроке.
Introduction to a CDN
Proposed solution - Предложенное решение
Решением всех обсужденных проблем является сеть доставки контента (CDN). CDN представляет собой группу географически распределенных прокси-серверов. Прокси-сервер — это промежуточный сервер между клиентом и исходным сервером. Прокси-серверы размещены на границе сети. Поскольку граница сети близка к конечным пользователям, размещение прокси-серверов помогает быстро доставлять контент конечным пользователям, сокращая задержку и экономя полосу пропускания. CDN обладает дополнительным интеллектом по сравнению с простым прокси-сервером.
Мы можем приблизить данные к пользователю, разместив небольшой дата-центр рядом с пользователем и храня там копии данных. CDN в основном хранит два типа данных: статические и динамические. CDN нацелен на сокращение задержки распространения, приближая данные к пользователям. Провайдеры CDN прилагают дополнительные усилия, чтобы обеспечить достаточную пропускную способность по всему пути и приблизить данные к пользователям (возможно, внутри их интернет-провайдера). Они также стараются уменьшить задержки передачи и очередей, поскольку, предположительно, у интернет-провайдера больше доступной пропускной способности внутри автономной системы.
Рассмотрим, как CDN решает обсуждаемые проблемы:
-
Высокая задержка: CDN приближает контент к конечным пользователям, что сокращает физическое расстояние и уменьшает задержку.
-
Ресурсоемкие приложения: Поскольку путь к данным включает только интернет-провайдера и близлежащие компоненты CDN, нет проблем с обслуживанием большого числа пользователей через несколько компонентов CDN в конкретной области. Как показано ниже, исходный дата-центр должен будет предоставить данные локальным компонентам CDN только один раз, тогда как локальные компоненты CDN смогут предоставлять данные разным пользователям индивидуально. Ни одному пользователю не нужно будет загружать свою копию данных с исходных серверов.
Примечание: Различные протоколы потоковой передачи используются провайдерами CDN для доставки динамического контента. Например, CDNsun использует Real-time Messaging Protocol (RTMP), HTTP Live Streaming (HLS), Real-time Streaming Protocol (RTSP) и многие другие для доставки динамического контента.
- Нехватка ресурсов дата-центра: CDN используется для обслуживания популярного контента. По этой причине большая часть трафика обрабатывается на уровне CDN, а не на исходных серверах. Таким образом, различные локальные или распределенные компоненты CDN делят нагрузку н а исходные серверы.

Примечание: Некоторые известные провайдеры CDN включают Akamai, StackPath, Cloudflare, Rackspace, Amazon CloudFront и Google Cloud CDN.
Does a CDN cache all content from the origin server?
Details
Answer
Not likely. A CDN caches a considerable portion of the content depending on its capabilities, and it mostly caches the static content.It also depends on the size of the content. For example, it might be possible for Netflix to store more than 90% of its movies in the CDN, while this might not be feasible for a service like YouTube due to the humongous volume of content.
Requirements - Требования
Рассмотрим функциональные и нефункциональные требования, которые мы ожидаем от CDN.
Functional requirements - Функциональные требования
Следующие функциональные требования будут частью нашего дизайна:
-
Retrieve (Получение): В зависимости от типа моделей CDN, CDN должен уметь получать контент с исходных серверов. Мы рассмотрим модели CDN в следующем уроке.
-
Request (Запрос): Доставка контента с прокси-сервера осуществляется по запросу пользователя. Прокси-серверы CDN должны иметь возможность отвечать на каждый запрос пользователя в этом отношении.
-
Deliver (Доставка): В случае модели push исходные серверы должны иметь возможность отправлять контент на прокси-серверы CDN.
-
Search (Поиск): CDN должен уметь выполнять поиск по запросу пользователя для кэшированного или иным образом хранящегося контента в инфраструктуре CDN.
-
Update (Обновление): В большинстве случаев контент поступает с исходного сервера, но если мы запускаем скрипт в CDN, CDN должен уметь обновлять контент на одноранговых прокси-серверах CDN в точке присутствия (PoP).
-
Delete (Удаление): В зависимости от типа контента (статический или динамический) должно быть возмо жно удалять кэшированные записи с серверов CDN после определенного периода.

Non-functional requirements - Нефункциональные требования
-
Performance (Производительность): Минимизация задержки является одной из основных задач CDN. Предлагаемый дизайн должен обеспечивать минимально возможную задержку.
-
Availability (Доступность): CDN должны быть доступны в любое время из-за их важности. Доступность также включает защиту от атак, таких как DDoS.
-
Scalability (Масштабируемость): Увеличивающееся количество пользователей будет запрашивать контент через CDN. Наше предлагаемое решение CDN должно иметь возможность горизонтального масштабирования по мере роста требований.
-
Reliability and security (Надежность и безопасность): Наш д изайн CDN должен обеспечивать отсутствие единой точки отказа. Помимо сбоев, спроектированная CDN должна надежно справляться с огромными нагрузками на трафик. Более того, CDN должны обеспечивать защиту размещенного контента от различных атак.

Building blocks we will use

DNS is the service that maps human-friendly CDN domain names to machine-readable IP addresses. This IP address will take the users to the specified proxy server.
Load balancers distribute millions of requests among the operational proxy servers.
Design of a CDN
CDN Design - Проектирование CDN
Мы объясним проектирование CDN в двух фазах. В первой ф азе мы рассмотрим компоненты, составляющие CDN. К концу этой фазы мы поймем, зачем нужен каждый компонент. Во второй фазе мы исследуем рабочий процесс, объясняя, как каждый компонент взаимодействует с другими, чтобы создать полнофункциональный CDN. Давайте начнем.
CDN Components - Компоненты CDN
Следующие компоненты составляют CDN:
-
Clients (Клиенты): Конечные пользователи используют различные клиенты, такие как браузеры, смартфоны и другие устройства, чтобы запрашивать контент у CDN.
-
Routing system (Система маршрутизации): Система маршрутизации направляет клиентов к ближайшему узлу CDN. Для этого этот компонент получает данные от различных систем, чтобы понять, где размещен контент, сколько запросов сделано на конкретный контент, какую нагрузку обрабатывает определенный набор серверов и пространство имен URI (Uniform Resource Identifier) для различных контентов. В следующем уроке мы обсудим различные механизмы маршрутизации для пе ренаправления пользователей к ближайшему узлу CDN.
-
Scrubber servers (Серверы очистки): Серверы очистки используются для отделения "чистого" трафика от вредоносного и защиты от известных атак, таких как DDoS. Серверы очистки обычно используются только при обнаружении атаки. В этом случае трафик очищается и затем направляется к целевому назначению.
-
Proxy servers (Прокси-серверы): Прокси-серверы или пограничные прокси-серверы предоставляют контент из оперативной памяти пользователям. Прокси-серверы хранят горячие данные в ОЗУ, хотя они также могут хранить холодные данные на SSD или жестком диске. Эти серверы также предоставляют информацию о счетах и получают контент от системы распространения.
-
Distribution system (Система распространения): Система распространения отвечает за распространение контента на все пограничные прокси-серверы в различных узлах CDN. Эта система использует Интернет и интеллектуальные методы широковещательной передачи для распространения контента на активные пограничные прокси-серверы.
-
Origin servers (Исходные серверы): Инфраструктура CDN предоставляет пользователям данные, полученные с исходных серверов. Исходные серверы обслуживают любые недоступные данные в CDN для клиентов. Исходные серверы используют соответствующие хранилища для хранения контента и других метаданных. Однако мы не будем обсуждать внутреннюю архитектуру исходной инфраструктуры здесь.
-
Management system (Система управления): Системы управления важны для CDN с точки зрения бизнеса и управления, где постоянно наблюдается использование ресурсов и статистика. Этот компонент измеряет важные метрики, такие как задержка, время простоя, потеря пакетов, нагрузка на сервер и так далее. Для сторонних CDN информация о счетах также может использоваться для выставления счетов.

Workflow - Рабочий процесс
Рабочий процесс для абстрактного дизайна выглядит следующим образом:
-
URI Namespace Delegation: Исходные серверы предоставляют делегирование пространства имен URI для всех объектов, кэшированных в CDN, системе маршрутизации запросов.
-
Content Publishing: Исходный сервер публикует контент в системе распространения, которая отвечает за распространение данных по активным пограничным прокси-серверам.
-
Content Distribution: Система распространения распределяет контент между прокси-серверами и предоставляет обратную связь системе маршрутизации запросов. Эта обратная связь помогает оптимизировать выбор ближайшего прокси-сервера для запрашивающего клиента. Обратная связь содержит информацию о том, какой контент кэширован на каком прокси-сервере, чтобы перенаправить трафик на соответствующие прокси-серверы.
-
Client Request: Клиент запрашивает систему маршрутизации о подходящем прокси-сервере.
-
Return IP: Система маршрутизации возвращает IP-адрес соответствующего прокси-сервера.
-
Traffic Scrubbing: Запрос клиента проходит через серверы очистки по соображениям безопасности.
-
Forwarding to Proxy: Сервер очистки пересылает чистый трафик на пограничный прокси-сервер.
-
Serving Content: Пограничный прокси-сервер обслуживает запрос клиента и периодически передает информацию о счетах в систему управления. Система управления обновляет исходные серверы и отправляет обратную связь системе маршрутизации о статистике и деталях контента. Однако запрос перенаправляется на исходные серверы, если контент недоступен на прокси-серверах. В случае, если контент не найден на пограничных прокси-серверах, возможна иерархия прокси-серверов, и запрос передается на родительские прокси-серверы.
API Design - Дизайн API
В этом разделе мы рассмотрим дизайн API для функциональностей, предлагаемых CDN. Это поможет понять, как CDN будет получать запросы от клиентов, получать контент от исходных серверов и взаимодействовать с другими компонентами сети. Разработаем API для следующих функциональностей:
- Retrieve content (Получение контента)
- Deliver content (Доставка контента)
- Request content (Запрос контента)
- Search content (Поиск контента)
- Update content (Обновление контента)
- Delete content (Удаление контента)
Контент может быть любым, например, файлом, видео, аудио или другим веб-объектом. Здесь мы будем использовать слово "контент" для обозначения всех вышеперечисленных типов данных. Для простоты мы не будем обсуждать параметры, связанные с конфиденциальностью, такие как: является ли контент публичным или частным, кто должен иметь доступ к этому контенту, должен ли он быть зашифрован и так далее.
Retrieve (proxy server to origin server) - Получение (прокси-сервер к исходному серверу)
Если прокси-серверы запрашивают контент, метод GET получает контент через следующий API /retrieveContent:
retrieveContent(proxyserver_id, content_type, content_version, description)
Details of Parameters - Подробности параметров
| Parameter | Description |
|---|---|
| proxyserver_id | Уникальный идентификатор запрашивающего прокси-сервера. |
| content_type | Эта структура данных содержит информацию о запрашиваемом контенте. В частности, она включает категорию (аудио, видео, документ, скрипт и т.д.), тип клиентов, для которых запрашивается контент, и запрашиваемое качество (если есть). |
| content_version | Представляет номер версии контента. Для API /retrieveContent параметр content_version будет содержать текущую версию контента, находящегося на прокси-сервере. Если на прокси-сервере нет предыдущей версии, то content_version будет NULL. |
| description | Указывает подробности о контенте, например, расширение видео, данные о разрешении и т.д., если content_type — это видео. |
API возвращает ответ в виде JSON файла, который содержит текст, типы контента, ссылки на изображения или видео в контенте и так далее.
"Object_links": [
{
"name": "videos"
"link": https://app_server.com/api/assets/videos/
},
{
"name": "illustrations"
"link": https://app_server.com/api/assets/illustrations/
},
]
Deliver (origin server to proxy servers) - Доставка (исходный сервер к прокси-серверам)
Исходные серверы используют этот API для доставки указанного контента, обновленной версии, на прокси-серверы через систему распространения. Этот API называется /deliverContent:
deliverContent(origin_id, server_list, content_type, content_version, description)
Подробности параметров
| Параметр | Описание |
|---|---|
| origin_id | Уникально идентифицирует каждый исходный сервер. |
| server_list | Определяет список серверов, на которые контент будет передан системой распространения. |
| content_version | Представляет обновленную версию контента на исходном сервере. Прокси-сервер, получивший контент, удалит предыдущую версию. |
Остальные параметры уже были объяснены выше.
Request (clients to proxy servers) - Запрос (клиенты к прокси-серверам)
Пользователи используют этот API для запроса контента у прокси-серверов. Этот API называется /requestContent:
requestContent(user_id, content_type, description)
Подробности параметра
| Параметр | Описание |
|---|---|
| user_id | Уникальный идентификатор пользователя, который запрашивает контент. |
Указанный прокси-сервер возвращает запрашиваемый контент пользователю в ответ на вызов вышеупомянутого API.
"Object_links": [
{
"name": "components"
"link": https://cdn.app_server.com/api/components/
},
{
"name": "css"
"link": https://cdn.app_server.com/api/css/
},
{
"name": "illustrations"
"link": https://cdn.app_server.com/api/assets/illustrations/
},
{
"name": "videos"
"link": https://cdn.app_server.com/api/assets/videos/
},
{
"name": "icons"
"link": https://cdn.app_server.com/api/icons/
},
{
"name": "fonts"
"link": https://cdn.app_server.com/api/fonts/
},
]
Search (proxy server to peer proxy servers) - Поиск (прокси-сервер к одноранговым прокси-серверам)
Хотя контент сначала ищется локально на прокси-сервере, прокси-серверы могут также искать запрашиваемый контент на одноранговых прокси-серверах в той же точке присутствия (PoP) через API /searchContent. Этот запрос может быть отправлен на все прокси-серверы в PoP. В качестве альтернативы можно использовать хранилище данных в PoP для поиска контента, хотя прокси-серверам потребуется поддерживать информацию о том, какой контент доступен на каком прокси-сервере.
Пример API /searchContent приведен ниже:
searchContent(proxyserver_id, content_type, description)
Update (proxy server to peer proxy servers) - Обновление (прокси-сервер к одноранговым прокси-серверам)
Прокси-серверы используют API /updateContent для обновления указанного контента на одноранговых прокси-серверах в точке присутствия (PoP). Это происходит, когда на CDN выполняются изолированные скрипты, чтобы предоставлять такие услуги, как изменение размера изображений, преобразование разрешения видео, обеспечение безопасности и многое другое. Этот тип скриптов называется безсерверным скриптингом (serverless scripting).
Пример API /updateContent приведен ниже:
updateContent(proxyserver_id, content_type, description)
Подробности параметра
| Параметр | Описание |
|---|---|
| proxyserver_id | Уникально идентифицирует прокси-сервер в PoP для обновления контента. |
Остальные параметры уже были объяснены выше.
Примечание: API для удаления здесь не рассматривается. В нашей главе о кэшировании мы подробно обсудили различные механизмы вытеснения. Эти механизмы также применимы для удаления контента в CDN. Тем не менее, могут возникнуть ситуации, когда потребуется использовать API удаления. В следующем уроке мы рассмотрим несколько механизмов обеспечения консистентности контента, таких как время хранения контента в кэше.
В предстоящих уроках мы углубимся в характеристики CDN.
In-depth Investigation of CDN: Part 1
Content Caching Strategies in CDN - Стратегии кэширования контента в CDN
Идентификация контента для кэширования играет важную роль в доставке актуального и популярного веб-контента. Для обеспечения своевременного обновления используются две классификации CDN, которые получают контент с исходных серверов.
Push CDN
В модели Push CDN контент автоматически отправляется на прокси-серверы CDN с исходного сервера. Ответственность за доставку контента на прокси-серверы CDN лежит на поставщике контента. Push CDN подходит для доставки статического контента, когда исходный сервер решает, какой контент доставлять пользователям через CDN. Контент передается на прокси-серверы в различных локациях в зависимости от его популярности. Однако если контент быстро меняется, модель Push может испытывать трудности с обновлением и совершать избыточные передачи контента.

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

Как уже упоминалось, Push CDN в основном используется для доставки статического контента. Поскольку статический контент предоставляется широкому кругу пользователей дольше, чем динамический контент, схема Push CDN поддерживает большее количество реплик по сравнению с Pull CDN, что улучшает доступность. С другой стороны, Pull CDN предпочтительнее для часто изменяющегося контента и высокого трафика. Низкое потребление памяти — одно из основных преимуществ Pull CDN.
Let’s say you’re managing a website with two distinct content types:
- News feed: Frequently updated articles and blog posts with varying popularity.
- Static assets: Infrequently updated items, including the company logo, website design elements, and product images.
Choose between a push CDN and a pull CDN for each content type. Justify your choice.
Details
Answer
For managing a website with two distinct content types, the choice between a push CDN and a pull CDN should be as follows:Push CDN should be used for static assets such as the company logo, website design elements, and product images. This is because these items change infrequently, and using a push CDN allows for these assets to be pre-uploaded to edge servers. This ensures consistent branding and fast loading times for users, as the content is served directly from a nearby server, reducing latency.
Pull CDN is more suitable for the news feed, which consists of frequently updated articles and blog posts with varying popularity. The dynamic nature of this content type makes a pull CDN ideal, as it only fetches content from the origin server upon user request. This approach helps to conserve storage on edge servers and ensures that the content is up-to-date.
Примечание: Большинство поставщиков контента используют оба подхода кэширования, как Pull, так и Push CDN, чтобы получить преимущества обоих методов.