Firefox dự định ngừng hỗ trợ HTTP/2 Push
(groups.google.com)- Firefox sẽ vô hiệu hóa HTTP/2 Push trên mọi nền tảng trong vài ngày tới do mức độ sử dụng thấp và gánh nặng tương thích ngày càng tăng, đồng thời tạm thời vẫn giữ mã triển khai trong cây mã nguồn
- Trong hệ sinh thái trình duyệt, hỗ trợ này đã suy giảm từ trước; Chrome 106 đã tắt nó vào tháng 9/2022, và phiên bản Safari mới nhất cũng từ chối push stream trong thử nghiệm cục bộ
- Chrome cho biết lý do là HTTP/2 Push có mức sử dụng thấp, đồng thời khuyến nghị các phương án thay thế là rel="preload" và 103 Early Hints
- Firefox trước đây vẫn duy trì hỗ trợ vì chi phí bảo trì không quá lớn, nhưng trong vài tháng gần đây, các lỗi tương thích web chỉ xảy ra trên Firefox đã xuất hiện do HTTP/2 Push
- Khi máy chủ và website dùng push nhưng bỏ qua việc kiểm thử trên Firefox, một số trang có thể chỉ không hoạt động trên Firefox
Kế hoạch vô hiệu hóa HTTP/2 Push của Firefox
- Firefox dự định vô hiệu hóa HTTP/2 Push trên mọi nền tảng
- Việc loại bỏ đang được theo dõi tại Bugzilla: 1915848 - Pref off HTTP/2 push
- Hiện tại sẽ tắt bằng preference, còn mã triển khai sẽ vẫn được giữ lại trong cây mã nguồn một thời gian
- Việc loại bỏ hoàn toàn nhiều khả năng sẽ diễn ra trước nhánh ESR 140 vào mùa xuân năm sau
Tình trạng hỗ trợ theo trình duyệt và lý do vô hiệu hóa
-
Chrome
- Chrome 106 đã vô hiệu hóa HTTP/2 Push vào tháng 9/2022
- Có thể xem trạng thái liên quan tại Chrome Platform Status
- Chrome nêu lý do là mức sử dụng thấp và khuyến nghị
rel="preload"cùng 103 Early Hints như các phương án thay thế
-
Safari
- Chưa xác nhận được tài liệu deprecation chính thức, nhưng phiên bản hiện tại từ chối push stream trong thử nghiệm cục bộ dùng máy chủ Node.js
-
Firefox
- Firefox trong thời gian qua vẫn tiếp tục hỗ trợ HTTP/2 Push vì gánh nặng duy trì không lớn
- Tuy nhiên trong vài tháng gần đây đã phát sinh các vấn đề tương thích web chỉ ảnh hưởng đến Firefox do HTTP/2 Push
- Một trường hợp liên quan là bug 1915830
- Khi máy chủ và website sử dụng push nhưng không kiểm thử trên Firefox, trang có thể chỉ bị treo trên Firefox; ví dụ là bug 1913100
1 bình luận
Ý kiến trên Hacker News
Thật khó chịu là ngay cả sau “phát hiện đột ngột” rằng HTTP/2 Push rốt cuộc không ổn, vẫn chẳng có lời xin lỗi nào dành cho những người từ lâu đã giải thích vì sao nó sẽ không ổn nhưng bị phớt lờ.
Suốt nhiều năm đã có bầu không khí kiểu: những người thông minh hơn ở Google nói là cần, vậy hãy nhét nó vào đặc tả; trong khi lẽ ra phải tiếp cận đặc tả một cách thận trọng hơn nhiều. Nên thôi kiểu liên tục đưa vào những mục tiêu mở rộng mang tính suy đoán mà một bộ phận Google cho là hay.
Thứ làm trình duyệt chậm đi chủ yếu chỉ là quảng cáo, tracker và đủ thứ linh tinh đè nặng lên các website; và thứ dùng để sửa chuyện đó không phải phát minh của Google mà là uBlock Origin. Những thứ Google đang nhét vào các chuẩn web dạo này trông không giống để phục vụ lập trình viên bình thường, mà giống để chèn thêm quảng cáo hoặc tiết kiệm 0,1% chi phí trung tâm dữ liệu hơn.
HTTP/2 trông giống một ví dụ về việc một công ty tiếp tục kiểm soát quyền truy cập www, một tài nguyên công cộng, theo lợi ích của chính họ. Dùng Chrome thì nó sẽ thử HTTP/2, và cũng chính công ty đó kiểm soát công cụ tìm kiếm, phần cứng, trình duyệt, giờ là cả giao thức mạng. Có thể xem HTTP/2 thực chất là HTTP/Chrome.
Tôi chưa từng thấy các lời giải thích được đưa ra cho việc HTTP/2 Push thất bại là thuyết phục. Google thường trỏ tới bài của Jake Archibald, nhưng bài đó có vẻ giống liệt kê việc triển khai trên trình duyệt tệ đến mức nào hơn là lý do bản thân giao thức không hoạt động.
Trình duyệt vốn đã hỗ trợ liên kết preload, và thứ này về cơ bản đáng ra phải đóng vai trò giống như header Push. Tôi cũng thắc mắc liệu các khó khăn triển khai năm 2017 như cache hay header xác thực có thật sự không thể tái sử dụng mã xử lý preload hiện có hay không.
https://jakearchibald.com/2017/h2-push-tougher-than-i-though...
HTTP/2 Push là cách máy chủ chủ động đẩy những tài nguyên mà nó cho rằng client cần, nhằm giảm một lượt round trip; mục tiêu là giảm độ trễ bằng cách gửi tài nguyên tách khỏi pipeline DOM→render. Header Preload là cách máy chủ cho biết các tài nguyên cần tải song song cùng phần thân, để trình duyệt lấy chúng trước khi parse hoặc đánh giá JS. 103 Early Hints gửi các gợi ý Preload trước khi việc tạo phản hồi hoàn tất, trước byte đầu tiên của phần thân, đẩy bước fetch lên sớm hơn nữa.
Khác biệt cốt lõi nằm ở chỗ server-driven hay client-driven, đi cùng phần thân hay trước byte đầu tiên. Lý do đơn giản nhất khiến HTTP/2 Push yếu trong việc đạt mục tiêu là cache. Trình duyệt không yêu cầu tài nguyên mà nó đã có, nhưng máy chủ không biết trong cache của client có gì. Push có rủi ro lớn gửi tài nguyên không cần thiết, còn 103/Preload nếu sai thì chỉ lãng phí vài byte header vô dụng, nên dễ triển khai và chi phí thấp.
https://github.com/whatwg/fetch/issues/51
Có vẻ vẫn còn nhiều cơ hội ngay cả trong use case phân phối nội dung mà mọi người tập trung vào. Cũng không có nhiều thử nghiệm công khai, và rất ít người có thể tiếp cận thư viện hay điểm khởi đầu để thử nghiệm xem nên Push thứ gì.
Với khởi động 0-RTT của HTTP/3, có thể lấy lại một phần tốc độ, và với 103 Early Hints, trình duyệt có thể preload tài nguyên sớm. Tổ hợp này còn có ưu điểm là tương thích ngược về mặt ngữ nghĩa với HTTP/1. Nó cũng dễ xử lý hơn trong reverse proxy hoặc load balancer.
Thấy HTTP/2 Push cuối cùng biến mất cũng hơi tiếc. Ý tưởng rất gọn gàng, nhưng framework áp dụng kém; đây là một tính năng đáng lẽ nên được chú ý nhiều hơn.
Phía .NET rốt cuộc không bao giờ phát hành, còn nginx có một mức triển khai cơ bản. Việc thiếu cache digest cũng liên tục cản trở. Chrome đã loại bỏ nó một phần với lý do kiểu “dù sao cũng chẳng ai nhận ra đâu”, và có vẻ việc thiết kế lại mọi thứ trên UDP, thứ lúc nào cũng hoạt động tuyệt vời qua NAT, quan trọng hơn.
Khi tôi nói chuyện với Mike Belshe trước khi HTTP/2 được chuẩn hóa, đã có xu hướng muốn bỏ tính năng này khỏi H2 vì lợi ích của nó khó hiện thực hóa, lại có nhiều vấn đề và cạm bẫy.
Một trong những vấn đề lớn nhất là Push quá mức: gửi những thứ đã có trong cache trình duyệt, hoặc gửi quá nhiều nội dung không quan trọng. Thực tế tôi từng thấy những trường hợp rất tệ, trong đó Push làm trang tải chậm hơn. Cũng từng có đề xuất để trình duyệt cho máy chủ biết trong cache cục bộ có gì, nhưng vấp phải nhiều vấn đề. HTTP Early Hints và Resource Hints phần lớn đã thay thế nhu cầu H2 Push, đồng thời dễ triển khai hơn nhiều, tránh các lượt fetch không cần thiết và cũng dễ hiểu hơn.
Cũng có thể diễn giải rằng “nếu máy chủ web và website dùng Push mà không kiểm thử trên Firefox, site có thể chỉ bị đứng trên Firefox”, nhưng cũng có cách hiểu khác
Trong khi các trình duyệt khác từ chối HTTP/2 Push và âm thầm bỏ qua, Firefox lại vấp khá nặng ở một số điều kiện biên. Chẳng hạn nội dung là “có vẻ Firefox đặt lại kết nối khi gặp chữ hoa trong tên header”
Bài viết này dường như mô tả đúng biện pháp đó: từ chối H2 Push và âm thầm bỏ qua như các trình duyệt khác, chứ không có vẻ như đang che giấu điều gì
Tôi thắc mắc vì sao Push không được chấp nhận rộng rãi hơn. Bất chấp những khiếm khuyết lớn, đây từng là một trong những lý do chính khiến HTTP/2 được xem là tính năng có thể thay đổi cuộc chơi
Không rõ là do thiếu hỗ trợ từ trình duyệt, hay do không hợp với CDN
Trong trường hợp sau, đặc biệt trên di động, nó trở thành gánh nặng có hại. Máy chủ không bao giờ có thể biết chính xác tài nguyên đó có thật sự cần cho client hay không. Early Hints có lẽ tốt hơn, vì nếu máy chủ nhanh chóng báo cho biết các tài nguyên cần thiết, client có thể quyết định sẽ tải về hay đã có sẵn
Index.html, thường bạn sẽ muốn đẩy kèmscript.jsvàstyle.css, nhưng như vậy tức là đã gửi vài trăm kbitNếu người dùng lại yêu cầu
index.html, có phải gửi lại tất cả không? Rất có khả năng tài nguyên đã nằm trong cache của người dùng. Nếu không gửi thì làm sao biết nên gửi gì? Chỉ trình duyệt mới biết trong cache có gì và không có gì. Cuối cùng lựa chọn sẽ là làm lần truy cập đầu nhanh nhưng lãng phí băng thông ở các lần quay lại, hoặc để lần truy cập đầu chậm và làm lần quay lại nhanhVới hầu hết phần còn lại, đó là một mức tăng độ phức tạp khổng lồ và về cơ bản đã bị phớt lờ
https://developer.chrome.com/blog/removing-push/
Theo Wikipedia, hỗ trợ Push của nginx dường như được đưa vào khoảng năm 2018. Những thay đổi như vậy cần thời gian để đi xuống các phiên bản distro ổn định và cấu hình mặc định. Lần đầu tôi bật HTTP/2 trên máy chủ Apache của mình cũng là năm 2020, và đến năm 2024 vẫn có khả năng có các application server không hỗ trợ trực tiếp
… ý là trên Firefox
Có vẻ là các bài liên quan. Còn bài nào nữa không?
Removing HTTP/2 Server Push from Chrome - https://news.ycombinator.com/item?id=32522926 - tháng 8 năm 2022, 201 bình luận
A Study of HTTP/2’s Server Push Performance Potential - https://news.ycombinator.com/item?id=32097013 - tháng 7 năm 2022, 2 bình luận
HTTP/2 Push is dead - https://news.ycombinator.com/item?id=25283971 - tháng 12 năm 2020, 168 bình luận
Blink: Intent to Remove: HTTP/2 and gQUIC server push - https://news.ycombinator.com/item?id=25064855 - tháng 11 năm 2020, 133 bình luận
We're considering removing HTTP/2 Server Push support - https://news.ycombinator.com/item?id=24591815 - tháng 9 năm 2020, 2 bình luận
Performance Testing HTTP/1.1 vs. HTTP/2 vs. HTTP/2 and Server Push for REST APIs - https://news.ycombinator.com/item?id=21937799 - tháng 1 năm 2020, 71 bình luận
How HTTP/2 Pushes the Web - https://news.ycombinator.com/item?id=18216495 - tháng 10 năm 2018, 16 bình luận
Nginx HTTP/2 server push support - https://news.ycombinator.com/item?id=16365413 - tháng 2 năm 2018, 63 bình luận
HTTP/2 Server Push on Netlify - https://news.ycombinator.com/item?id=14798271 - tháng 7 năm 2017, 23 bình luận
The browser bugs and edge cases of HTTP/2 push - https://news.ycombinator.com/item?id=14445728 - tháng 5 năm 2017, 20 bình luận
A Guide to HTTP/2 Server Push - https://news.ycombinator.com/item?id=14077955 - tháng 4 năm 2017, 59 bình luận
HTTP/2 Server Push - https://news.ycombinator.com/item?id=13990074 - tháng 3 năm 2017, 2 bình luận
HTTP/2 Server Push and ASP.NET MVC – Cache Digest - https://news.ycombinator.com/item?id=13659962 - tháng 2 năm 2017, 9 bình luận
Accelerating Node.js Applications with HTTP/2 Server Push - https://news.ycombinator.com/item?id=12296922 - tháng 8 năm 2016, 6 bình luận
Rules of Thumb for HTTP/2 Push - https://news.ycombinator.com/item?id=12224258 - tháng 8 năm 2016, 25 bình luận
Google's Rules of Thumb for HTTP/2 Push - https://news.ycombinator.com/item?id=12223352 - tháng 8 năm 2016, 2 bình luận
HTTP/2 Protocol for iOS Push Notifications - https://news.ycombinator.com/item?id=11175980 - tháng 2 năm 2016, 13 bình luận
Không có gì đáng ngạc nhiên. Khi gắn thêm một tính năng gần như chẳng liên quan đến mục tiêu thiết kế ban đầu lên trên một giao thức hiện có vốn được tạo ra cho một mục đích cụ thể, thường thì kết quả sẽ như thế này
Phần lớn trường hợp nên bắt đầu từ một giao thức cấp thấp rồi điều chỉnh thẳng theo use case, và theo nghĩa đó, tôi cho rằng WebSockets đã giải quyết khá tao nhã bài toán giao tiếp hai chiều. Để giảm độ trễ khi tải các tầng file/script sâu, các thẻ
rel="preload"hoặcrel="modulepreload"là một cấu trúc tuyệt vời và đơn giảnÝ chính là server gửi nội dung cần tải trước qua header, để việc tải trước bắt đầu ngay cả trước khi thẻ link được truyền đi hoặc được phân tích cú pháp. Với các trang hỗ trợ streaming thì có thể kém hữu ích hơn, nhưng trong trường hợp request bị chặn cho đến khi toàn bộ trang HTML được render phía server, nó có thể đã đem lại lợi ích thấy rõ