Strategy

Your System Breaks When You Grow: What Actually Fails First

SKIMBOX Team

Growth rarely breaks software gradually. It hits a fixed limit nobody knew existed and stops. Here is what fails first, why the busiest day is the wrong time to find out, and what to check before then.

Your System Breaks When You Grow: What Actually Fails First

Growth does not usually degrade software. It stops it.

For months everything is fine. Response times look healthy, nobody complains, the dashboards are green. Then on one particular afternoon the orders stop going through, and the graph of what went wrong is not a slope. It is a wall.

That shape is the thing to understand, because it explains why nobody saw it coming and why the usual response, adding more servers, frequently does nothing at all.

Fixed limits, not gradual strain

Most of what breaks under growth is a hard limit rather than a resource getting tired.

A database accepts a set number of simultaneous connections. A plan permits a set number of records. A third-party interface allows a set number of requests per minute. A payment provider caps transactions in a window.

Below the limit, everything works and performance looks entirely healthy. Above it, requests are refused. There is no warning zone in between where things feel slightly strained, which is precisely why the failure feels sudden and why monitoring average response times will never predict it.

Cloud providers document this explicitly. AWS describes service quotas as existing partly to prevent you accidentally provisioning more than you need, and partly to protect services from abuse, and notes they are tracked per account and vary by region, so the same limit can be a different number in different places [1].

Crucially, some quotas can be raised on request and some cannot. AWS names examples of the fixed kind: network bandwidth, function invocation payload size, gateway throttle burst rates, and the number of concurrent connections a database will accept [2]. Those are constraints to design around rather than negotiate.

What actually fails first

Rarely your own application code, which is where most people look.

Database connections. This is the most common and the most counterintuitive. Every application instance holds open a number of connections, and the database accepts a finite total. Add instances to handle more traffic and you multiply connections, which is how scaling up the application layer takes the database down. The fix for load causes the outage.

Third-party rate limits. A cap on requests to somebody else's service, enforced by them, indifferent to how important your traffic is. Payment providers, messaging services, mapping interfaces and shipping platforms all apply them.

Plan and storage quotas. The record limit on your current tier, reached quietly one afternoon.

Background job queues. A blind spot because they fail invisibly. If work arrives faster than it is processed, the queue grows and nothing looks broken to anybody until the delay becomes obvious hours later. A running service with a growing backlog appears perfectly healthy from outside.

Data volume, separately from traffic. A query that scans a table gets steadily slower as the table grows. A report that took two seconds at ten thousand records takes two minutes at a million. Nothing fails any check. It simply becomes unusable, gradually enough that nobody can date when it happened.

That last one deserves emphasis because it is the exception to the wall-shaped pattern. Traffic limits break suddenly. Data volume degrades slowly, and it is the version most likely to go unnoticed for a year.

The three growth curves that break different things

Worth separating, because businesses say growth and mean three different things that fail in three different ways.

More users at once. Concurrency. This is the one that hits connection pools, rate limits and throttles, and it is the wall-shaped failure. A system comfortable with fifty simultaneous users can refuse the fifty-first outright if something in the chain caps at fifty. Doubling your marketing spend without checking this is how a successful campaign produces an outage.

More data over time. Accumulation. This degrades rather than stops, and it degrades in queries and reports rather than in the parts users touch most. It is the slowest to notice and the least likely to be attributed correctly, because by the time somebody complains the change happened over eighteen months.

More complexity. More integrations, more record types, more conditional rules. This one does not show up in any performance metric at all. It shows up as changes taking longer and breaking more, which reads as a supplier problem rather than a scaling one. Our guide on technical debt covers that mechanism.

The three need different responses, and the common mistake is applying the fix for one to a problem that is actually another. Adding infrastructure for a concurrency problem is correct. Adding infrastructure for a data-volume problem buys you a faster version of the same slow query. Adding infrastructure for a complexity problem does nothing whatever.

So the first diagnostic question is not how big the problem is. It is which of the three you have, and the answer is usually available from asking what changed: more people at once, more records in total, or more things the system has to do.

The busiest-day problem

Your peak load and your lowest tolerance for failure arrive on the same day. That is not bad luck, it is structural.

A retailer finds its ceiling during a sale. A restaurant platform finds it during Ramadan. A booking system finds it over a holiday period. Load is at its highest, the cost of every failed transaction is at its highest, and the people who could fix it are least available.

