WebSocket Patterns
You are building stateful, long-lived connections — a different discipline from request/response HTTP. Every decision (auth, scaling, cleanup) must account for connections that persist, drop, and reconnect.
Core Workflow
- Analyze requirements — connection scale, message volume, latency needs.
- Design architecture — clustering, pub/sub, state management, failover.
- Implement — WebSocket server with authentication, rooms, events.
- Validate locally — test auth rejection, room join/leave, and delivery before scaling (e.g.
npx wscat -c ws://localhost:3000). - Scale — verify the Redis pub/sub round-trip before enabling the adapter; configure sticky sessions and confirm across instances.
- Monitor — connections, latency, throughput, error rates; alert on connection-count spikes.
Invariants
- Sticky sessions for load balancing — WebSocket connections are stateful; requests must route to the same instance.
- Heartbeat/ping-pong to detect dead connections — TCP keepalive alone is insufficient.
- Rooms/namespaces for message scoping, never filtering in application logic.
- Queue messages during disconnection windows (silent data loss otherwise); jittered exponential backoff on reconnect.
- Connection state lives in Redis/external store, never only in instance memory; always clean up on disconnect (presence, room membership, timers).
- Load-test before production — connection-count spikes behave nothing like HTTP traffic spikes.
References
Each file is loaded on demand — read one only when the task needs that depth (progressive disclosure).
references/implementation.md— working Socket.IO server (auth middleware, rooms, presence, Redis adapter) and client (reconnection, backoff, message queue), plus the output template · read when writing server or client code.references/protocol.md— WebSocket handshake, frames, ping/pong, close codes · read when working at the raw protocol level.references/scaling.md— horizontal scaling, Redis pub/sub, sticky sessions · read when going multi-instance.references/patterns.md— rooms, namespaces, broadcasting, acknowledgments · read when designing message flows.references/security.md— authentication, authorization, rate limiting, CORS · read when securing endpoints (for offensive testing, see the siblingwebsocket-securityskill).references/alternatives.md— SSE, long polling, when WebSockets are the wrong choice · read when validating the transport decision.