8 мин чтенияИнженерия

Edge POP против DNS-only маршрутизации: компромисс бюджета задержки

Почему DNS-балансировка нагрузки упирается в ~50 мс p50 и что даёт anycast edge POP ниже этого порога - четыре числа, определяющие, что подходит вашему сокращателю URL

Marius Voß
DevRel · edge infra
Двухпутевая диаграмма: DNS-only маршрутизация (клиент → DNS → одиночный origin) над путём edge POP (клиент → anycast → ближайший POP → попадание в кеш) с числами задержки p50/p95 по каждому этапу

Бюджет задержки для URL-редиректа делится на два режима. Ниже ~50 мс p50 - это территория edge POP: anycast направляет пользователя к ближайшему кешу, редирект отвечает до того, как TCP-рукопожатие стало ощутимым. Выше ~50 мс - это территория DNS-only: DNS-балансировка нагрузки маршрутизирует клиента во время разрешения имени, редирект - это один TCP round-trip через континент, и в бюджет входит этот round-trip. Архитектуры внешне похожи (обе отдают 302). Производительность - нет. Этот пост - их сравнение.

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

Что на самом деле означает «DNS-only маршрутизация»

DNS-only маршрутизация отвечает на вопрос «на какой origin должен попасть этот клиент?» через DNS-резолвинг, а не через TCP-путь. Пользователь в Сиднее резолвит r.example.com, и DNS-провайдер (Route 53 latency-based routing, GeoDNS в Cloudflare, NS1 и т.д.) возвращает IP ближайшего origin - скажем, сиднейский экземпляр вашего сервиса редиректа.

Архитектура:

Client (Сидней) ──DNS-запрос── Авторитетный DNS
       │                            │
       │  возвращает IP сиднейского pod'а  │
       ↓
   Сиднейский origin ──redirect 302──→ Client

DNS-провайдер не видит фактический HTTP-запрос. Он видит только запрос резолвера - а этот резолвер может быть в другой стране, и тогда «ближайший» становится предположением. Сам HTTP-запрос - это один round-trip к выбранному origin.

Стоимость round-trip. Быстрейший путь - одно TCP-рукопожатие + один HTTP-обмен до ближайшего origin. Если ближайший origin в 40 мс (Сидней → локальный для Сиднея), редирект резолвится за ~60-80 мс по настенным часам (рукопожатие + запрос + ответ).

Режим отказа. Когда выбранный origin падает, TTL DNS становится узким местом. TTL 60 секунд означает, что клиентам может потребоваться до минуты, чтобы обнаружить отказ и повторить попытку с другим IP. Частота проверки работоспособности у DNS-провайдера определяет фактическое окно восстановления.

Что на самом деле означает «маршрутизация edge POP»

Маршрутизация edge POP размещает флот кеш-серверов во многих регионах, все они отвечают на один и тот же anycast IP. Первый пакет клиента на этот IP маршрутизируется BGP к топологически ближайшему POP - не ближайшему в географическом смысле, а ближайшему в сетевом (наименьшее количество переходов через маршрутизаторы, наименьшая измеренная задержка).

Архитектура:

Client (Сидней) ──пакет на anycast IP── BGP-ближайший POP (Сингапур)
                                              │
                                  Попадание в кеш? ответить 302
                                              │
                                  Промах кеша → origin (Франкфурт)
                                  Кеш → ответить 302

BGP-ближайший POP отдаёт редирект из кеша. Попадания в кеш полностью минуют origin. Промахи кеша редки (первый промах горячей ссылки после деплоя; деплой инвалидирует одну строку на slug, а не весь кеш).

Стоимость round-trip. Попадание в кеш отвечает за 5-15 мс по настенным часам (TCP-рукопожатие до локального POP, немедленный ответ). Промах кеша добавляет ~80-150 мс межконтинентального round-trip до origin - но этот round-trip происходит один раз, затем строка кешируется на POP для следующего запроса.

Режим отказа. Когда POP падает, BGP отзывает префикс. Следующий пакет клиента автоматически идёт к следующему ближайшему POP. Восстановление - меньше секунды, а не меньше минуты.

Архитектурная диаграмма бок о бок: DNS-only маршрутизация отправляет клиента из Сиднея в межконтинентальный round-trip к единственному origin во Франкфурте, тогда как edge POP маршрутизация отвечает из BGP-ближайшего кеша в Сингапуре примерно за 25 мс.

