System Design Principles

Designing scalable systems requires understanding trade-offs between consistency, availability, and partition tolerance (CAP theorem), along with proven architectural patterns.

Key Components

Component Purpose Popular Tools
Load Balancers Distribute traffic NGINX, HAProxy, AWS ELB
Caching Reduce latency Redis, Memcached, CDN
Databases Data persistence PostgreSQL, MongoDB, Cassandra
Message Queues Async processing RabbitMQ, Kafka, SQS
Microservices Service decomposition Docker, Kubernetes, Service Mesh
CDN Content delivery CloudFlare, AWS CloudFront

Database Sharding Example

-- Sharding by user_id range
-- Shard 1: user_id 1-1000000
CREATE TABLE users_shard_1 (LIKE users);
-- Shard 2: user_id 1000001-2000000
CREATE TABLE users_shard_2 (LIKE users);

-- Application-level routing
def get_shard(user_id):
    if user_id <= 1000000:
        return 'shard_1'
    else:
        return 'shard_2'

Case Study: Twitter Timeline

Twitter faced challenges serving timelines for millions of users. Solution: Pre-compute timelines for active users, fanout-on-write for celebrities, hybrid approach for scalability.