So work backwards from the date rather than forwards from today.

Establish expected volume as a multiple of a normal day. Check your limits against that multiple, not against current usage. Arrange any quota increases weeks in advance, because they are not always granted instantly and some are not granted at all. Agree with your supplier who is reachable during the period, which our guide on incident response covers properly. Then test at the expected volume rather than assuming.

Your busiest day in the past two years is a better planning input than any projection, because it is a real number that really happened.

Adding servers is usually not the fix

This is the most common wasted spend in the whole area.

If the constraint is a fixed quota on a shared service, a database connection ceiling, or somebody else's rate limit, adding servers does nothing except arrive at the same limit faster. In the database connection case it actively makes things worse.

So establish what the actual constraint is before buying capacity. The two are unrelated more often than people expect, and a supplier who proposes more infrastructure before identifying the limit is guessing expensively.

Automatic scaling has the same caveat. It helps where the constraint is capacity you can add. It does nothing where the constraint is a fixed quota, a licence limit, or a third party's rate limit. It also carries a cost profile worth understanding before enabling it, because a traffic spike or a runaway process can produce a genuinely surprising bill.

Find your ceiling on purpose

Two exercises, in order of cost.

The free one, which almost nobody has done. List every service your system depends on. Look up the published limit for each. Write your current peak usage next to it.

Providers document these openly. It takes an afternoon, needs no tooling and no supplier involvement, and produces a ranked list of what will break first. That list is the single most useful artefact in this article and most businesses have never produced it.

The paid one. Load testing, for anything with a known peak or a material cost of failure. You do not need an elaborate setup. Generate realistic traffic against a copy of your system until something refuses to work.

What you want from it is not a headline number. It is three things: where the first ceiling sits, what breaks when you cross it, and whether the failure is graceful or catastrophic.

That last distinction matters more than the number. A system that slows under load and recovers afterwards is in acceptable shape. One that starts refusing requests, corrupting data, or requiring a manual restart has a different and more serious problem, regardless of the volume at which it happened.

Watch usage against limits, not absolute numbers

Most monitoring reports absolute figures, which are close to meaningless on their own.

Knowing you are using four hundred database connections tells you nothing without knowing the ceiling is five hundred. Track the percentage of each known limit you consume at peak, and alert somewhere around seventy or eighty per cent, so the conversation happens with weeks of notice rather than during an outage.

The specific threshold matters less than the alert existing and going to somebody who can act on it. An alert nobody owns produces a notification history rather than a response.

AWS frames the underlying principle as stopping guessing capacity, noting that resource saturation is a common cause of failure and that the alternative is to monitor demand and utilisation and adjust resources rather than provision on assumption [3]. That is written for cloud architecture, and the transferable idea for a smaller business is simply that capacity should be a measured thing rather than something somebody assumed once and nobody revisited.

Integrations do not scale with you

Worth stating separately, because it surprises people.

Your systems may handle ten times the volume comfortably while a partner's interface applies exactly the same rate limit it always did. Growth exposes every assumption at the boundary between two systems, and those assumptions were usually made when volumes were much lower, by people who did not write them down.

Handle rate limits properly rather than treating a refusal as an unexpected error. That means queueing and retrying with increasing delays rather than retrying immediately, which makes the situation worse for everybody including you. Where the limit is genuinely too low for your volume, most providers will raise it if asked in advance.

Where two systems meet and something fails, our guide on suppliers blaming each other covers how to establish which side the limit sits on.

This is not a reason to rebuild

Reaching for a rebuild here is usually an expensive misdiagnosis.

Scaling problems are typically concentrated in one or two specific places rather than distributed through the system. Find the actual constraint, fix that, and reassess. Our guide on rebuilding versus fixing covers when replacement genuinely is the answer, and hitting a connection limit is not one of those cases.

Similarly, moving to the cloud changes which limits apply rather than removing limits. Cloud platforms make some kinds of capacity easy to add and introduce their own documented quotas, per account and per region. Our cloud migration guide covers what that move does and does not achieve.

If growth has already outpaced the plan, that is a good problem, and it still needs a diagnosis rather than a panic. Establish which single limit you are hitting, buy time on that one specifically, then look at the next. Trying to fix everything at once during a growth period is how businesses end up with an outage and a rebuild at the same time.

