03
Mechanisms of real backpressure
TCP-level — sockets have send + receive buffers. When receiver's buffer fills, TCP's sliding window shrinks; sender's send() blocks. Happens transparently. Covers "I'm overwhelmed at the transport layer."
HTTP 429 / 503 — server signals "too many requests" or "service unavailable" with Retry-After header. Caller honors (see retry with backoff).
Reactive Streams spec (Java, JS, .NET) — consumer calls request(n) to pull at most n items. Producer can only emit up to the outstanding demand. Built-in to RxJava, Project Reactor, akka-streams, Node.js streams.
Credit-based flow control — consumer grants producer N "credits." Each sent message consumes one credit. Producer stops when credits hit 0; more credits sent as consumer processes. Used by AMQP, gRPC streaming, HTTP/2.
Pull-based queues (Kafka, SQS long-poll) — consumer decides when to fetch. Producer writes to durable queue; consumer reads at its own pace. Queue itself acts as buffer with disk as the overflow floor.
Count-Min Sketch (streaming top-K)
import mmh3
class CountMinSketch:
def __init__(self, width=10_000, depth=4):
self.w, self.d = width, depth
self.grid = [[0] * width for _ in range(depth)]
def add(self, item, count=1):
for i in range(self.d):
self.grid[i][mmh3.hash(item, i) % self.w] += count
def estimate(self, item):
# MIN across rows — over-estimate only, never under
return min(self.grid[i][mmh3.hash(item, i) % self.w]
for i in range(self.d))
# Trade: ~N×W×8 bytes for constant-space approx counts at any scale