Skip to main content
Juliano Alves
Back to blog

WebSocket reconnection with backoff and heartbeats

2 min read
By Juliano Alves

WebSockets drop when networks flap, laptops sleep, or deploys restart servers. Clients need predictable reconnection behavior—not infinite tight loops hammering your origin.

Exponential backoff with jitter#

let attempt = 0;
const base = 500;
const max = 30_000;

function delayMs() {
  const exp = Math.min(max, base * 2 ** attempt++);
  const jitter = exp * (0.5 + Math.random() * 0.5);
  return jitter;
}

Reset attempt on successful onopen.

Heartbeats#

Proxies may kill idle sockets. Client sends ping frames (or app-level {type:'ping'}) every 25–45s; server responds. If two pings miss, close and reconnect.

State on resume#

After reconnect, re-sync server state: send last seen message ID or cursor so the server replays missed events or sends a snapshot.

Summary#

Treat WebSockets as best-effort streams: backoff reconnects, heartbeats for middlebox survival, and explicit resync after every new connection.

© 2026 Juliano Alves. All rights reserved.