sdlc.dev

Design walkthroughs

Patterns, companies and the systems we build, one narrated diagram at a time.

New7:01
Evolution · intermediateAnti-corruption layer

Translate a vendor's or legacy system's model into yours at one boundary, so their changes stop rippling through your code.

New6:23
APIs · beginnerAPI gateway

Give every client one front door that routes, combines and protects, so services stay private and simple.

New6:54
Scaling · intermediateBackpressure

Let the slow side set the pace: bound every buffer, signal demand upstream, and decide what happens when it is full.

New6:37
APIs · intermediateBackend for frontend

Give each user experience its own thin backend, owned by the team that builds the client.

New6:19
Resilience · intermediateBulkhead

Partition threads, connections and capacity so one failing dependency or tenant cannot sink the rest.

New7:21
Caching · beginnerCache-aside

Read the cache, load from the database on a miss, and delete the key on every write.

New6:57
Caching · beginnerCDN and edge caching

Serve shared content from servers near users, let HTTP headers decide what is stored, and keep serving when the origin fails.

New7:47
Resilience · advancedCell-based architecture

Split the whole stack into identical, independent cells behind a thin router, so one failure hurts one cell, not every customer.

New5:11
Resilience · intermediateCircuit breaker

Stop calling what is failing; answer from a fallback; test before trusting again.

New6:23
Scaling · intermediateConsistent hashing

Put servers and keys on one ring so adding a server moves only a small share of keys.

New7:11
APIs · intermediateContract testing

Each consumer records what it relies on; the provider proves it still delivers before either side deploys.

New6:23
Data · intermediateCQRS

Separate the model that changes data from the models that answer questions, and design for the lag between them.

New6:25
APIs · beginnerCursor pagination

Page through big lists by remembering where you stopped, not how many rows to skip.

New6:49
Messaging · advancedDurable workflows

Write a long business process as ordinary code; an engine records every step so it resumes where it stopped.

New6:59
Data · advancedEvent sourcing

Store every change as an event; rebuild state by replaying them, and keep the full history.

New7:01
Messaging · intermediateEvent streaming

Producers append once to a durable, partitioned log; every consumer reads it at its own offset, and can replay.

New6:44
Evolution · beginnerFeature flags

Ship code dark, switch features on at runtime for chosen users, and switch them off without a deploy.

New6:31
Data · intermediateGeospatial index

File locations by map cell so "what is near me" looks up a few cells instead of scanning the world.

New6:16
Resilience · intermediateGraceful degradation

When an optional part fails, serve a reduced but working answer instead of an error.

New6:42
Data · beginnerIdempotency keys

Make retries safe: the client labels each operation with a key and the server does it once, replaying the answer.

New6:52
Scaling · advancedLeader election

Let exactly one replica do the work: a renewable lease, a majority vote, and fencing tokens for the leader that comes back.

New7:09
Messaging · intermediateTransactional outbox

Commit the event with the change in one local transaction; a relay publishes it, at least once.

New7:13
Messaging · beginnerPublish/subscribe

Publish once to a topic; the broker gives every subscriber its own copy, so new listeners never change the sender.

New7:00
Scaling · beginnerRate limiting

Give every caller its own budget, reject the excess early with 429, and keep one client from taking everyone's share.

New6:35
Resilience · beginnerRetry with backoff and jitter

Retry brief faults, wait longer each time with randomness, and know when to stop.

New7:37
Data · advancedSaga

Keep data consistent across services with local transactions and compensating actions instead of one distributed transaction.

New6:22
APIs · advancedServer-driven UI

Ship screen layouts from the server, rendered with native components the app already has.

New7:00
Scaling · intermediateSharding

Split rows across databases by a shard key, so writes and storage can grow past one machine.

New7:12
Evolution · intermediateStrangler fig

Replace a legacy system one slice at a time behind a routing facade, until the old one can be switched off.

New6:33
Resilience · beginnerTimeout

Never wait forever: give every remote call a time limit, and pass one deadline down the chain.