System Design Problems
Additional Resources
1 min read
Here are some useful links for further reading:
- Dynamo - Highly Available Key-value Store -
- Kafka - A Distributed Messaging System for Log Processing -
- Consistent Hashing - Original paper -
- Paxos - Protocol for distributed consensus -
https://www.microsoft.com/en-us/research/uploads/prod/2016/12/paxos-simple-Copy.pdf - Concurrency Controls - Optimistic methods for concurrency controls -
- Gossip protocol - For failure detection and more. -
- Chubby - Lock service for loosely-coupled distributed systems -
- ZooKeeper - Wait-free coordination for Internet-scale systems -
- MapReduce - Simplified Data Processing on Large Clusters -
- Hadoop - A Distributed File System -
Whenever we are designing a large system, we need to consider a few things:
- What are the different architectural pieces that can be used?
- How do these pieces work with each other?
- How can we best utilize these pieces: what are the right tradeoffs?
Investing in scaling before it is needed is generally not a smart business proposition; however, some forethought into the design can save valuable time and resources in the future. In the following chapters, we will try to define some of the core building blocks of scalable systems. Familiarizing these concepts would greatly benefit in understanding distributed system concepts. In the next section, we will go through Consistent Hashing, CAP Theorem, Load Balancing, Caching, Data Partitioning, Indexes, Proxies, Queues, Replication, and choosing between SQL vs. NoSQL.
Let’s start with the Key Characteristics of Distributed Systems.