Cluster Design — Architect Track›01 · Requirements → NFRs

Lesson 01 of 13 · Requirements & Proof

Requirements → NFRs

Meet the track's fictional customer and turn vague wishes ('fast', 'always up') into measurable non-functional requirements and SLOs, with availability math, RPO/RTO, and acceptance criteria that a design can be tested against.

Architect
Key wordsrequirementsnon-functional requirementsNFR sheetSLOavailability matherror budgetRPORTOacceptance criteriastakeholders

The customer for this track

Every lesson in this track follows ParcelPath, a fictional parcel-tracking company. Their brief, as written by their CTO:

"We're moving our tracking platform onto Kubernetes in our own two data centres. About 40 services, PostgreSQL, Kafka and Redis. Customers and couriers hit the tracking API all day, with peaks during holiday season. It must be fast, always up, secure, and we can't lose orders. Budget matters."

Your first job is to turn that into something a design can be tested against.

A customer saying "build me a nice, fast, strong house" isn't enough to start building. You ask: how many people live there? how fast must the lift be? what earthquake should it survive? Only when the wishes become numbers you can check can you design the house, and later prove you built what they asked for.

Functional vs non-functional

  • Functional: what the system does (track a parcel, create an order).
  • Non-functional (NFRs): how well: availability, latency, throughput, scalability, durability, security, operability, cost.

Platform design is mostly about NFRs.

Make every NFR measurable

ID Category Requirement Target Measured
NFR-01 Availability Tracking API successful responses 99.95% / 30 days Ingress logs/metrics, 5xx + timeouts = bad
NFR-02 Latency GET /track p99 < 300 ms at ≤ 3,000 req/s Ingress histogram
NFR-03 Throughput Peak load (holiday) 3,000 req/s sustained 2 h, 4,500 burst 10 min Load test
NFR-04 Durability Orders RPO 5 min, RTO 60 min DR drill
NFR-05 Scalability Growth 2× traffic in 18 months without redesign Capacity model
NFR-06 Security Data in transit / at rest TLS 1.2+ everywhere external; encrypted volumes Config audit
NFR-07 Operability Upgrades Kubernetes minor upgrade without customer-visible downtime Upgrade test
NFR-08 Cost Infra budget ≤ agreed hardware envelope (N servers) Sizing sheet

Ask who owns each target and how it will be measured, before designing anything.

Availability math you'll use

A 30-day month has 43,200 minutes:

Target Allowed downtime / 30 days
99.9% 43.2 min
99.95% 21.6 min
99.99% 4.32 min
  • Serial dependencies multiply: API (99.95%) → database (99.95%) → at best ≈ 99.90%.
  • Parallel redundancy helps only if failures are independent: two 99% components give 99.99% on paper, but shared power, network, software bugs or operators break independence.
  • Every planned maintenance counts too, unless the SLO explicitly excludes it (it usually shouldn't).

RPO and RTO

  • RPO (recovery point objective): the maximum acceptable data loss, in time. RPO 5 min → replication or backups at least every 5 minutes.
  • RTO (recovery time objective): the maximum time to restore service. RTO 60 min → failover must be rehearsed and largely automated.
  • Set them per data class: orders (strict), tracking events (can be replayed from Kafka?), caches (none).

Scenario: the customer wants 99.99% on two racks

ParcelPath's CTO asks for 99.99% on the tracking API, but the budget covers two racks in one data centre, fed by one power feed and one pair of top-of-rack switches.

How do you respond?

Negotiate the architecture, not the number:

  • 99.99% allows 4.3 minutes of downtime a month, including upgrades, bad deploys and every incident. Shared power and network in one room are common-cause failures that no amount of Kubernetes replication fixes.
  • Show the math and the failure modes: what 99.99% would need (at least two independent failure domains: separate power, network and ideally sites, plus automated failover and very mature operations).
  • Offer options: 99.95% on the current footprint with a clear list of risks; or 99.99% with a second site/independent power and the added cost.
  • Agree how it's measured (at the ingress, per 30 days) and what's excluded (nothing, ideally).

The outcome is a documented decision (ADR, lesson 05) the customer signs off, not a promise the design can't keep.

Try it: ParcelPath's NFR sheet

  1. Copy the NFR table and add rows for Kafka event durability, admin UI availability, and log retention.
  2. For each row, write the measurement method and where the data comes from.
  3. Calculate the serial availability of: ingress (99.99%) → API (99.95%) → PostgreSQL (99.95%) → Redis (99.9%) if every call needs all four. What does that mean for NFR-01?
  4. Propose RPO/RTO for orders, tracking events and caches, with a sentence of justification each.
  5. Write three acceptance criteria a test team could run before go-live.

Going deeper: requirements workshops

  • Interview several stakeholders (product, operations, security, finance); they want different things, and conflicts must surface early.
  • Distinguish SLOs (internal targets) from SLAs (contracts with penalties); SLOs should be stricter.
  • Record assumptions (traffic growth, peak patterns) explicitly; they're the first thing to revisit when reality differs.

Recap

  • Turn wishes into measurable NFRs: metric, target, percentile, window, load, measurement point, owner.
  • Availability math: minutes per month; serial dependencies multiply; parallel only helps when failures are independent.
  • RPO (data loss) and RTO (time to restore) per data class.
  • Negotiate architecture and cost when targets exceed the footprint, and write the decision down.

This site is a public version of my personal engineering knowledge hub. It intentionally excludes confidential company information and internal operational details.