Implementing Backpressure Handling

1. Understanding Backpressure

Backpressure occurs when a producer outpaces a consumer's drain rate, causing buffers to grow and memory pressure to rise. In WebSockets the symptom is bufferedAmount climbing toward unbounded.

LayerBuffer
App outboxYour queue
Browser sendws.bufferedAmount
TCP sendKernel socket buffer
Server receivews library buffer

2. Monitoring bufferedAmount Property

Example: Drain detection

function whenDrained(ws) {
  return new Promise(res => {
    const tick = () => ws.bufferedAmount === 0 ? res() : setTimeout(tick, 50);
    tick();
  });
}
PropertySemantics
bufferedAmountBytes queued in UA, not yet on wire
PollingNo native drain event — poll or use timer

3. Implementing Flow Control

MechanismDetail
Credit-basedServer grants N tokens; client decrements
Window ackSender pauses until ack of last N
Pause/resume msgReceiver tells sender to stop

4. Using High Water Mark

Example: HWM gating

const HWM = 256 * 1024; // 256 KB
function canSend() { return ws.bufferedAmount < HWM; }
ThresholdAction
Low waterResume producer
High waterPause producer
CriticalDrop / close

5. Dropping Messages

StrategyBest For
Drop newestOrder matters more than freshness
Drop oldestLatest data (cursor, prices)
Sample (1/N)Telemetry
CoalesceIdempotent updates (state replace)

6. Implementing Message Prioritization

Example: Priority lanes

const lanes = { hi: [], mid: [], lo: [] };
function flush() {
  for (const lane of ["hi","mid","lo"]) {
    while (lanes[lane].length && canSend()) ws.send(lanes[lane].shift());
  }
}
PriorityExample
HiAuth, control, errors
MidUser actions
LoTelemetry, analytics

7. Handling Slow Clients

Server ActionDetail
Per-client buffer capDrop / close when exceeded
Timeout slow drainsClose 1013
Demote subscriptionLower update rate
Snapshot + deltaSkip back-to-snapshot

8. Implementing Client-Side Buffering

BoundReason
Size limitCap memory
Age limitAvoid stale
Count limitPredictable drain time

9. Detecting Backpressure Conditions

SignalThreshold
bufferedAmount risingΔ > 0 over N seconds
Pong RTT spike2× baseline
Queue depthApp outbox > N

10. Testing Backpressure Scenarios

TestHow
Throttle networkDevTools Slow 3G
Pause consumerSuspend message handler
Burst producerSend 10k msgs / sec
Memory probeperformance.memory