Рейтинг:0

Как я могу гарантировать, что изменения DNS вступят в силу в течение TTL, даже если браузер повторно использует HTTP-соединения?

флаг gr

Я помогаю реализовать CloudFront CDN для источника видео NGINX HLS. Если вы не знакомы, HLS в браузере просто использует XHR или выборку для постоянного запроса файлов .m3u8 и .ts через HTTP и отображения их в элементе видео. Я воспроизвел проблему, которую описываю, с помощью простых вызовов AJAX с интервалом, поэтому проблема не связана с HLS. Я хотел бы иметь возможность переключать трафик между CDN и прямым источником с минимальным воздействием на пользователей. Я построил это и могу переключаться между CloudFront и прямым источником, изменив DNS в Route 53. Запись DNS имеет TTL 1 минуту.

Однако, когда я это делаю, иногда IP-адрес, используемый браузером, не меняется — даже спустя много времени после DNS TTL. Кэш DNS на уровне ОС и браузера показывает ожидаемый IP-адрес, но браузер (как показано в Инструменты разработчика -> Сеть) показывает, что он все еще использует «старый» IP-адрес. Это может продолжаться в течение нескольких часов после DNS TTL. Даже обновление страницы не заставит ее получить новый IP для домена. До сих пор я нашел только chrome://net-internals/#sockets -> Flush Socket Pools или полное закрытие всех экземпляров браузера, заставляющее браузер получить новый IP-адрес для домена.

Итак, я совершенно уверен, что проблема в том, что Chrome (также проверенный FireFox, вероятно, все браузеры) поддерживает соединение и не ищет DNS снова, пока соединение не будет закрыто, независимо от DNS TTL, особенно с чем-то вроде HLS видео или непрерывный опрос ajax, когда соединение используется каждые несколько секунд. Я могу несколько контролировать это, устанавливая заголовки Connection:close или Keep-Alive:timeout=5s в источнике. Однако я не могу управлять ими в CloudFront даже с помощью пользовательской функции. Более того, если я включаю HTTP2 в источнике и/или CloudFront, эти заголовки не разрешаются и не используются, но я все равно вижу подобное поведение.

Я также могу вернуть ошибочный запрос HTTP 421 из источника и заставить клиентов, попадающих в источник, обновиться. Однако это не работает из CloudFront — использование функции CloudFront для изменения кода ответа вызывает ошибку, а 421, возвращаемый из источника в Cloudfront, вызывает ошибку и не запускает обновление клиентов.

Учитывая все это, как я могу гарантировать, что изменения DNS вступят в силу в браузере в пределах TTL записи DNS? Есть ли какие-либо настройки заголовка или CloudFront, которые я могу использовать? Я могу управлять некоторыми клиентами, так что есть ли какой-нибудь javascript, заголовок запроса или трюк XHR, чтобы заставить браузер получить и использовать новый TTL?

Patrick Mevzek avatar
флаг cn
«не искать DNS снова, пока соединение не будет закрыто» Почему это должно быть? DNS просто используется для открытия соединения, когда он открыт и остается открытым, DNS бесполезен/не нужен. Внедрение Keep Alive таким образом приведет к потере большого количества ресурсов. Если соединение открыто и браузер получает от него то, что ему нужно/запросил, зачем ему снова обращаться к DNS и, возможно, открывать новое соединение, если этот текущий IP-адрес достаточно хорош (отвечает)? Ваша проблема, похоже, на самом деле не связана с DNS или браузерами, просто больше связана с контролем, который у вас есть или нет на сервере.
флаг us
Каков фактический вариант использования для переключения между исходным сервером и CDN? Чего вы пытаетесь достичь?
флаг gr
@Tero Вариант использования заключается в том, что мы хотим иметь возможность переключать зрителей с получения видео из CloudFront на получение его напрямую из локального источника и наоборот как можно быстрее и беспрепятственно. Мы хотим платить за CloudFront только тогда, когда ожидаем высокую нагрузку. Когда нам больше не нужен CloudFront, мы можем изменить DNS, чтобы новые подключения разрешались обратно в локальный источник. Это работает. Однако мы обнаружили, что некоторые подключения в CloudFront «застревают» далеко за пределами DNS TTL, и сузили его до такого поведения постоянного подключения.
флаг gr
@PatrickMevzek Да, DNS и браузер ведут себя так, как это имеет смысл при обычном использовании. Я просто ищу способ запустить новый поиск DNS всякий раз, когда мы меняем DNS. «Почему это должно беспокоить» заключается в том, что мы должны платить за CloudFront — мы хотим, чтобы этот трафик возвращался из CloudFront и направлялся прямо к источнику как можно быстрее — по крайней мере, в пределах срока жизни, установленного для DNS. В нынешнем виде трафик может «зависать» в CloudFront намного дольше DNS TTL — в некоторых тестах я измерял более 4 часов.
флаг us
Ваш единственный вариант, вероятно, будет искать какой-то другой CDN, где вы можете правильно реализовать код состояния «421». Или спросите у AWS, могут ли они изменить свою реализацию. Браузеры работают так, как они работают, и вы не можете изменить их поведение.

Ответить или комментировать

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