System Design Series
This article is a proposal for my blog series. I plan to write a systematic tutorial for system design, especially practical knowledge for interviews. This is a long learning journey for me. I hope you could find it helpful as well.
Foundation
So far, I’ve written a series to refresh memory about fundamental concepts:
- Part 1: Basic Concepts
- Part 2: Data Replication (TBD)
- Part 3: ACID Transaction
- Part 4: Distributed Transaction
After learning basic conceptual knowledge, we can continue our journey to learn more about practical systems. In a system design interview, referencing well-known solutions is always better than reinventing the wheels. So, we need to be knowledgeable about standard solutions used in the industry. In the next series, I will discuss several critical building blocks for modern web applications.
Building Blocks
We can break down most companies’ backend stacks into four layers: edge, application, platform, and infrastructure. Figure 1. shows the anatomy of the four layers. Most system design interviews do not require deep knowledge in the infrastructure layer (except infrastructure teams). So, we will focus on the platform, application, and edge layers.
Platform Layer
Messaging system: Design systems related to message queue, pub-sub, and event-driven architecture, etc.
- Kafka — A Big Picture: Kafka has become the cornerstone for building messaging system. This article talks about core Kafka architecture.
Distributed Database: Design horizontally scalable and highly available databases.
Caching: Design in-memory cache clusters, like Memcached and Redis.
Distributed File/Blob Storage: Design scalable distributed file system.
Application Layer
Online Service (OLTP): architecture design patterns in micro-service that serve online traffic.
Data Processing (OLAP): system and design pattern for big data processing
Edge Layer
Architecture design patterns for clients (web/mobile), edge network, CDN network, etc.
Many people know the buzzwords of NoSQL, Spark, Flink, Kafka, etc. But this is not enough for system design interviews. While learning each system, we need to understand the fundamental design trade-offs and build a mental model of internal mechanisms. Then, during the interviews, we would be able to explain why we choose one system over another.
What’s Next?
Even with a solid understanding of each building block, combining those “lego” pieces into a complete application still requires skills, practice, and experience. In the final blog series, we can practice putting things together to build full-blown applications. We will closely study several web applications (also popular interview questions), e.g., Facebook messenger, Twitter feeds, Uber marketplace, Ticketmaster, Amazon shopping cart, recommendation system, etc. When we are fluent at stitching building blocks together into a complete application, we would be ready to ace our next system design interview.