PushBuilder, которого больше нет
Когда в Servlet 4.0 появился PushBuilder, казалось, что это одна из главных причин переходить на HTTP/2: сервер сам отправляет браузеру стили и скрипты, не дожидаясь, пока тот разберёт HTML. Сейчас этот код почти везде работает вхолостую.
Что случилось с Server Push
Chrome отключил HTTP/2 Server Push по умолчанию в 2022 году, начиная с версии 106. Firefox убрал поддержку позже. На практике push редко давал выигрыш: сервер не знает, что уже лежит в кэше браузера, и часто отправлял ресурсы, которые были не нужны, занимая канал в самый важный момент загрузки страницы.
Для серверного кода это не ошибка: request.newPushBuilder() по-прежнему существует, а если клиент push не поддерживает, метод просто возвращает null. Именно поэтому такой код годами живёт в проектах незамеченным.
Что делать с существующим кодом
- Найти все вызовы
newPushBuilder()и убедиться, что результат проверяется наnull— иначе код упадёт на первом же клиенте без push. - Не тратить на этот код время при оптимизации: в реальном браузерном трафике push сейчас почти не срабатывает.
- При ближайшем рефакторинге убрать его совсем, заменив подсказками для браузера.
Чем заменить
Самый простой вариант — заголовок Link с rel=preload. Решение о загрузке остаётся за браузером, который знает про свой кэш:
response.addHeader("Link",
"</css/app.css>; rel=preload; as=style");
Следующий шаг — ответ 103 Early Hints: сервер отправляет те же заголовки Link ещё до того, как готов основной ответ, и браузер начинает загрузку, пока приложение ходит в базу. Его поддерживают Chrome и многие CDN, причём CDN часто умеют формировать Early Hints сами по заголовкам Link из предыдущих ответов — тогда приложению ничего менять не нужно.
Итог
HTTP/2 остаётся полезным — мультиплексирование и сжатие заголовков никуда не делись. Ушла только идея, что сервер лучше браузера знает, что тому нужно загрузить.