The conversation to have with your supplier

Four questions, and the quality of the answers tells you a great deal about whether anybody has thought about this.

What are our limits, by name and number? Not a reassurance that the system will scale. A list of specific ceilings with specific figures. A supplier who has to go and find out is being honest and you now know the list did not exist. A supplier who says it will be fine has answered a different question.

Where are we against them at peak? The answer should be percentages, not adjectives. If nobody is measuring this, that is the first thing to fix and it is cheap.

Which of these can be raised, and how long does raising them take? Some are a support request answered in hours. Some require a commercial conversation and a plan change. Some cannot be moved at all and have to be designed around. The three need very different lead times and mixing them up is how a peak arrives before the increase does.

What breaks first, and what does that look like to a customer? This is the one that turns an abstract discussion into a decision. If the first thing to fail is a payment gateway rate limit and the customer experience is a declined order with a generic error, that is worth spending money to prevent. If the first thing to fail is a nightly report running slowly, it can wait.

Ask all four in one email. The answers are either available or they are not, and finding out which costs you nothing.

Own it, on a schedule

In most small businesses nobody owns capacity, which is why the first sign of a limit is customers reporting failures.

Give it a name and a quarterly review, attached to something that already happens so it does not depend on anybody remembering. The question at each review is short: what are our limits, how close are we at peak, and what changed since last time?

Plan far enough ahead that the fix is never urgent. That usually means knowing where your ceiling sits at three to five times current volume. You do not need to build for that today. You need to know where it is, what moving it would cost, and how long that would take, so the decision arrives with a timeline rather than as an emergency.

Before your next peak

List your dependencies with their published limits. Work out your expected peak as a multiple of a normal day. Check the two against each other. Then request any quota increases early, because they are not always granted instantly.

That sequence takes about a day and prevents the most common version of this problem outright.

If you want the detailed version, a review covering what your system depends on, where the published and effective limits sit, how close you run at peak, and what would fail first starts from around AED 4,000 with us. Final pricing depends on scope, and these are our own figures rather than a market survey.

References

  1. AWS Well-Architected Framework, manage service quotas and constraints
  2. AWS Well-Architected Framework, accommodate fixed service quotas and constraints through architecture
  3. AWS Well-Architected Framework, reliability design principles
  4. SKIMBOX, it broke at 2am: who do you actually call
  5. SKIMBOX, when two suppliers blame each other
  6. SKIMBOX, rebuild it or fix it
  7. SKIMBOX, cloud migration to AWS in the UAE

AWS documentation describes that platform specifically, and quotas and their adjustability change over time. Check the current documentation for whichever platform you use rather than relying on the examples here.

