Tôi đang giúp triển khai CloudFront CDN cho nguồn gốc video NGINX HLS. Nếu bạn chưa quen, HLS trong trình duyệt chỉ sử dụng XHR hoặc tìm nạp để liên tục yêu cầu các tệp .m3u8 và .ts qua HTTP và hiển thị chúng trong phần tử video. Tôi đã sao chép sự cố mà tôi đang mô tả bằng các lệnh gọi AJAX đơn giản trong một khoảng thời gian, vì vậy sự cố không dành riêng cho HLS. Tôi muốn có thể chuyển đổi lưu lượng truy cập giữa CDN và trực tiếp đến nguồn gốc với tác động tối thiểu đến người dùng. Tôi đã xây dựng tính năng này và có thể chuyển đổi giữa CloudFront và direct-to-origin bằng cách thay đổi DNS ở Tuyến 53. Bản ghi DNS có TTL là 1 phút
Tuy nhiên, khi tôi làm như vậy, đôi khi địa chỉ IP được trình duyệt sử dụng không thay đổi - thậm chí rất lâu sau DNS TTL. Bộ nhớ cache DNS cấp hệ điều hành và trình duyệt hiển thị địa chỉ IP dự kiến, nhưng trình duyệt (như được hiển thị trong Công cụ dành cho nhà phát triển -> Mạng) cho thấy nó vẫn đang sử dụng địa chỉ IP "cũ". Nó có thể tiếp tục làm điều này trong vài giờ sau DNS TTL. Ngay cả khi làm mới trang cũng sẽ không buộc nó phải nhận IP mới cho miền. Cho đến nay, tôi chỉ tìm thấy chrome://net-internals/#sockets -> Flush Socket Pools hoặc đóng hoàn toàn tất cả các phiên bản trình duyệt buộc trình duyệt phải nhận địa chỉ IP mới cho miền.
Vì vậy, tôi khá chắc chắn rằng vấn đề là Chrome (cũng đã thử nghiệm FireFox, có thể là tất cả các trình duyệt), duy trì kết nối và không tra cứu lại DNS cho đến khi kết nối bị đóng, bất kể TTL DNS là gì, đặc biệt là với những thứ như HLS video hoặc bỏ phiếu ajax liên tục trong đó kết nối đang được sử dụng cứ sau vài giây. Tôi có thể kiểm soát phần nào điều này bằng cách đặt các tiêu đề Connection:close hoặc Keep-Alive:timeout=5s trên nguồn gốc. Tuy nhiên, tôi không thể kiểm soát những thứ này tại CloudFront, ngay cả với chức năng tùy chỉnh. Hơn nữa, nếu tôi bật HTTP2 tại Origin và/hoặc CloudFront, những tiêu đề này không được phép hoặc sử dụng, nhưng tôi vẫn thấy hành vi tương tự.
Tôi cũng có thể trả lại Yêu cầu chuyển hướng sai HTTP 421 từ nguồn gốc và buộc các máy khách truy cập vào nguồn gốc để làm mới. Tuy nhiên, điều này không hoạt động từ CloudFront - việc sử dụng chức năng CloudFront để sửa đổi mã phản hồi sẽ gây ra lỗi và 421 được trả về từ nguồn gốc cho Cloudfront gây ra lỗi và không kích hoạt máy khách làm mới.
Với tất cả những điều này, làm cách nào tôi có thể đảm bảo rằng các thay đổi DNS có hiệu lực trong trình duyệt trong TTL của mục nhập DNS? Tôi có thể sử dụng bất kỳ tiêu đề hoặc cài đặt CloudFront nào không? Tôi có thể kiểm soát một số ứng dụng khách, vậy có bất kỳ thủ thuật javascript, tiêu đề yêu cầu hoặc XHR nào để buộc trình duyệt nhận và sử dụng TTL mới không?