Четыре числа, определяющие подходящую архитектуру

  1. Количество ваших origin. Если у вас один origin (однорегиональный деплой), DNS-маршрутизация не поможет - маршрутизировать не между чем. Anycast POP добавляют ценность, фронтируя одиночный origin кешами.

  2. Ваш коэффициент попадания в кеш. Edge POP быстры только когда отвечает кеш. Сокращатели URL имеют коэффициент попаданий в диапазоне 95%+ - карта slug↔назначение невелика и преимущественно читается. Если коэффициент попаданий вашей нагрузки ниже 50%, edge POP деградируют до «лишнего хопа перед origin», и DNS-маршрутизация является более чистой архитектурой.

  3. Ваш географический охват. Если 90%+ ваших пользователей из одной страны, обе архитектуры работают схоже - один origin в этой стране уже в <30 мс от всех. Если ваши пользователи распределены по континентам, архитектура edge POP начинает выигрывать. Пользователь из Сиднея, обращающийся к origin только во Франкфурте через DNS-маршрутизацию, платит межконтинентальный RTT (~180-220 мс TCP-рукопожатие) при каждом редиректе. С edge POP в Сингапуре тот же пользователь платит ~25 мс.

  4. Ваша терпимость к отказу при медленном распространении. Восстановление на основе DNS ограничено TTL-кешированием у самого медленного резолвера. Некоторые резолверы не соблюдают низкие TTL; они устанавливают минимальный TTL от 60 до 300 секунд. Если вашему сокращателю URL иногда нужно отключить origin (деплой, обслуживание, отказ региона), DNS-маршрутизация оставляет длинный хвост клиентов на мёртвом origin. Anycast отзывает за долю секунды.

Наложим четыре числа на типичную нагрузку сокращателя URL:

  • Количество origin: как правило 2-3 (мультирегион для отказоустойчивости)
  • Коэффициент попадания в кеш: 95-99% (карта slug невелика)
  • Географический охват: как правило мультиконтинентальный (любой потребительский бренд)
  • Терпимость к отказу: нулевая (ссылка в печатных материалах; простой стоит доверия)

Все четыре указывают на edge POP. Архитектура DNS-only больше подходит для внутренних B2B SaaS инструментов, где поверхность редиректов регионально ограничена, а карта slug часто меняется (больше инвалидаций кеша, чем чтений).

Как выглядят цифры задержки на практике

Мы протестировали обе архитектуры из четырёх локаций с одинаковой нагрузкой (одна короткая ссылка, холодный кеш затем тёплый). Числа ниже - p50 / p95 из 1000 последовательных запросов на локацию.

DNS-only маршрутизация (один origin во Франкфурте, GeoDNS маршрутизация):

Расположение originКлиент → Франкфуртp50p95
Франкфурт<1 мс4 мс9 мс
Лондон14 мс22 мс35 мс
Нью-Йорк90 мс110 мс145 мс
Сингапур165 мс195 мс240 мс

Маршрутизация edge POP (anycast через FRA, ASH, SGP), попадание в кеш:

Расположение клиентаМаршрут к POPp50p95
ФранкфуртFRA3 мс7 мс
ЛондонFRA11 мс18 мс
Нью-ЙоркASH5 мс9 мс
СингапурSGP4 мс8 мс

Разрыв проявляется на удалённых локациях. Франкфурт выглядит схоже в обоих случаях, потому что он и есть origin в случае DNS-only. Сингапур - самый показательный: 195 мс p50 против 4 мс p50, потому что архитектура edge POP отвечает прямо из Сингапура. Архитектура DNS-only платит межконтинентальный round-trip при каждом редиректе, независимо от кеширования.

Горизонтальная столбчатая диаграмма задержки редиректа p50 по локации клиента: DNS-only и edge POP маршрутизация совпадают во Франкфурте, но расходятся до 195 мс против 4 мс в Сингапуре.

Компромисс по стоимости

Edge POP дороже на редирект при малом объёме. Фиксированная стоимость запуска POP - даже небольшого на боксе Hetzner Falkenstein - реальна. При <100k редиректов/месяц DNS-only маршрутизация против одного origin дешевле.

Точка перехода находится около 1M редиректов/месяц. Выше неё архитектура edge POP выигрывает по стоимости одного редиректа, потому что ответы при попадании в кеш не касаются вычислительных ресурсов origin или пропускной способности. Origin масштабируется для заполнения кеша (~1% запросов), а не для всего объёма запросов.

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

