100 Days of System Design Topics challenges

Join the 100 day System Design Topics coding challenge. Master System Design Topics with daily challenges, projects, and expert guidance.
Start coding today!

Day 1 - CAP Theorem

CAP theorem, also known as Brewer's theorem, is a fundamental principle in distributed systems that states that it is impossible for a distributed data system to simultaneously guarantee all of the following three properties:

Consistency: Every read receives the most recent write or an error.
Availability: Every request receives a response, but it might not be the most recent write.
Partition tolerance: The system continues to operate despite network failures.

According to CAP theorem, a distributed system can only provide at most two out of these three properties at any given time. This theorem has significant implications for designing and understanding the trade-offs in distributed systems, particularly in terms of consistency and availability under network partitions.

https://www.bmc.com/blogs/cap-theorem
https://www.ibm.com/topics/cap-theorem

Day 2 - ACID Transactions

ACID transactions are a set of properties that ensure reliability and consistency in database transactions. The term "ACID" stands for:

Atomcity: Atomicity ensures that all operations within a transaction are treated as a single unit of work. Either all of the operations are successfully completed and the transaction is committed, or none of the operations are performed. If any part of the transaction fails, all the transactions made are undone and the transaction is rolled back to its original state. This property guarantees that the database remains in a consistent state even in the event of any failure.

Consistency: Consistency ensures that the database remains in a valid state before and after the transaction. The integrity constraints and rules defined for the database are not violated during the execution of a transaction.

Isolation: Isolation ensures that each transaction operates independently of other transactions. The intermediate states of a transaction are not visible to other transactions until the transaction is completed (committed)

Durability: Durability ensures that the changes made by a committed transaction persist even in case of system failures, such as crashes or power outages. Once a transaction is committed, its changes are permanently written to the database and cannot be lost. Durability is typically achieved by writing transaction logs.


https://redis.com/glossary/acid-transactions/
Dirty read, Non-repeatable read, and Phantom read

Day 3 - Horizontal vs Vertical Scaling

Horizontal scaling and vertical scaling are two approaches to increasing the capacity and performance of a system, but they differ significantly in how they achieve these goals.

Vertical Scaling (Scale Up):
Vertical scaling involves adding more resources (such as CPU, RAM, or storage) to an existing server or node to increase its capacity.
It typically involves upgrading hardware components, such as replacing a CPU with a faster one, adding more memory modules, or upgrading to a larger storage device.
Vertical scaling is often limited by the maximum capacity of a single server or node and can become expensive or impractical as the system grows in size or demand.
It is commonly used for applications that have low to moderate scalability requirements or when immediate performance improvements are needed.

Horizontal Scaling (Scale Out):
Horizontal scaling involves adding more instances of servers or nodes to a system to distribute the load and increase capacity.
It typically involves deploying multiple instances of the application across multiple servers or virtual machines and using load balancers to distribute incoming requests.
Horizontal scaling offers better scalability and fault tolerance compared to vertical scaling because it allows the system to handle increased loads by adding more servers or nodes as needed.
It is often more cost-effective and flexible than vertical scaling, as it allows for incremental growth by adding additional servers or nodes as demand increases.
Horizontal scaling is commonly used for large-scale web applications, microservices architectures, and distributed systems.


In summary, vertical scaling involves adding more resources to a single server or node, while horizontal scaling involves adding more servers or nodes to a system. Each approach has its advantages and trade-offs, and the choice between them depends on factors such as scalability requirements, cost considerations, and architectural constraints.

Day 4 - Domain Name System (DNS)

The Domain Name System (DNS) is a decentralized hierarchical naming system for computers, services, or any resource connected to the Internet or a private network. It translates human-readable domain names into IP addresses, which are numerical identifiers used to locate and identify devices and services on the network.

Day 5 - Latency vs Throughput

Latency and throughput are two important metrics that are often used to measure the performance of systems, especially in the context of computer networks and distributed systems. While they are related, they represent different aspects of system performance.

Day 6 - Load Balancing

Load balancing is a crucial technique used in distributed computing and networking to efficiently distribute incoming traffic or workload across multiple servers or resources. It helps optimize resource utilization, improve system performance, and ensure high availability and reliability.

Day 7 - Caching Patterns

Caching patterns are strategies used to optimize performance by storing frequently accessed data in a cache, reducing the need to repeatedly fetch data from the original source.

Day 8 - SQL vs NoSQL

SQL (Structured Query Language) and NoSQL (Not Only SQL) are two broad categories of database systems, each with its own strengths and use cases.

Day 9 - Database Indexes

Database indexes are data structures used to improve the performance of queries by enabling efficient data retrieval based on specific columns or fields.

Day 10 - Database Sharding

Database sharding is a technique used to horizontally partition data across multiple independent databases (shards) to improve scalability, performance, and fault tolerance.

Day 11 - Content Delivery Network (CDN)

Day 12 - Strong vs Eventual Consistency

Day 13 - Batch Processing vs Stream Processing

Day 14 - Concurrency vs Parallelism

Day 15 - Synchronous vs. asynchronous communications

Day 19 - Redundancy and Replication

Day 23 - Microservices Architecture

      Blog|Feedback|Careers|Contact Us
      Have Feedback or want to contribute? Email: hello[@]100DaysOfCode.io
      100DaysOfCode@2024