Practical Design Examples 2
Practical Design Examples 2¶
Difficulty: ββββ
Overview¶
In this chapter, we design social media and real-time communication systems: News Feed/Timeline, Chat System, and Notification System. These systems handle large-scale users, where real-time responsiveness and scalability are critical challenges.
Table of Contents¶
1. News Feed / Timeline¶
1.1 Requirements Definition¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Functional Requirements β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Core Features: β
β 1. Create posts: text, images, videos β
β 2. News feed view: posts from followed users β
β 3. Timeline view: list of posts from a specific user β
β β
β Additional Features: β
β 4. Likes, comments β
β 5. Infinite scroll β
β 6. Real-time updates β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Scale β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β - Daily Active Users (DAU): 100M β
β - Average follows per user: 200 β
β - Daily posts: 10M β
β - Feed view frequency: 10 times/day/user β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
1.2 Core Challenge: Push vs Pull¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Feed Generation Strategy β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Method 1: Pull (Fan-out on Read) β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β When user requests feed: β β
β β β β
β β 1. Get following list β β
β β 2. Get latest posts from each followed user β β
β β 3. Merge and sort β β
β β 4. Return β β
β β β β
β β ββββββββββββ β β
β β β User ββββ GET /feed β β
β β ββββββ¬ββββββ β β
β β β β β
β β βΌ β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β SELECT * FROM posts β β β
β β β WHERE author_id IN (SELECT followee FROM follows β β β
β β β WHERE follower = user_id) β β β
β β β ORDER BY created_at DESC β β β
β β β LIMIT 20; β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β Pros: β β
β β - Saves storage space β β
β β - Post creation is fast β β
β β β β
β β Cons: β β
β β - Feed retrieval is slow (if following many) β β
β β - DB load β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Method 2: Push (Fan-out on Write) β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β When post is created: β β
β β β β
β β 1. Save post β β
β β 2. Add to all followers' feeds β β
β β β β
β β ββββββββββββ β β
β β β Author ββββ POST /posts β β
β β ββββββ¬ββββββ β β
β β β β β
β β βΌ β β
β β ββββββββββββββββ β β
β β β Save Post β β β
β β ββββββββ¬ββββββββ β β
β β β β β
β β βΌ β β
β β ββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββ β β
β β β Fan-out to ββββββΊβ Follower 1 Feed: [post_id, ...] β β β
β β β all followersββββββΊβ Follower 2 Feed: [post_id, ...] β β β
β β β ββββββΊβ Follower 3 Feed: [post_id, ...] β β β
β β β ββββββΊβ ... β β β
β β ββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β Pros: β β
β β - Feed retrieval is fast (pre-computed) β β
β β β β
β β Cons: β β
β β - Uses more storage space β β
β β - Celeb (high follower count) post delays β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
1.3 Hybrid Approach¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Hybrid Fan-out β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Key Idea: β
β - Regular users: Push (Fan-out on Write) β
β - Hot users (celebrities): Pull (Fan-out on Read) β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Post Creation: β β
β β β β
β β ββββββββββββ β β
β β β Author ββββΊ Check follower count β β
β β ββββββ¬ββββββ β β
β β β β β
β β ββββββ΄βββββ β β
β β β β β β
β β βΌ βΌ β β
β β < 10K β₯ 10K β β
β β followers followers β β
β β β β β β
β β βΌ βΌ β β
β β Push Save to β β
β β to all hot_posts β β
β β feeds table only β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Feed Retrieval: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β 1. Get pre-computed feed (pushed posts) β β
β β 2. Get latest posts from followed hot users β β
β β 3. Merge and sort β β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β β
β β β Pre-computed Feed Hot Users Posts β β β
β β β βββββββββββββββββ βββββββββββββββββ β β β
β β β β [post1] β β [celeb_post1] β β β β
β β β β [post2] β + β [celeb_post2] β β β β
β β β β [post3] β β β β β β
β β β βββββββββββββββββ βββββββββββββββββ β β β
β β β β β β β β
β β β ββββββββββ¬ββββββββββββ β β β
β β β βΌ β β β
β β β Merge & Sort β β β
β β β β β β β
β β β βΌ β β β
β β β Final Feed β β β
β β β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
1.4 System Architecture¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β News Feed Architecture β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β ββββββββββ β β
β β β Client β β β
β β βββββ¬βββββ β β
β β β β β
β β βΌ β β
β β βββββββββββββββββββ β β
β β β API Gateway β β β
β β βββββββββ¬ββββββββββ β β
β β β β β
β β βββββββββ΄ββββββββ β β
β β β β β β
β β βΌ βΌ β β
β β βββββββββββββββ βββββββββββββββ β β
β β β Post Serviceβ β Feed Serviceβ β β
β β ββββββββ¬βββββββ ββββββββ¬βββββββ β β
β β β β β β
β β βΌ β β β
β β βββββββββββββββ β β β
β β β Posts DB β β β β
β β β (Sharded) β β β β
β β ββββββββ¬βββββββ β β β
β β β β β β
β β βΌ βΌ β β
β β ββββββββββββββββββββββββββββββββββββββββ β β
β β β Message Queue β β β
β β β (Kafka) β β β
β β βββββββββββββββββββ¬βββββββββββββββββββββ β β
β β β β β
β β βΌ β β
β β ββββββββββββββββββββββββββββββββββββββββ β β
β β β Fanout Workers β β β
β β β ββββββββββ ββββββββββ ββββββββββ β β β
β β β βWorker 1β βWorker 2β βWorker 3β β β β
β β β βββββ¬βββββ βββββ¬βββββ βββββ¬βββββ β β β
β β ββββββββΌβββββββββββΌβββββββββββΌβββββββββ β β
β β β β β β β
β β ββββββββββββΌβββββββββββ β β
β β βΌ β β
β β ββββββββββββββββββββββββββββββββββββββββ β β
β β β Feed Cache (Redis) β β β
β β β user:123:feed = [post_ids...] β β β
β β ββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
1.5 Feed Caching Strategy¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Feed Caching β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Redis Feed Structure: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Key: feed:{user_id} β β
β β Type: Sorted Set β β
β β Score: timestamp β β
β β Member: post_id β β
β β β β
β β ZADD feed:123 1704067200 "post_abc" β β
β β ZADD feed:123 1704067300 "post_def" β β
β β ... β β
β β β β
β β Query: ZREVRANGE feed:123 0 19 β β
β β β Returns 20 most recent post IDs β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Cache Management: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β - Limit feed size: Keep only last 800 posts β β
β β ZREMRANGEBYRANK feed:123 0 -801 β β
β β β β
β β - TTL setting: Cache only active users β β
β β Inactive users β Rebuild on query β β
β β β β
β β - Post content in separate cache β β
β β Key: post:{post_id} β β
β β Value: { author, content, media, ... } β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
2. Chat System¶
2.1 Requirements Definition¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Functional Requirements β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Core Features: β
β 1. 1:1 chat β
β 2. Group chat (up to 500 members) β
β 3. Online status indicator β
β 4. Read receipts β
β β
β Message Features: β
β 5. Text, image, file transfer β
β 6. Message history sync β
β 7. Push notifications (when offline) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Non-Functional Requirements β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β - Real-time delivery: < 100ms β
β - Message ordering guarantee β
β - No message loss β
β - Concurrent connections: millions β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
2.2 Communication Protocol¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Protocol Selection β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β 1. HTTP Polling β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Client Server β β
β β β β β β
β β βββ GET /messages ββΊβ β β
β β ββββ [] βββββββββββββ β β
β β β β β β
β β βββ GET /messages ββΊβ (5 seconds later) β β
β β ββββ [] βββββββββββββ β β
β β β β β β
β β βββ GET /messages ββΊβ (5 seconds later) β β
β β ββββ [msg1] βββββββββ β β
β β β β
β β Cons: Latency, unnecessary requests, server load β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β 2. Long Polling β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Client Server β β
β β β β β β
β β βββ GET /messages ββΊβ β β
β β β (waiting...) β β β
β β β β Message arrives! β β
β β ββββ [msg1] βββββββββ β β
β β βββ GET /messages ββΊβ (immediate reconnect) β β
β β β (waiting...) β β β
β β β β
β β Improvement: Reduced unnecessary requests β β
β β Cons: Connection overhead, server resources β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β 3. WebSocket (Recommended) β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Client Server β β
β β β β β β
β β βββ HTTP Upgrade βββΊβ β β
β β βββ 101 Switching βββ β β
β β β β β β
β β ββββ WebSocket ββββββ (bidirectional connection maintained) β β
β β β β β β
β β ββββ [msg1] βββββββββ (server push) β β
β β βββ [msg2] βββββββββΊβ (client send) β β
β β ββββ [msg3] βββββββββ β β
β β β β
β β Pros: Real-time, bidirectional, minimal overhead β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
2.3 System Architecture¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Chat System Architecture β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β ββββββββββββ ββββββββββββ ββββββββββββ β β
β β β Client A β β Client B β β Client C β β β
β β ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ β β
β β β WebSocket β WebSocket β WebSocket β β
β β β β β β β
β β βΌ βΌ βΌ β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Load Balancer β β β
β β β (Sticky Sessions by user_id) β β β
β β ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ β β
β β β β β
β β βββββββββββββββββββΌββββββββββββββββββ β β
β β βΌ βΌ βΌ β β
β β ββββββββββββββ ββββββββββββββ ββββββββββββββ β β
β β β Chat Srv 1 β β Chat Srv 2 β β Chat Srv 3 β β β
β β β [A's conn] β β [B's conn] β β [C's conn] β β β
β β βββββββ¬βββββββ βββββββ¬βββββββ βββββββ¬βββββββ β β
β β β β β β β
β β ββββββββββββββββββΌβββββββββββββββββ β β
β β β β β
β β βΌ β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Message Broker (Redis Pub/Sub) β β β
β β β β β β
β β β A sends to B: β β β
β β β 1. Chat Srv 1 β PUBLISH chat:B "msg from A" β β β
β β β 2. Chat Srv 2 β SUBSCRIBE chat:B β deliver to B β β β
β β β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β
β β βΌ β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Message Store (Cassandra) β β β
β β β β β β
β β β Partition Key: conversation_id β β β
β β β Clustering Key: message_id (time-based) β β β
β β β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
2.4 Message Delivery Flow¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1:1 Message Delivery β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β User A β User B message delivery: β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β 1. A βββ [msg] ββββΊ Chat Server 1 β β
β β β β β
β β 2. βΌ β β
β β βββββββββββββββββββββββββββββββ β β
β β β Message Service β β β
β β β - Generate message_id β β β
β β β - Validate message β β β
β β βββββββββββββββ¬ββββββββββββββββ β β
β β β β β
β β 3. β β β
β β βββββββββββββββΌββββββββββββββββ β β
β β β β β β β
β β βΌ βΌ βΌ β β
β β ββββββββββββ ββββββββββββ ββββββββββββββββ β β
β β β Store β β Publish β β Check B β β β
β β β to DB β β to Kafka β β online? β β β
β β ββββββββββββ ββββββββββββ ββββββββ¬ββββββββ β β
β β β β β
β β 4. ββββββββ΄βββββββ β β
β β β β β β
β β Online Offline β β
β β β β β β
β β βΌ βΌ β β
β β ββββββββββββ ββββββββββββ β β
β β β Pub/Sub β β Push β β β
β β β to B β β Queue β β β
β β ββββββ¬ββββββ ββββββββββββ β β
β β β β β
β β 5. βΌ β β
β β Chat Server 2 βββ [msg] ββββΊ B β β
β β β β
β β 6. A ββββ [ack] βββ Chat Server 1 β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
2.5 Group Chat¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Group Chat Design β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Group Message Delivery: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β 1. Sender βββ [msg] ββββΊ Message Service β β
β β β β β
β β 2. βΌ β β
β β Get group members (100 members) β β
β β β β β
β β 3. βΌ β β
β β ββββββββββββββββββΌβββββββββββββββββ β β
β β β β β β β
β β βΌ βΌ βΌ β β
β β [Online 60] [Online 30] [Offline 10] β β
β β β β β β β
β β βΌ βΌ βΌ β β
β β Pub/Sub Pub/Sub Push Queue β β
β β (batch) (batch) β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Optimizations: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β 1. Prioritize online members β β
β β 2. Batch processing (multiple members at once) β β
β β 3. Read receipts with sampling (not all members) β β
β β 4. Large groups: Consider client-side pull approach β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
2.6 Online Status Management¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Online Presence β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Status Types: β
β - Online: Currently connected β
β - Offline: No connection β
β - Away: Connected but inactive β
β - Last Seen: Last connection time β
β β
β Implementation: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β 1. Heartbeat-based β β
β β β β
β β Client βββ heartbeat (every 30 sec) ββββΊ Server β β
β β β β β
β β βΌ β β
β β Redis: SET presence:user123 "online"β β
β β EXPIRE presence:user123 60 β β
β β β β
β β No heartbeat for 60 sec β Key expires β Offline β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Status Propagation: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β When User A's status changes: β β
β β β β
β β 1. Get A's friends list β β
β β 2. Filter only online friends β β
β β 3. Push status change to those friends β β
β β β β
β β Optimizations: β β
β β - Batch processing if many friends β β
β β - Prevent frequent changes (debounce) β β
β β - Prioritize active chat participants β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
2.7 Message Storage¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Message DB Schema (Cassandra) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β messages table: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β CREATE TABLE messages ( β β
β β conversation_id UUID, -- Conversation ID β β
β β message_id TIMEUUID, -- Time-based UUID β β
β β sender_id UUID, -- Sender β β
β β content TEXT, -- Message content β β
β β content_type TEXT, -- text, image, file β β
β β created_at TIMESTAMP, -- Creation time β β
β β PRIMARY KEY (conversation_id, message_id) β β
β β ) WITH CLUSTERING ORDER BY (message_id DESC); β β
β β β β
β β -- Sorted by latest message first β β
β β -- Partitioned by conversation (watch for hot partitions) β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β conversations table: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β CREATE TABLE user_conversations ( β β
β β user_id UUID, β β
β β last_message_at TIMESTAMP, -- For sorting β β
β β conversation_id UUID, β β
β β conversation_type TEXT, -- dm, group β β
β β unread_count INT, -- Unread messages β β
β β PRIMARY KEY (user_id, last_message_at, conversation_id) β β
β β ) WITH CLUSTERING ORDER BY (last_message_at DESC); β β
β β β β
β β -- Query conversations per user β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
3. Notification System¶
3.1 Requirements Definition¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Functional Requirements β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Notification Channels: β
β 1. iOS push (APNs) β
β 2. Android push (FCM) β
β 3. SMS β
β 4. Email β
β β
β Features: β
β 5. Notification templates β
β 6. Per-user notification settings β
β 7. Scheduled notifications β
β 8. Notification history β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Non-Functional Requirements β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β - Daily notifications: 10B (10 billion) β
β - Soft real-time: Delivery within seconds β
β - Deduplication β
β - Priority support β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
3.2 System Architecture¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Notification System Architecture β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Event Sources β β β
β β β ββββββββββ ββββββββββ ββββββββββ ββββββββββ β β β
β β β βOrder β βPayment β βSocial β βScheduleβ β β β
β β β βService β βService β βService β βService β β β β
β β β βββββ¬βββββ βββββ¬βββββ βββββ¬βββββ βββββ¬βββββ β β β
β β β β β β β β β β
β β ββββββββΌβββββββββββΌβββββββββββΌβββββββββββΌβββββββββββββββββββββ β β
β β β β β β β β
β β ββββββββββββ΄βββββββββββ΄βββββββββββ β β
β β β β β
β β βΌ β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Notification Service β β β
β β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β
β β β β 1. Validation β β β β
β β β β 2. User Preferences Check β β β β
β β β β 3. Rate Limiting β β β β
β β β β 4. Template Rendering β β β β
β β β β 5. Priority Assignment β β β β
β β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β
β β ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ β β
β β β β β
β β βΌ β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Message Queues (Priority-based) β β β
β β β βββββββββββββββ βββββββββββββββ βββββββββββββββ β β β
β β β β High Queue β β Medium Queueβ β Low Queue β β β β
β β β ββββββββ¬βββββββ ββββββββ¬βββββββ ββββββββ¬βββββββ β β β
β β βββββββββββΌββββββββββββββββΌββββββββββββββββΌββββββββββββββββββββ β β
β β β β β β β
β β βΌ βΌ βΌ β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Workers β β β
β β β ββββββββββ ββββββββββ ββββββββββ ββββββββββ β β β
β β β β iOS β βAndroid β β SMS β β Email β β β β
β β β β Worker β β Worker β β Worker β β Worker β β β β
β β β βββββ¬βββββ βββββ¬βββββ βββββ¬βββββ βββββ¬βββββ β β β
β β ββββββββΌβββββββββββΌβββββββββββΌβββββββββββΌββββββββββββββββββββββ β β
β β β β β β β β
β β βΌ βΌ βΌ βΌ β β
β β ββββββββ ββββββββ ββββββββ ββββββββ β β
β β β APNs β β FCM β βTwilioβ β SES β β β
β β ββββββββ ββββββββ ββββββββ ββββββββ β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
3.3 Notification Flow¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Notification Delivery Flow β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β 1. Receive Event β β
β β βββββββββββββ β β
β β { β β
β β "event_type": "order_shipped", β β
β β "user_id": "user123", β β
β β "data": { "order_id": "ORD456", "tracking": "..." } β β
β β } β β
β β β β
β β 2. Check User Settings β β
β β βββββββββββββββββ β β
β β SELECT * FROM user_notification_settings β β
β β WHERE user_id = 'user123'; β β
β β β β
β β β push: true, email: true, sms: false β β
β β β β
β β 3. Get Device Tokens β β
β β βββββββββββββββββ β β
β β SELECT device_token, platform β β
β β FROM user_devices WHERE user_id = 'user123'; β β
β β β β
β β β [{ token: "abc...", platform: "ios" }, β β
β β { token: "def...", platform: "android" }] β β
β β β β
β β 4. Render Template β β
β β βββββββββββββββββ β β
β β Template: "Your order {order_id} has been shipped!" β β
β β Result: "Your order ORD456 has been shipped!" β β
β β β β
β β 5. Deduplication Check β β
β β βββββββββββββββββ β β
β β Redis SETNX dedup:{event_hash} 1 EX 86400 β β
β β β Prevent duplicate notifications within 24 hours β β
β β β β
β β 6. Publish to Queues β β
β β βββββββββββββββββ β β
β β Publish to ios_queue, android_queue, email_queue β β
β β β β
β β 7. Worker Processing β β
β β βββββββββββββββββ β β
β β iOS Worker β APNs API β Apple servers β β
β β Android Worker β FCM API β Google servers β β
β β Email Worker β SES API β Email delivery β β
β β β β
β β 8. Store Result β β
β β βββββββββββββββββ β β
β β INSERT INTO notification_logs (...) β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
3.4 Deduplication¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Duplicate Notification Prevention β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Problems: β
β - Duplicate event publishing β
β - Duplicates from worker retries β
β - Race conditions in distributed environment β
β β
β Solutions: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β 1. Event-Level Deduplication β β
β β βββββββββββββββββββββββββ β β
β β event_key = hash(event_type + user_id + key_data) β β
β β β β
β β if not redis.setnx(f"dedup:{event_key}", 1, ex=86400): β β
β β return # Already processed β β
β β β β
β β 2. Delivery-Level Deduplication β β
β β βββββββββββββββββββββββββ β β
β β notification_id = generate_unique_id() β β
β β β β
β β Check before each channel delivery: β β
β β if not redis.setnx(f"sent:{notification_id}:{channel}", 1): β β
β β return # Already sent β β
β β β β
β β 3. Frequency Limiting β β
β β βββββββββββββββββββββββββ β β
β β max_per_hour = 10 β β
β β β β
β β current = redis.incr(f"rate:{user_id}:{hour}") β β
β β if current > max_per_hour: β β
β β # Limit exceeded β send later or ignore β β
β β enqueue_for_later() β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
3.5 Priority Handling¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Notification Priority β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Priority Classification: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β HIGH (immediate): β β
β β - Security alerts (suspicious login) β β
β β - 2FA codes β β
β β - Urgent system alerts β β
β β β β
β β MEDIUM (within seconds): β β
β β - Chat messages β β
β β - Order status changes β β
β β - Payment notifications β β
β β β β
β β LOW (minutes to hours): β β
β β - Marketing notifications β β
β β - Recommendations β β
β β - Summary notifications β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Implementation: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Priority-based queues: β β
β β β β
β β βββββββββββββββββββ β β
β β β HIGH Queue β βββΊ Dedicated 10 Workers β β
β β βββββββββββββββββββ (always process immediately) β β
β β β β
β β βββββββββββββββββββ β β
β β β MEDIUM Queue β βββΊ Shared 50 Workers β β
β β βββββββββββββββββββ (when HIGH is empty) β β
β β β β
β β βββββββββββββββββββ β β
β β β LOW Queue β βββΊ Shared 50 Workers β β
β β βββββββββββββββββββ (when HIGH, MEDIUM empty) β β
β β β β
β β Worker processing order: β β
β β while True: β β
β β msg = high_queue.pop() or β β
β β medium_queue.pop() or β β
β β low_queue.pop() β β
β β process(msg) β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
3.6 Notification Settings Schema¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DB Schema β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β user_notification_settings: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β user_id UUID PK β β
β β channel VARCHAR PK (push/email/sms) β β
β β enabled BOOLEAN β β
β β quiet_hours JSONB {"start": "22:00", "end": "08:00"}β β
β β frequency VARCHAR immediate/daily/weekly β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β notification_type_settings: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β user_id UUID PK β β
β β notification_type VARCHAR PK (order/social/marketing) β β
β β push_enabled BOOLEAN β β
β β email_enabled BOOLEAN β β
β β sms_enabled BOOLEAN β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β user_devices: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β device_id UUID PK β β
β β user_id UUID FK β β
β β platform VARCHAR ios/android β β
β β device_token VARCHAR Push token β β
β β last_active TIMESTAMP Last activity β β
β β app_version VARCHAR App version β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β notification_logs: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β id UUID PK β β
β β user_id UUID β β
β β type VARCHAR Notification type β β
β β channel VARCHAR Delivery channel β β
β β content JSONB Notification content β β
β β status VARCHAR sent/failed/pending β β
β β sent_at TIMESTAMP Sent time β β
β β read_at TIMESTAMP Read time β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
4. Practice Problems¶
Exercise 1: News Feed Extension¶
Design additions with the following features: - Ad insertion (every 5th post) - Trending post recommendations - "Not interested" feedback handling
Exercise 2: Chat System Extension¶
Design to meet the following requirements: - End-to-End encryption - Message edit/delete (within 24 hours) - Video/voice call signaling
Exercise 3: Notification System Optimization¶
Design to handle the following scenarios: - Global service: Multi-language notifications - Notification batching: Grouping similar notifications - A/B testing: Notification copy optimization
Conclusion¶
Through this series, we learned the core concepts and patterns of system design. In actual interviews or projects, it's important to clarify requirements, consider trade-offs, and create scalable designs.
Next steps: - Analyze actual open-source system code - Study company tech blogs (Netflix, Uber, Twitter, etc.) - Practice mock system design interviews
References¶
- "System Design Interview" - Alex Xu Vol.1 & Vol.2
- "Designing Data-Intensive Applications" - Martin Kleppmann
- Twitter Timeline Architecture
- Facebook News Feed Architecture
- WhatsApp Architecture at Scale
- Discord How Discord Stores Billions of Messages
- Airbnb Notification System