Why does my first HTTP request lag due to WebSocket behavior, and how is this handled in production environments?

Published: (December 27, 2025 at 09:32 AM EST)
3 min read
Source: Dev.to

Source: Dev.to

Problem Description

I’m building a web application with a FastAPI backend and a frontend served by Live Server during development. The first HTTP request to an endpoint is noticeably slower than subsequent requests.

Observations

  • Second request – completes quickly.
  • First request – experiences a lag.
  • When the same endpoint is called from the OpenAPI Docs (auto‑generated by FastAPI), the response is returned immediately, even on the first call.
  • In the browser’s DevTools I see a WebSocket connection that is automatically opened by Live Server for live‑reloading. This WebSocket appears to compete for resources with the regular HTTP request, causing the initial delay.

Questions

  1. How do engineers handle this situation in production where both WebSocket connections (e.g., for real‑time notifications) and regular HTTP requests are required?
  2. What techniques prevent these two types of connections from interfering with each other, even when the same frontend code initiates both?
  3. If both WebSocket and HTTP traffic originate from the same client code, how do companies ensure they don’t clash in a live environment?
    • I suspect API gateways or separate subdomains might be involved, but I’d like a simple explanation of typical production setups.

Production‑Ready Approaches

1. Separate Hostnames / Subdomains

  • WebSocket endpoint is exposed on a distinct hostname (e.g., ws.example.com) while the REST/GraphQL API lives on api.example.com.
  • Browsers treat these as independent origins, so connection limits, TLS sessions, and socket pools do not interfere.
  • DNS and TLS certificates can be managed together (wildcard or SAN certificates) to keep the setup simple.

2. Dedicated Load Balancers / Reverse Proxies

  • A layer‑7 load balancer (e.g., NGINX, HAProxy, Envoy, AWS ALB) routes Upgrade: websocket requests to a WebSocket‑aware backend pool and forwards ordinary HTTP requests to a separate pool.
  • The balancer maintains separate connection pools for each protocol, preventing resource contention.

3. Connection‑Pooling Isolation in the Client

  • Modern browsers already maintain separate connection pools per origin and per protocol.
  • Frontend libraries (e.g., fetch, axios, WebSocket) use distinct underlying sockets, so as long as the origins differ, they won’t block each other.
  • If the same origin must serve both, ensure the server can handle concurrent upgrades (most production‑grade servers do).

4. Use of API Gateways / Service Meshes

  • An API gateway (Kong, Apigee, AWS API Gateway) can expose both HTTP and WebSocket routes under a unified domain while internally routing them to different services.
  • The gateway abstracts the protocol handling, so the client sees a single endpoint but the gateway isolates the traffic.

5. Scaling and Resource Allocation

  • Deploy WebSocket services on a different set of instances (or containers) than the stateless HTTP API.
  • This prevents a surge of WebSocket connections from exhausting CPU, memory, or file‑descriptor limits needed for HTTP request handling.

6. CORS and Security Headers

  • Proper CORS configuration ensures that browsers allow both types of connections from the same frontend origin without unnecessary preflight delays.
  • Security headers (e.g., Upgrade-Insecure-Requests) can be tuned to avoid extra round‑trips.

Why It Works in Production

  • Separate origins or routing rules guarantee that the browser’s connection limits (typically 6 concurrent connections per host) are not shared between WebSocket and HTTP traffic.
  • Production servers are configured to handle the Upgrade header efficiently, establishing the WebSocket without blocking the thread that serves normal HTTP requests.
  • Load balancers and gateways keep the event loops of HTTP and WebSocket services independent, so a long‑lived WebSocket does not starve the request workers.

TL;DR

  • In production, WebSocket and HTTP traffic are usually isolated by hostname, reverse‑proxy routing, or an API gateway.
  • This isolation prevents the two protocols from competing for the same connection pool or server resources.
  • The frontend can still initiate both connections from the same codebase; the underlying infrastructure ensures they run side‑by‑side without interference.
Back to Blog

Related posts

Read more »