
Explore the basics of system design and learn common terminologies and jargons through examples that span micro-services to large distributed systems.
Explore foundational concepts of system design and sharpen skills for beginners, developers, and system design interviews, guiding better design choices.
Shruti Mantri, a computer science engineer from BITS Pilani, shares her background as an architect with 10+ years in engineering and 6 years in system design, plus 300 design interviews.
Define latency as the time to return a result, measured in milliseconds, using an API example. Explain percentile latency, such as p90 and p99, including three 9s and four 9s.
Explore throughput as the amount of data or requests processed per unit of time. Higher processing capability and parallelism boost throughput, increasing how many requests a system can handle.
Vertical scaling adds more resources to the existing box to handle increasing demand. It means increasing CPU cores and memory, upgrading from 4-core 16 GB to 8-core 32 GB.
Scale your system horizontally by adding more boxes to host the API and distribute requests across them to handle rising traffic.
A load balancer distributes incoming requests across multiple servers using strategies like round robin, weighted round robin, hash, and least connections, with health checks and a fronting ip.
Contrast stateful and stateless architectures, describing how stateful apps save session data on the server to reduce latency, and how sticky sessions influence load distribution.
Compare relational sql databases with schemas and tables to non-relational stores. Explore document, key-value, wide-column, and graph databases with examples like MongoDB, Redis, DynamoDB, Cassandra, HBase, Neo4j, and ArangoDB.
Explain how ACID properties apply to relational databases and BASE properties to non-relational databases, detailing atomicity, consistency, isolation, durability, and eventual consistency with a practical transfer example.
Explore partitioning and sharding as strategies to scale relational databases beyond hardware limits, detailing vertical and horizontal partitioning, normalization, row splitting, and cross-server performance and complexity tradeoffs.
Learn how in-memory databases store data in RAM for ultra low latency, use disk-backed transaction logs to protect data, and scale with distributed clusters and in-sync replicas to improve robustness.
Define the CAP theorem by detailing consistency, availability, and partition tolerance, then explain how each property ensures data uniformity, reliable service, and resilience to network partitions.
Explore the cap theorem and why a distributed data store cannot provide consistency, availability, and partition tolerance simultaneously, illustrated by a master-slave example with synchronous replication.
Show how relational databases prioritize consistency and availability over partition tolerance under ACID, using master–slave replication, and contrast with non-relational databases that tolerate partitioning at the expense of consistency.
Explore caching principles rooted in locality of reference, including cache hit and miss, eviction policies like LRU and LFU, and distributed cache concepts, including content delivery networks.
Explore caching versus in-memory databases: caches offer fast, volatile key-value storage with no processing, while in-memory databases add processing, querying, multiple data structures, and disk persistence via transaction logs.
Explore cache writing policies that balance consistency and latency between cache and the database. Learn write-through, write-behind, and write-around approaches with examples like video view counts.
Compare soap, rest, and the query language that reduces overfetching, noting xml verbosity, endpoint driven requests, and client defined attributes.
Explore the core http methods—post, get, put, patch, delete—and their use in creating, reading, updating, and deleting resources, with notes on safety and status codes like 200 and 201.
Explore common http response codes across categories 2xx, 4xx and 5xx, with examples like 200, 201, 400, 401, 403, 404, 500, and 503.
Differentiate synchronous and asynchronous calls: synchronous blocks the main thread until a response, while asynchronous spawns a new thread so the main thread continues, as in checkout and printing invoices.
Analyze blocking versus non-blocking calls, showing synchronous operations on the main thread and asynchronous work via new threads for tasks like mass notifications.
Http, as an application protocol, relies on transport layer protocols. Tcp provides connection-oriented reliability with in-order delivery, while udp trades reliability for speed.
Explore how WebSocket enables a two-way, persistent client–server connection for messaging systems; learn how the server initiates communication and allows clients to exchange data anytime.
Explore message broadcasting in clusters, starting with a full communication where every host talks to every other. Compare it to gossip protocols and leader-based coordination, such as zookeeper, reducing messages.
Introduction to Course
As a computer engineer, be it student, developer or an architect, you are actively involved in designing systems. These systems can vary from small micro-services to large distributed systems. While designing such systems, it is very necessary that you are clear on the basics of system design. System design involves a large variety of concepts. It consists of various terminologies and jargons that you might encounter while reading articles, blogs, going through courses or videos. In order to design a good system, or in order to understand someone else's design, you should be well aware about what does a particular design choice actually entail. In this course, I will cover a wide variety of System Design concepts, and try to explain them with the help of examples, so that you can easily understand these concepts.
Please feel free to drop in comments if you want me to cover any System Design concept not yet covered in the course.