Anti-Patterns: Governance II · 2 of 5
Unbounded Consumption
Unbounded consumption happens when demand, data, or work can grow faster than the system, budget, or team meant to absorb it.
A system does not fail only because something breaks. It can fail because something keeps working too well. A popular feature accepts every request, a log pipeline stores every event forever, a retry policy repeats every failed call, or an autoscaler keeps buying capacity until the bill becomes the outage. Unbounded consumption is the pattern behind these failures: there is no effective limit on how much of a finite resource a process can use.
Start with the simplest model
Every useful system turns demand into work. A user clicks a button, a device sends a reading, a service calls another service, or a report scans data. That work consumes something finite: processor time, memory, network capacity, storage, money, human attention, or the patience of a customer waiting for a response.
Unbounded consumption appears when the amount of work admitted into the system is not tied to the amount of resource safely available. The system may look healthy at low volume because the gap is small. At higher volume, the same design becomes dangerous because each extra unit of demand can create more work, more data, or more cost than anyone planned.
The key word is not consumption. Consumption is normal. The key word is unbounded. A boundary is any mechanism that says how much is acceptable, who gets priority, what happens at the edge, and how the system recovers when demand exceeds supply.
Why it is hard to see early
Boundless designs often begin as generous designs. Let customers upload as much as they need. Keep all telemetry for future analysis. Retry failed requests so users are not interrupted. Scale automatically so the service stays available. These choices are reasonable in isolation.
The trouble is that each choice removes friction. When a system has no friction, small behavior changes can have large effects. One customer imports years of data. One bug emits millions of events. One downstream service slows down, causing callers to retry, which creates more traffic, which makes the downstream service slower still.
Early metrics can also mislead. Average load may be fine while a small number of tenants, features, queries, or message types dominate consumption. The system looks balanced from far away and unfair up close.
- A small share of users produces most of the storage, traffic, or cost.
- Queues grow faster than workers can drain them.
- Retries increase total traffic during an incident.
- Reports, searches, or exports scan far more data than expected.
- A bill rises without a matching rise in customer value.
The main sources of runaway use
Unbounded consumption rarely has one cause. It is usually a chain of permissive choices. A service accepts an unlimited request, breaks it into many smaller operations, stores every intermediate result, retries failures, and gives every tenant the same priority. None of those steps is obviously wrong, but together they create a path with no brake.
A common source is fan-out, where one action triggers many downstream actions. A single upload may create thumbnails, search indexes, notifications, audit records, and analytics events. Another is high cardinality, where a system records or indexes too many distinct values, such as unique user identifiers, device identifiers, or request identifiers. High cardinality can make monitoring and databases expensive because every distinct value may create more series, indexes, or partitions.
Retention is another source. Data kept forever is not free forever. It must be stored, backed up, governed, searched, secured, and sometimes deleted under legal or customer requirements. The longer data lives without a purpose, the more it becomes both a cost and a risk.
A boundary is a product decision
It is tempting to treat limits as engineering housekeeping, but limits express product policy. Who may use how much? What is included in the base service? What deserves priority during congestion? What behavior is accidental, abusive, or simply too expensive to provide at the current price?
A quota sets an amount allowed over a period or within an account, such as storage per tenant or requests per day. A rate limit controls speed, such as requests per second. Backpressure tells a caller to slow down instead of silently accepting work the system cannot complete. Budgets connect technical use to money, time, or reliability goals.
Good boundaries are visible, explainable, and changeable. They should not surprise customers at the worst moment, and they should not require engineers to edit code every time a business policy changes.
Feedback turns limits into control
A static limit is only the beginning. Real systems change: customers grow, traffic shifts, features evolve, and costs move. Control comes from a feedback loop: measure what is happening, compare it with what should happen, decide what to change, and act before the system is harmed.
Measurement must be specific enough to show who or what is consuming resources. Total storage is useful, but storage by tenant, feature, data type, and age is far more useful. Total request volume is useful, but request volume by endpoint, customer tier, and response outcome is better.
The comparison step needs explicit targets. These may include cost budgets, capacity thresholds, queue age targets, or a service level objective, which is a stated reliability goal such as 99.9 percent of requests completing successfully within a defined time. Without a target, teams can observe growth but cannot tell when growth has become risk.
The decisions leaders and practitioners face
Unbounded consumption becomes a leadership problem because every boundary creates a trade-off. A strict limit can protect reliability but frustrate a fast-growing customer. A generous limit can improve adoption but shift cost onto the provider. A hidden limit can prevent overload but damage trust when a customer discovers it by failing.
Teams must decide whether to absorb growth, price it, shape it, or refuse it. Absorbing growth means investing in more capacity or efficiency. Pricing growth means charging in proportion to use. Shaping growth means changing behavior through batching, caching, tiering, defaults, or better user experience. Refusing growth means rejecting work that the product should not support.
The important decision is not whether limits exist. They always do. The decision is whether the limits are designed in advance or discovered during an incident, a customer escalation, or a finance review.
- Which resources are included in the customer promise, and which are usage-based?
- Which customers, jobs, or workflows get priority when capacity is scarce?
- What is the acceptable customer experience at the limit: warning, delay, downgrade, or rejection?
- Who can approve temporary exceptions, and how are they reviewed later?
- Which costs are strategic investments, and which are waste that should be removed?
A practical operating model
A practical model starts by naming the scarce resources. For each important workflow, identify the processor time, memory, storage, network traffic, third-party calls, human review, and money it consumes. Then ask what makes that consumption grow: users, files, rows, devices, tenants, retries, reports, or time.
Next, choose the right control point. It is usually better to reject or delay work near the entrance than to accept it, let it multiply, and fail deep inside the system. For example, an application programming interface, or API, can validate request size before a database begins a large scan. A queue can cap message age or depth before workers fall irreversibly behind.
Finally, make the limit humane. Warn before blocking. Explain the reason. Offer a path to reduce use, wait, upgrade, or request review. Operators need the same courtesy: dashboards, alerts, runbooks, and audit trails that show what happened and why.
- Map the workflow from request to downstream effects.
- Measure consumption by tenant, feature, and resource type.
- Set budgets, quotas, and rate limits for the riskiest paths.
- Define what happens at the edge: slow down, queue, degrade, or reject.
- Review exceptions and adjust limits as the product and customer base change.
How to know the system is healthier
The goal is not to minimize consumption. A useful product should consume resources to create value. The goal is to make consumption intentional, fair, observable, and recoverable. Healthy systems can grow without letting one tenant, feature, bug, or failure mode consume the shared future of the service.
You can see improvement when load and cost track customer value more closely, when heavy users are visible rather than mysterious, when queues recover after spikes, and when incidents do not multiply through retries or fan-out. You can also see it in calmer planning: capacity discussions become less about surprise and more about deliberate trade-offs.
The strongest sign is that limits become ordinary. Customers understand them, product managers can reason about them, engineers can operate them, and finance can forecast them. At that point, consumption is no longer an uncontrolled appetite. It is part of the design.
Key takeaways
- Unbounded consumption happens when demand can use finite resources without an effective stopping point.
- The risk often hides inside reasonable choices such as retries, generous storage, automatic scaling, fan-out, and long retention.
- Quotas, rate limits, budgets, and backpressure are product controls as much as engineering controls.
- Good limits are visible, explainable, measured, and reviewed as the system changes.
- Leaders must choose whether to absorb, price, shape, or refuse growth before limits are discovered by failure.
Glossary
- Backpressure
- Backpressure is a signal or mechanism that tells a caller to slow down because the receiver cannot safely accept more work.
- Budget
- A budget is an agreed limit for a resource such as money, capacity, time, or reliability risk.
- Cardinality
- Cardinality is the number of distinct values in a set, such as the number of unique users, devices, labels, or identifiers.
- Fan-out
- Fan-out is the pattern where one action triggers many downstream actions.
- Quota
- A quota is a maximum amount of use allowed for a person, tenant, feature, or system over a defined scope or time.
- Rate limit
- A rate limit is a control that restricts how quickly requests or operations may happen.
- Retry storm
- A retry storm occurs when many callers repeat failed requests at the same time and make the overloaded system even busier.
- Service level objective
- A service level objective is a stated reliability target for a service, such as how often it should respond successfully within a defined time.