Ajut la implementarea CloudFront CDN pentru o origine video NGINX HLS. Dacă nu sunteți familiarizat, HLS în browser folosește doar XHR sau preluare pentru a solicita în mod constant fișiere .m3u8 și .ts prin HTTP și pentru a le afișa într-un element video. Am replicat problema pe care o descriu cu apeluri simple AJAX la un interval, deci problema nu este specifică HLS. Aș dori să pot comuta traficul între CDN și direct la origine, cu un impact minim asupra utilizatorilor. Am construit acest lucru și pot comuta între CloudFront și direct la origine, schimbând DNS-ul în Route 53. Înregistrarea DNS are un TTL de 1 minut
Cu toate acestea, când fac acest lucru, uneori adresa IP folosită de browser nu se schimbă - chiar și la mult timp după DNS TTL. Cache-ul DNS la nivel de sistem de operare și browser arată adresa IP așteptată, dar browserul (așa cum se arată în Instrumente pentru dezvoltatori -> Rețea) arată că încă folosește adresa IP „veche”. Poate continua să facă acest lucru timp de câteva ore după DNS TTL. Nici măcar reîmprospătarea paginii nu o va forța să obțină un nou IP pentru domeniu. Până acum, am găsit doar chrome://net-internals/#sockets -> Flush Socket Pools sau închiderea completă a tuturor instanțelor browserului forțează browserul să obțină o nouă adresă IP pentru domeniu.
Deci, sunt destul de sigur că problema este că Chrome (a testat și FireFox, probabil toate browserele), menține o conexiune și nu mai caută DNS până când conexiunea este închisă, indiferent de DNS TTL, mai ales cu ceva de genul HLS video sau un sondaj ajax continuu în care conexiunea este utilizată la fiecare câteva secunde. Pot controla oarecum acest lucru setând anteturile Connection:close sau Keep-Alive:timeout=5s la origine. Cu toate acestea, nu le pot controla la CloudFront, chiar și cu o funcție personalizată. Mai mult, dacă activez HTTP2 la origine și/sau CloudFront, aceste anteturi nu sunt permise sau utilizate, dar încă văd un comportament similar.
De asemenea, pot returna o solicitare HTTP 421 greșit direcționată de la origine și pot forța clienții care lovesc originea să se reîmprospăteze. Cu toate acestea, acest lucru nu funcționează de la CloudFront - utilizarea unei funcții CloudFront pentru a modifica codul de răspuns provoacă o eroare, iar un 421 returnat de la origine la Cloudfront provoacă o eroare și nu determină reîmprospătarea clienților.
Având în vedere toate acestea, cum mă pot asigura că modificările DNS au efect în browser în cadrul TTL al intrării DNS? Există vreo setare antet sau CloudFront pe care să le pot folosi? Pot controla unii dintre clienți, așa că există vreun truc javascript, antet de solicitare sau XHR pentru a forța browserul să obțină și să utilizeze noul TTL?