NOTE

Designing Highly Available Systems

Availability engineering through redundancy, failure domains, timeouts, retries, load shedding, replication, failover, graceful degradation, observability, and recovery testing.

System DesignCreated Updated 1 min readhistorical

This is a historical learning note and may contain outdated or incomplete understanding.

1. Availability Is an End-to-End Property

Adding two servers does not automatically make a system highly available. Availability depends on every critical dependency and on whether failover actually works under real failure modes.

Define a target SLO first, such as request success/latency over a time window.

2. Remove Single Points of Failure

Use redundancy across independent failure domains:

  • multiple application instances;
  • load balancers/gateways with HA;
  • replicated storage;
  • multi-zone placement where the requirement justifies it.

Independence matters: two replicas on the same rack, credential, quota, or control plane may fail together.

3. Bound Failures

Every remote dependency needs a timeout. Without one, a slow dependency can consume all threads/connections and become a cascading failure.

Use:

  • bounded retries with backoff/jitter;
  • circuit breakers when useful;
  • concurrency limits/bulkheads;
  • load shedding and admission control.

Retries multiply load, so they need budgets.

4. Graceful Degradation

Not every dependency deserves to take down the request.

Possible fallback behaviors:

  • stale cache;
  • reduced feature set;
  • asynchronous completion;
  • default/partial response;
  • queue for later processing.

Fallback must have explicit correctness limits.

5. Data Availability

Choose replication/failover based on RPO/RTO and consistency needs. More replicas do not guarantee zero data loss if replication is asynchronous.

Backups are separate from replicas: replication copies mistakes too.

6. Observe and Test

Monitor user-facing SLOs, saturation, dependency errors, queue/replication lag, and failover state.

Regularly test:

  • instance loss;
  • zone/network partition;
  • dependency latency;
  • bad deploy/config;
  • backup restoration.

A failover design that has never been exercised is an assumption, not a capability.

Loading helpful count