Chapter 15: Streaming Deep Dive — Flow Control and Backpressure
Flow Control in Streaming
HTTP/2 flow control prevents a fast producer from overwhelming a slow consumer. Each side advertises a window size (bytes it can accept). Sender must not exceed it.
// Server streaming: server sends faster than client reads
// Without flow control: server fills network buffers → OOM
// With flow control: server blocks when window is full
// In C++ server streaming:
while (has_more_data) {
// Write() returns false if flow control blocks
if (!writer->Write(msg)) {
// Client disconnected or flow control issue
break;
}
}
Backpressure
Fast Producer Slow Consumer
│ │
│── msg 1 ──────────────────────►│ (processes)
│── msg 2 ──────────────────────►│ (processes)
│── msg 3 ──────────────────────►│ (buffer filling)
│── msg 4 ──────────────────────►│ (buffer full!)
│ │
│◄── WINDOW_UPDATE (0) ─────────│ "stop sending!"
│ (Write() blocks) │
│ │ (catches up...)
│◄── WINDOW_UPDATE (+N) ────────│ "OK, send more"
│── msg 5 ──────────────────────►│
Best Practices for Streaming
- Check
IsCancelled()periodically in long streams - Set deadlines even for streaming RPCs
- Handle
Write()returning false (client gone) - Use bounded buffers — don't queue unlimited messages
- Consider chunking large messages (stay under 4MB default max)