Skip to content
Latticework
Esc
Try
No. 048Risk & Resilience

Antifragility and Chaos Engineering

Some systems get stronger from stress. Inject failure deliberately to find weaknesses before they find you.

Fragile systems are harmed by stress, robust ones are unaffected, and antifragile ones get better; chaos engineering applies controlled stress so each fix makes the system stronger.

To an executive

Some organisations get stronger under pressure while others break. Rehearsing failure on purpose finds weak spots while the stakes are low, rather than in front of customers.

To an engineer

Run controlled failure experiments against a clear healthy-state measure. Turn off the component you fear, fix what you find, and repeat so each round leaves things stronger.

The idea

Nassim Taleb distinguished three kinds of thing. Fragile things are harmed by volatility, robust things are unaffected by it, and antifragile things improve because of it. Bones that strengthen under load and immune systems that learn from exposure are his favourite examples. Resilience resists a shock and stays the same; antifragility gets better.

Software is not antifragile on its own. A server does not learn from crashing. But a system made of software and the team that runs it can be. Chaos engineering is the practice that makes this happen: controlled experiments inject failure, reveal weaknesses while the stakes are low, and each fix leaves the system and the team stronger than before.

Why it works

Hidden weaknesses are found either on your schedule or on the failure's. Every system has untested failure paths. An experiment surfaces them during working hours, with people watching and a way to stop; a real incident surfaces them at 3am.

Small, frequent stress prevents large, rare collapse. Systems that are never stressed drift into fragility: fallbacks rot, timeouts are wrong, runbooks go stale. Regular small doses of failure keep these paths exercised.

Learning compounds. Each experiment that finds a gap produces a fix, a better alert or a clearer runbook. Over time the organisation builds a habit of expecting failure rather than being surprised by it.

Where it applies

  • Distributed systems with many dependencies, where failure modes multiply faster than anyone can reason about them.
  • Recovery mechanisms that rarely run, such as failover, backups, circuit breakers and autoscaling.
  • Teams after an incident, to confirm the fix works and to look for siblings of the same weakness.
  • Platform and SRE functions that want evidence, not assurances, about resilience.

How to apply

  1. Define steady state. Pick measurable outputs, such as throughput, error rate or latency, that show the system is healthy.
  2. State a hypothesis. "If we lose one cache node, checkout error rate stays below its normal level." Then try to disprove it.
  3. Inject realistic failure. Kill instances, add latency, sever connections or exhaust a dependency, prioritised by likelihood and impact.
  4. Minimise the blast radius. Start in staging or with a small slice of production traffic, with a clear abort switch and someone watching.
  5. Feed every finding back. Fix the weakness, add the experiment to an automated suite, and run it again.

Example scenario

A payments team assumed its read replicas would take over if the primary database failed, but nobody had tried it since the system was built. Leadership was nervous about breaking anything deliberately.

The team ran a monthly game day in staging, starting with the database failover. It took four minutes instead of the expected thirty seconds because of a stale DNS setting. Over the following year the game days found a series of similar gaps, each fixed before a customer saw it, and the team went into real incidents with practised runbooks rather than guesses.

Questions to ask

  • When did we last test this failure mode on purpose, and what did we change as a result?
  • What steady-state metric tells us the system is healthy during an experiment?
  • Which component are we afraid to turn off, and why?

When not to use it

  • Systems without basic observability. If you cannot see steady state, you cannot tell whether an experiment hurt anything. Fix monitoring first.
  • Known, unfixed weaknesses. Injecting a failure you already know will cause an outage teaches nothing. Fix it, then test the fix.
  • Safety-critical or regulated systems in production, unless the experiment design has been agreed with the people accountable for the risk.

How it misleads you

Running chaos experiments without steady-state metrics, a hypothesis, or a way to abort turns engineering into vandalism. The opposite failure is calling a system antifragile because it has survived so far; surviving is not the same as improving. Check that each experiment led to a change.

In the wild

Further reading

Last reviewed · Suggest an improvement