Backpressure
The pattern: when a consumer can’t keep up with a producer, signal slow down instead of buffering forever. Bounded queues. Worker pools. Semaphores. Circuit breakers. Without backpressure, systems fail with OOM or cascading downstream collapse — usually at 3am.
The trade-off: throughput vs. stability. Unbounded buffers maximize short-term throughput; bounded ones cap throughput but bound resource usage. Drop-on-full vs. block-on-full vs. shed-load policies all have failure modes. Reactive Streams (Java/JS) and Go’s bounded channels both implement explicit backpressure protocols; TCP gives you backpressure for free at the network layer.
[Deepen Year 1 Phase 5 — pulse’s bounded worker pool is the concrete example.]
Related patterns
- Delivery semantics — at-least-once + slow consumer is exactly when backpressure stops a queue from melting.
- Fault isolation — bulkheads + circuit breakers are backpressure with a blast-radius story.
- Idempotency — shed-load policies require retries; retries require idempotency.
- Caching — caches absorb burst, but only until they don’t; backpressure is the floor under that.
- SLI / SLO / error budget — load-shedding policies are the operational expression of an error budget.
First touched in Year 1 Phase 5 via pulse’s bounded worker pool; revisited under load in Year 2 Phase 8.