Frequently asked questions

  • Why does growth break software suddenly instead of gradually?

    Because most of what fails is a fixed limit rather than a gradual slowdown. A connection pool holds a set number of connections, a plan allows a set number of records, an interface permits a set request rate. Below the limit everything is fine and performance looks healthy. Above it, requests are refused outright. There is no warning zone in between where things feel slightly strained, which is exactly why the failure feels sudden and why monitoring average response times will never predict it.

  • What usually fails first?

    Something you are not measuring, and most often it is a limit in a service you depend on rather than in your own code. Database connections, a rate limit on a third-party interface, a payment provider's transaction ceiling, a storage or plan quota, or a background job queue that grows faster than it drains. Your own application code is rarely the first thing to give way, which is why the instinct to optimise it usually addresses the wrong layer entirely.

  • What are service quotas?

    Limits that cloud and platform providers apply to how much of a service you can use. AWS documents them as existing partly to stop you accidentally provisioning more than you need and partly to protect services from abuse. They are tracked per account and vary by region, which means the same named limit can be a different number in different places, and a system that works in one region can fail in another.

  • Can service quotas be raised?

    Some can and some cannot, and knowing which is which matters. Providers document certain quotas as adjustable on request and others as fixed constraints you have to design around. AWS names examples of the fixed kind, including network bandwidth, function invocation payload size, gateway throttle burst rates, and the number of concurrent connections a database will accept. Those are constraints to design around rather than negotiate.

  • How do I find my limits before they find me?

    Make a list of every service your system depends on, then look up the published quotas for each and write down your current usage against them. Providers document these openly. That exercise usually takes an afternoon, requires no testing infrastructure and no supplier involvement, and produces a ranked list of what will break first. It is the single most useful thing in this article and most businesses have never done it.

  • Is adding more servers the usual answer?

    Frequently not, and it is the most common wasted spend in this area. If the constraint is a fixed quota on a shared service, a database connection ceiling, or a third-party rate limit, adding servers does nothing except reach the same limit faster. Establish what the actual constraint is before buying capacity, because the two are unrelated more often than people expect, and a supplier proposing infrastructure before identifying the limit is guessing expensively.

  • What does the database usually run out of first?

    Connections rather than storage or processing power, in most cases. Every application instance holds open a number of connections, and databases accept a finite number in total. Add instances to handle more traffic and you multiply the connections, which is how scaling up the application layer can take the database down. It is both common and counterintuitive, because the action taken to handle more load is the thing that causes the outage. Check total connections across all instances rather than per instance.

  • What is a rate limit and why does it matter?

    A cap on how many requests you may make to a service in a given period, applied by whoever operates that service. It matters because it is enforced by somebody else and does not care how urgent your traffic is. Payment providers, messaging services, mapping interfaces and shipping platforms all apply them, and they bite hardest on precisely the day you can least afford it, because that is the day your volume peaks.

  • How do I handle a rate limit properly?

    Find out what it is, measure how close you get at peak, and handle the refusal gracefully rather than treating it as an unexpected error. That means queueing and retrying with increasing delays rather than immediately retrying, which makes things worse. Where the limit is genuinely too low for your expected volume, most providers will raise it if asked in advance, which is a considerably easier conversation than asking during an incident.

  • What is the busiest-day problem?

    That your peak load and your least tolerance for failure arrive together. A retailer discovers its ceiling on a sale day. A restaurant platform finds it during Ramadan. A booking system finds it during a holiday period. Load is at its highest, the cost of every failed transaction is at its highest, and the people who could fix it are least available, all at the same time. That is structural rather than bad luck.

  • How do I prepare for a known peak?

    Work backwards from the date. Establish expected volume as a multiple of a normal day, check your limits against that multiple rather than against today, arrange any quota increases weeks ahead because they are not always instant, and agree with your supplier who is available during the period. Then test at the expected volume rather than assuming it will hold. Your busiest day in the past two years is a better planning input than any projection, because it actually happened.

  • Should I load test?

    For anything with a known peak or a material cost of failure, yes, and the value is mostly in finding which limit you hit first. You do not need an elaborate setup. Generating realistic traffic against a copy of your system until something refuses to work will tell you more in an afternoon than any amount of architectural discussion about what might theoretically happen.

  • What should a load test actually tell me?

    Where the first ceiling is, what breaks when you cross it, and whether the failure is graceful or catastrophic. A system that slows under load and recovers afterwards is in acceptable shape. One that starts refusing requests, corrupting data or requiring a manual restart has a different and more serious problem, and that distinction matters far more than the specific volume at which it occurred.

  • Is slow the same as broken?

    Commercially it often is, and it is worth deciding your own threshold. A checkout that takes forty seconds converts like one that is down. What matters is which of the two failure modes you actually have, because they are fixed differently. Gradual slowdown usually means a resource under pressure. Sudden refusal usually means a hard limit being hit, and no amount of optimisation moves a hard limit.

  • What about background jobs and queues?

    They are a common blind spot because they fail invisibly. If work arrives faster than it is processed, the queue grows and nothing appears broken to a user until the delay becomes obvious hours later. Monitor queue depth and processing lag rather than only whether the service is running, because a running service with a steadily growing backlog looks completely healthy from the outside right up until it does not.

  • How does data volume break things?

    Differently from traffic, and usually more slowly. A query that scans a table gets steadily slower as the table grows, so a report that took two seconds at ten thousand records takes two minutes at a million. Nothing is broken and nothing fails a check. It simply becomes unusable, and the change happens gradually enough that nobody can date when it started or attribute it to anything in particular.

  • Do integrations scale with me?

    Not automatically, and this catches people. Your own systems may handle ten times the volume comfortably while a partner's interface applies exactly the same rate limit it always has. Growth exposes every assumption at the boundary between two systems, and those assumptions were usually made when volumes were far lower, by people who did not write any of them down.

  • What is the design principle worth borrowing?

    AWS puts it as stopping guessing capacity, noting that resource saturation is a common cause of failure and that the alternative is to monitor demand and utilisation and add or remove resources automatically. The transferable idea for a smaller business is that capacity should be a measured and observed quantity rather than an assumption somebody made once and nobody has revisited since.

  • Should everything scale automatically?

    Automatic scaling helps where the constraint is capacity you can add, and it does nothing at all where the constraint is a fixed quota, a licence limit or somebody else's rate limit. It also carries a cost profile worth understanding before you enable it, because a traffic spike or a runaway process can produce a genuinely surprising bill at the end of the month.

  • What should I monitor to see this coming?

    Usage against limits rather than absolute numbers. Knowing you are using four hundred database connections means nothing without knowing the ceiling is five hundred. Track the percentage of each known limit you consume at peak, and alert well before reaching it, so that the conversation about raising it happens with weeks of notice rather than in the middle of an outage.

  • What is a reasonable alerting threshold?

    Something around seventy or eighty per cent of a known limit measured at peak, which gives you weeks to act rather than merely to observe the problem arriving. The specific threshold matters far less than the alert existing at all and reaching somebody who can act on it. An alert nobody owns produces a notification history rather than a response.

  • How much headroom should I aim for?

    Enough to absorb your largest realistic spike without hitting a ceiling, which for most businesses means designing for several times a normal day rather than a comfortable margin over it. Take your busiest day in the past two years as the starting point rather than a projection, because it is a number that actually happened and nobody can argue with it.

  • Is this a reason to rebuild the system?

    Almost never, and reaching for a rebuild here is usually an expensive misdiagnosis. Scaling problems are typically concentrated in one or two specific places rather than spread through the system. Find the actual constraint first. Find the actual constraint first, fix that one thing, and reassess. Our guide on rebuilding versus fixing covers when replacement genuinely is the answer, and hitting a connection limit is not one of those cases.

  • Does moving to the cloud solve this?

    It changes which limits apply rather than removing limits. Cloud platforms make some kinds of capacity easy to add and introduce their own quotas, which are documented, per account and per region. The move can be worth making for other good reasons. Treating it as a solution to a scaling problem you have not yet diagnosed is not one of them.

  • What if growth was faster than anyone planned for?

    That is a good problem and it still needs a diagnosis rather than a panic. Establish which single limit you are hitting, buy time on that one specifically, and then look at the next one. Trying to fix everything at once during a growth period is how businesses end up dealing with an outage and a rebuild at the same time, with neither going well.

  • How far ahead should I plan capacity?

    Far enough that the fix is not urgent, which usually means knowing where your ceiling sits at three to five times current volume. You do not need to build for that today. You need to know where it is, what it would cost to move, and how long that would take, so the decision has a timeline attached to it.

  • Who should own this?

    Somebody by name, reviewing it on a schedule rather than when something goes wrong. In most small businesses nobody owns capacity at all, which is precisely why the first sign of a limit being reached is customers reporting failures rather than an internal alert. Attaching a quarterly review to something that already happens is usually enough to keep the list current.

  • What is the cheapest useful thing to do?

    Write down every service your system depends on, look up the published limit for each, and note your peak usage beside it. No testing, no tooling, no cost and no supplier involvement required at all. Most businesses have never produced this list at all, and producing it for the first time usually reveals at least one limit sitting far closer than anybody in the room realised.

  • Can you assess this for us?

    We can. A review covering what your system depends on, where the published and effective limits actually sit, how close you run to each at peak, and what would fail first and how, starts from around AED 4,000 with us. Final pricing depends on scope, and these are our own figures rather than a market survey, since no official body publishes rates for this work.

  • What should I do before my next peak?

    List your dependencies with their limits, work out your expected peak as a multiple of a normal day, and check the two against each other. Then request any quota increases early, because they are not always granted instantly and some are not granted at all. That sequence takes about a day and prevents the most common version of this problem outright.

SKIMBOX Team

Tech Consultancy

Get fresh writing in your inbox

One email a fortnight. No filler.

By subscribing, you agree to our privacy policy.

Want us to build something?

We work with teams across MENA, UK, USA, and India to build products, run programs, and grow.

Get in touch

Continue reading