ฉันกำลังช่วยติดตั้ง CloudFront CDN สำหรับต้นทางวิดีโอ NGINX HLS หากคุณไม่คุ้นเคย HLS ในเบราว์เซอร์จะใช้ XHR หรือการดึงข้อมูลเพื่อขอไฟล์ .m3u8 และ .ts อย่างต่อเนื่องผ่าน HTTP และแสดงในองค์ประกอบวิดีโอ ฉันได้จำลองปัญหาที่ฉันอธิบายไว้ด้วยการเรียก AJAX อย่างง่ายตามช่วงเวลา ดังนั้นปัญหาจึงไม่เฉพาะเจาะจงกับ HLS ฉันต้องการสลับการรับส่งข้อมูลระหว่าง CDN และ direct-to-origin โดยมีผลกระทบต่อผู้ใช้น้อยที่สุด ฉันได้สร้างสิ่งนี้ขึ้นมาแล้ว และสามารถสลับระหว่าง CloudFront และ direct-to-origin ได้โดยเปลี่ยน 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 Misdirected Request จากต้นทางและบังคับให้ลูกค้ากดปุ่มต้นทางเพื่อรีเฟรช อย่างไรก็ตาม สิ่งนี้ใช้ไม่ได้จาก CloudFront - การใช้ฟังก์ชัน CloudFront เพื่อแก้ไขโค้ดตอบกลับทำให้เกิดข้อผิดพลาด และ 421 ที่ส่งคืนจากต้นทางไปยัง Cloudfront ทำให้เกิดข้อผิดพลาดและไม่ทำให้ไคลเอ็นต์รีเฟรช
จากทั้งหมดนี้ ฉันจะแน่ใจได้อย่างไรว่าการเปลี่ยนแปลง DNS มีผลในเบราว์เซอร์ภายใน TTL ของรายการ DNS มีส่วนหัวหรือการตั้งค่า CloudFront ที่ฉันสามารถใช้ได้หรือไม่ ฉันสามารถควบคุมไคลเอนต์บางตัวได้ แล้วมีจาวาสคริปต์ ส่วนหัวคำขอ หรือเคล็ดลับ XHR ใดที่จะบังคับให้เบราว์เซอร์รับและใช้ TTL ใหม่หรือไม่