DNS и путь запроса — Примеры
Пример 1 — Развёртывание, которое продолжало бить в старую машину
Сервис переезжает на новый адрес, при этом срок жизни записи равен 86400 секунд, а миграция идёт в 09:00. К 11:00 примерно половина запросов всё ещё приходит на старый хост, уже выведенный из эксплуатации. Скажите, почему трафик всё ещё идёт туда, и что команда должна была сделать первым делом.
до 09:00: api.internal.example.com -> 198.51.100.7 срок 86400
смена 09:00: api.internal.example.com -> 198.51.100.8 срок 86400
резолвер A кэшировал ответ .7 в 08:59 -> держит до 08:59 завтра
резолвер B кэшировал ответ .7 в 07:00 -> держит до 07:00 завтра
Решение
каждый резолвер, узнавший старый ответ, держит его, пока его копия
не истечёт, — до 24 часов спустя. Изменение верное; оно не видно.
перед миграцией:
1. понизить срок жизни до 60 секунд
2. подождать дольше прежнего срока
3. сменить адрес и развернуть новый хост
4. снова поднять срок, когда трафик переехал
Старый адрес остаётся в каждом кэше на весь срок, который запись объявляла в момент, когда её узнали, поэтому 24-часовой срок открывает 24-часовое окно устаревших ответов; если же понизить значение заранее, поиск после этого обойдётся дёшево. Ловушка в том, чтобы считать смену имени мгновенной: браузер, операционная система, заглушка-резолвер и любая сервисная сетка держат по копии.
Пример 2 — Круговые обходы, которые запрос может и не может убрать
Эндпоинт в далёком регионе отвечает за 480 мс: 40 мс на разрешение из кэша, 150 мс на соединение, 190 мс на рукопожатие безопасности и 100 мс до первого байта. Скажите, какие части исправляет расстояние, а какие может убрать код, и приведите стоимость второго запроса по тому же соединению.
запрос 1: разрешение 40 (кэш) + соединение 150 + рукопожатие 190 + первый байт 100
запрос 2: то же соединение, тот же процесс, соединение всё ещё открыто
Решение
запрос 1 всего: 480 мс
запрос 2 всего: ~100 мс — установка уже оплачена
убираемо: соединение + рукопожатие = 340 мс, за счёт переиспользования соединения
фиксировано: 100 мс до первого байта — один круговой обход через это расстояние
Установка и рукопожатие платятся один раз на соединение, поэтому переиспользованное соединение оставляет второму запросу немногим больше, чем обход «запрос — ответ». Оставшийся обход не может быть быстрее пути, который он пересекает, значит, исправлений всего два: перенести сервер ближе или кэшировать на периферии. Ловушка в оптимизации полезной нагрузки: тело тривиально, и никакое сжатие не задевает стоимость, которую считают круговыми обходами.