Networking & ProtocolsHTTP/HTTPS & Protocol EvolutionMedium⏱️ ~3 min

HTTP/2 Server Push vs Preload: Why Push Failed at Scale

HTTP/2 introduced Server Push to allow servers to proactively send resources before the client requests them, theoretically eliminating request round trips for critical assets like CSS and JavaScript. The promise was compelling: after sending HTML, immediately push the referenced stylesheet and scripts, saving 1 RTT per resource on a cold cache. However, production deployments revealed fundamental problems. The server cannot reliably know what the client has cached; pushing assets already in browser cache wastes bandwidth and can evict hot cache entries. This cache coordination problem proved intractable at scale without complex state synchronization between client and edge. Additionally, push complicates prioritization and resource scheduling. Pushed resources compete for bandwidth with the HTML document itself, potentially delaying first byte of critical inline content and degrading metrics like First Contentful Paint. Empirical measurements from Google and Cloudflare found that naive push strategies often degraded page load time by 5 to 10% compared to client driven fetching. Modern best practice has converged on HTTP 103 Early Hints and resource preload directives in HTML headers, which inform the client what to fetch while preserving client side cache awareness and prioritization logic. Major platforms including Netflix, LinkedIn, and Meta have largely disabled or severely limited Server Push in favor of these client driven alternatives, and the HTTP/3 specification deprioritized push semantics accordingly.
💡 Key Takeaways
Server Push requires the server to predict client cache state, which is impossible without complex synchronization; pushing cached assets wastes bandwidth measured in megabytes at scale
Pushed resources compete for bandwidth with the HTML response itself, potentially delaying time to first byte of the document and degrading First Contentful Paint by 50 to 200ms
Google's internal experiments found naive push strategies degraded page load by 5 to 10% in median case and up to 20% in worst case when pushing large JavaScript bundles already cached
Cookie scoped assets pushed from CDN edge may not match application state, creating cache pollution where pushed version differs from what client actually needs after authentication
HTTP 103 Early Hints allow servers to send Link preload headers before the full HTML response, enabling client driven fetch with full cache awareness and saving equivalent RTT without push downsides
At 10 million requests per hour, eliminating unnecessary push of 100KB assets already cached 70% of the time saves approximately 700GB of egress bandwidth, translating to thousands of dollars in CDN costs
📌 Examples
Netflix disabled Server Push after measuring it increased page load time by 8% on average due to cache misses and bandwidth contention with critical HTML delivery
Cloudflare offered configurable push but found fewer than 2% of customers successfully improved performance; most saw neutral or negative impact and the feature saw minimal production use
LinkedIn migrated from Server Push to HTTP 103 Early Hints plus Resource Hints in HTML headers, improving cache hit effectiveness from 62% to 89% by preserving client cache awareness
← Back to HTTP/HTTPS & Protocol Evolution Overview