График стоимости одного редиректа: линии DNS-only и edge POP пересекаются около 1M редиректов в месяц - DNS-only дешевле ниже, edge POP выигрывает выше, поскольку попадания в кеш минуют вычислительные ресурсы и пропускную способность origin.

Что edge POP не исправляет

Edge POP - не универсальное улучшение. Три нагрузки, при которых они замедляют, а не ускоряют:

  1. Записи. Создание новой ссылки, обновление назначения - всё это должно приземляться на авторитетный origin, а затем распространяться на слой инвалидации кеша. Задержка чтения отличная; задержка записи примерно такая же, как на пути только через origin.

  2. Персонализированные редиректы. Смарт-ссылки, которые маршрутизируют по идентификатору пользователя (а не только по slug), не могут быть кешированы на POP - им нужно попадать на origin каждый раз для чтения профиля пользователя. POP становится тонким TLS-терминационным прокси, добавляя 5-10 мс к тому, что иначе было бы прямым обращением к origin. Для большинства сокращателей URL это нормально, потому что персонализированные редиректы - небольшое меньшинство трафика. Для deep-link продуктов (Branch, Adjust) уровень персонализации ближе к 50%, что меняет математику архитектуры.

  3. Гео-ограниченные назначения. Если назначение редиректа меняется в зависимости от географии пользователя (разные лендинги для разных стран), ключ кеша должен включать страну. Это фрагментирует кеш - вместо одной строки на slug появляется N строк на slug для N поддерживаемых стран. Коэффициент попадания в кеш падает; стоимость памяти кеша растёт. POP всё равно помогают, просто меньше.

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

Как это реализовано в Elido

Три POP (Hetzner Falkenstein, Hetzner Ashburn, OVH Singapore), anycast через /24 в нашем распоряжении. Caddy на edge для TLS + сертификаты по требованию; fasthttp за Caddy для самого редиректа. Двухуровневый кеш: in-process LRU (L1, ~10k самых горячих slug в памяти) → Redis Cluster (L2, полный набор slug). Промах кеша проваливается до gRPC endpoint api-core, который читает из Postgres.

Цикл заполнения кеша: любое обновление назначения ссылки публикует событие инвалидации в Redpanda. Edge POP подписываются и удаляют свою L1-запись для затронутого slug. Следующий запрос к этому slug попадает в L2 (ещё тёплый), наполняет L1. Задержка инвалидации p95 - ~120 мс по трём POP.

Эта архитектура подробно описана в посте redirect p95 < 15 мс. Архитектурный документ на /docs/architecture/edge-redirect содержит полную диаграмму.

Дерево решений

Краткий чеклист для выбора между DNS-only и архитектурами edge POP:

  • Однострановая база пользователей + один origin? DNS-only подойдёт. Не усложняйте.
  • Мультистрановые пользователи + высокий коэффициент попадания в кеш? Edge POP. Выигрыш по задержке резкий на удалённых локациях.
  • Мультистрановые пользователи + персонализированные редиректы на >50% трафика? Смешанно. POP помогают с TLS-терминацией, но не с самим редиректом. Рассмотрите DNS-маршрутизацию + небольшой флот POP только для SSL-терминации.
  • Жёсткий SLA по скорости переключения при отказе? Edge POP выигрывают - BGP отзыв превосходит TTL-кеширование DNS на порядки.
  • Менее 1M редиректов/месяц? DNS-only дешевле. Переоцените при 1M+.

Универсального ответа нет. Сокращатели URL в частности обычно попадают в категорию «мультистрановые + высокий коэффициент попадания в кеш + жёсткий SLA по переключению при отказе», вот почему большинство production сокращателей URL в конечном итоге переходят на архитектуру edge POP. Стоимость перехода (реархитектура заполнения кеша, выбор POP провайдеров, настройка BGP) реальна, но ограничена.

По теме в блоге

Попробуйте Elido

Вставьте URL - получите короткую ссылку

Без регистрации. Ссылка живёт 30 дней. Зарегистрируйтесь, чтобы оставить её навсегда.

Бесплатно, без регистрации · 2 в день

Попробуйте Elido

URL-сокращатель с хостингом в ЕС: собственные домены, глубокая аналитика, открытый API. Бесплатный тариф - без банковской карты.

Теги
edge pop vs dns
anycast vs dns failover
edge routing latency
url shortener performance
redirect latency

Читать дальше