Điểm:0

Làm cách nào để đảm bảo các thay đổi DNS có hiệu lực trong TTL, ngay cả khi trình duyệt sử dụng lại các kết nối HTTP?

lá cờ gr

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?

Patrick Mevzek avatar
lá cờ cn
"không tra cứu lại DNS cho đến khi đóng kết nối" Tại sao nên làm như vậy? DNS chỉ được sử dụng để mở kết nối, một khi nó được mở và vẫn mở, DNS sẽ vô dụng/không cần thiết. Thực hiện duy trì hoạt động theo cách đó sẽ lãng phí rất nhiều tài nguyên. Nếu kết nối đang mở và trình duyệt đang nhận được những gì nó cần/đã yêu cầu, tại sao nó phải tham khảo lại DNS và có khả năng mở một kết nối mới nếu địa chỉ IP hiện tại đó đủ tốt (đáp ứng)? Vấn đề của bạn dường như không thực sự liên quan đến DNS hoặc trình duyệt, thậm chí nhiều hơn xung quanh quyền kiểm soát bạn có hoặc không trên máy chủ
lá cờ us
Trường hợp sử dụng thực tế để chuyển đổi giữa máy chủ gốc và CDN là gì? Bạn đang cố gắng đạt được điều gì?
lá cờ gr
@Tero Trường hợp sử dụng là chúng tôi muốn có thể chuyển người xem từ nhận video từ CloudFront sang nhận video trực tiếp từ nguồn gốc tại chỗ và ngược lại nhanh chóng và liền mạch nhất có thể. Chúng tôi muốn chỉ thanh toán cho CloudFront khi chúng tôi mong đợi mức tải cao. Khi chúng tôi không còn muốn CloudFront nữa, chúng tôi có thể thay đổi DNS để các kết nối mới phân giải trở lại nguồn gốc tại chỗ. Những công việc này. Tuy nhiên, chúng tôi nhận thấy rằng một số kết nối "dính" tại CloudFront qua DNS TTL và đã thu hẹp kết nối đó thành hành vi kết nối liên tục này.
lá cờ gr
@PatrickMevzek Có, DNS và trình duyệt đang hoạt động theo cách hợp lý trong quá trình sử dụng thông thường. Tôi chỉ đang tìm một số cách để kích hoạt tra cứu DNS mới bất cứ khi nào chúng tôi thay đổi DNS. "Tại sao nó phải bận tâm" là chúng tôi phải trả tiền cho CloudFront - chúng tôi muốn lưu lượng truy cập đó quay trở lại từ CloudFront và chuyển thẳng đến điểm gốc càng nhanh càng tốt - ít nhất là trong TTL mà chúng tôi đặt cho DNS. Hiện tại, lưu lượng truy cập có thể "dính" tại CloudFront qua DNS TTL - Tôi đã đo được hơn 4 giờ trong một số thử nghiệm.
lá cờ us
Tùy chọn duy nhất của bạn có thể là tìm kiếm một số CDN khác nơi bạn có thể triển khai mã trạng thái `421` đúng cách. Hoặc hỏi AWS xem họ có thể thay đổi cách triển khai của mình không. Các trình duyệt hoạt động theo cách của chúng và bạn thực sự không thể thay đổi hành vi của chúng.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.