Your consumer is overwhelmed, so you put a queue in front of it. The burst gets absorbed. Everyone relaxes.
Then the burst doesn't stop. The queue is holding two million messages, memory is climbing, and every message in it is already older than anyone cares about. The mismatch between producer and consumer was never addressed — only hidden, and the hiding has a shelf life.
Buffering says I'll take it, somehow. It accepts everything, fails late and fails hard, and usually loses the lot when it finally goes.
Backpressure says I'm full, slow down. It rejects or blocks early, fails small, and tells the producer the truth at the moment that truth becomes true — rather than twenty minutes later, when memory runs out.
The mechanisms are ordinary. Bounded queues that block or reject when full. TCP advertising a smaller window. gRPC and reactive streams requesting n items at a time instead of unlimited. Kafka consumers simply stopping polling, and letting the lag do the talking.
An unbounded buffer is a decision to fail later and worse, dressed up as generosity.
