DEV Community

Muhammad Ibtisam
Muhammad Ibtisam

Posted on

How Modern Systems Are Built: A Complete System Design Guide

“System Design isn’t about memorizing terms. It’s about solving one problem and discovering another.”

Here’s a complete journey, starting from the first user request and going all the way to a massive, scalable, real-time backend — explained in simple words, step-by-step.


1️⃣ Client-Server Architecture

Let’s start from the very beginning.
You’re building an app — maybe a shopping website or a ride-booking app.

The app that users see on their screen (called the client) needs to get data — like products, users, prices — from a server (a remote computer).

This is called the Client-Server Architecture. The client asks, the server responds.

But now a big question arises…


2️⃣ IP Address

How does the client find the server?

Just like houses need home addresses, servers need unique numbers called IP addresses. These are how data knows where to go.

But here’s the problem: humans can't remember IPs like 192.0.2.1.

So we need a better system…


3️⃣ DNS (Domain Name System)

DNS is like the contact list on your phone.
You don’t remember phone numbers — you just type names. Similarly, DNS converts facebook.com into its real IP address.

Without DNS, we’d all be typing weird numbers instead of website names.

Now that the client has the server’s address… can it go straight to it?


4️⃣ Proxy / Reverse Proxy

Not always.
In big systems, we place a Reverse Proxy (like NGINX) in front of the actual server. It’s like a receptionist for your backend.

It:

  • Filters unwanted traffic
  • Caches common responses
  • Distributes load
  • Hides internal server info

This makes your system safer and more efficient.

But now, as requests start flowing… we want speed.


5️⃣ Latency

Latency is the time between a user clicking something and getting the response.
Slow systems frustrate users.

Every step — DNS, proxy, server response — adds to latency.

So we must send only what’s needed, as efficiently as possible.

That’s where protocols come in.


6️⃣ HTTP / HTTPS

Clients and servers “talk” using a language called HTTP.
But this talk must be secure, so we wrap it with encryption. That becomes HTTPS.

It ensures no one in the middle (like hackers) can read sensitive data.

But now, how do we define what the client can ask for?


7️⃣ APIs

An API is like a restaurant menu.
It tells the client exactly what it can request — and what it’ll get in return.

APIs are the rules of communication between frontend and backend.

But how should we organize those rules?


8️⃣ REST API

REST is a style of designing APIs.
It uses:

  • URLs like /users/123
  • HTTP methods like GET, POST, PUT, DELETE
  • Clean, predictable structure

REST is great for most apps.

But for complex or mobile apps, REST can feel a bit heavy.


9️⃣ GraphQL

With GraphQL, the client can ask for exactly the data it needs — nothing more, nothing less.

It’s perfect when:

  • You have many frontend devices (web, mobile, smart TVs)
  • You want fewer requests
  • You need fine control over the response

Both REST and GraphQL talk to… the database.


🔟 Databases

The Database is where your system remembers everything:
Users, products, messages, orders — all go here.

Without it, your system has no memory.

But what kind of database should you use?


1️⃣1️⃣ SQL vs NoSQL

  • SQL (like PostgreSQL): Data stored in rows and columns, strict rules, great for transactions.
  • NoSQL (like MongoDB): More flexible, handles lots of data quickly, perfect for huge apps.

But as data grows… performance drops.

So how do we handle more users?


1️⃣2️⃣ Vertical Scaling

First, we try Vertical Scaling: upgrading the server’s RAM, CPU, storage.

It’s like upgrading your laptop to make it faster.

But there’s a limit to how much you can upgrade.


1️⃣3️⃣ Horizontal Scaling

So we do Horizontal Scaling: adding more servers instead of one big one.

Imagine instead of one huge shop, you open 10 smaller ones.

But now… how do you divide the work among them?


1️⃣4️⃣ Load Balancers

Load Balancers sit in front of all your servers and divide traffic evenly.

They:

  • Send each user request to the best-performing server
  • Help handle failures
  • Improve reliability

Great. But now your database is under pressure.


1️⃣5️⃣ Database Indexing

Indexes help databases find data faster — just like a book index.

Instead of reading the whole table, the DB jumps directly to what it needs.

But even with indexing… traffic can overwhelm the database.


1️⃣6️⃣ Replication

We replicate the database:

  • One copy for writing
  • Multiple copies for reading

This makes the system faster and safer. If one DB crashes, others still work.

Still, with massive data, one DB instance isn’t enough.


1️⃣7️⃣ Sharding

You split the data into parts, called shards.
Each shard holds only a slice of the total data (e.g., by region or user ID).

Now, instead of one overloaded DB, you have many smaller, faster ones.

But it gets hard to manage mixed data in one table…


1️⃣8️⃣ Vertical Partitioning

You separate data into logical parts.

Example:

  • One DB for user profiles
  • Another for payment history
  • Another for analytics

It makes data cleaner and services more focused.

But queries are still heavy. We need speed.


1️⃣9️⃣ Caching

You add a cache (like Redis) to store recently used data in memory.

It’s way faster than hitting the database every time.

Example: homepage products, popular posts, session info.

But even joining tables slows things down.


2️⃣0️⃣ Denormalization

Now you duplicate some data across tables to reduce joins.

Yes, it breaks some rules…
But it makes reads blazingly fast — and users happy.

But let’s say your system spans across continents now…


2️⃣1️⃣ CAP Theorem

In big, distributed systems, you can’t have:
✅ Perfect consistency
✅ Always available
✅ Handle network breaks

You must choose two.

This shapes how you design your system — whether to prioritize accuracy or uptime.

Now, what if users upload files?


2️⃣2️⃣ Blob Storage

Large files (images, videos, PDFs) don’t belong in your DB.

You move them to Blob Storage like AWS S3.
It’s cheap, fast, and built for this.

But how do we deliver those files faster?


2️⃣3️⃣ CDN (Content Delivery Network)

CDNs store static content closer to your users around the world.
This means faster load times and lower server load.

Essential for performance-focused apps.

Now… what if your app needs real-time updates?


2️⃣4️⃣ WebSockets

WebSockets keep a live connection open between client and server.

Perfect for:

  • Live chat
  • Multiplayer games
  • Trading dashboards

But what about notifying other services?


2️⃣5️⃣ Webhooks

Webhooks let one app notify another when something happens.
E.g., Stripe pings your app when a payment succeeds.

But your app is huge now. Time to break it down.


2️⃣6️⃣ Microservices

You split your app into microservices:
Each handles one feature — users, orders, inventory, etc.

It’s easier to develop and scale independently.

But how do these services talk?


2️⃣7️⃣ Message Queues

Instead of direct calls, services communicate via message queues (like Kafka, RabbitMQ).

This helps with:

  • Reliability
  • Retry logic
  • Loose coupling

Still… people can abuse your APIs.


2️⃣8️⃣ Rate Limiting

You set a limit on how many requests one user can send in a given time.

This stops:

  • Spammers
  • DDoS attacks
  • Accidental loops

This is often done at the gateway…


2️⃣9️⃣ API Gateway

An API Gateway is a single front door to all your microservices.

It handles:

  • Routing
  • Authentication
  • Rate limiting
  • Logging

But what if a request is repeated?


3️⃣0️⃣ Idempotency

An idempotent operation can run multiple times without changing the result.

Example: If a payment is retried, you don’t want to charge the user twice.

This protects users from bugs and poor networks.


🧩 Summary

Each system design concept solves a problem…
But creates a new one that needs a better solution.

That’s how systems grow.

Top comments (0)