为什么系统设计对FAANG L5+至关重要
2024年数据显示,系统设计面试占Google L5+招聘决策的65%。与编程不同(能否解决),系统设计测试你如何思考和权衡。
本文揭示实际面试中的7个真实案例(Netflix、Twitter、Uber),包含完整设计步骤和面试官沟通。
💼 FAANG面试专家让您在45分钟内练习这些设计,实时反馈瓶颈。
您将获得的具体技能
- ✅ 7个常见系统完整设计(用户数、QPS、数据量)
- ✅ 4步框架(需求→容量→组件→深入)
- ✅ 数据库选择标准(SQL vs NoSQL vs NewSQL)
- ✅ 缓存策略(Write-Through vs Write-Back)
- ✅ CAP定理实际应用
4步系统设计框架
第1步:明确需求(5分钟)
# 功能需求
- "核心功能是什么?(发帖、点赞、关注)"
- "需要实时吗?延迟容忍度?"
# 非功能需求(获取数字)
- "月活用户数?"
- "每日发帖/请求数?"
- "数据保留?(如3年)"
第2步:粗略估算(5分钟)
# Twitter类系统
- MAU: 3亿,DAU/MAU: 50% → DAU = 1.5亿
- 每用户每日推文:2条 → 3亿推文/天
# QPS
- Write: 300M / 86400秒 ≈ 3,500 QPS
- Read:Write = 100:1 → Read: 350,000 QPS
# 存储
- 推文大小:300B × 300M = 90GB/天
- 5年:90GB × 365 × 5 ≈ 164TB
Twitter设计(3亿MAU)
# Fan-out策略
# Push模式(< 1000粉丝)
def post_tweet_push(user_id, content):
tweet_id = create_tweet(user_id, content)
followers = get_followers(user_id)
for follower in followers:
redis.zadd(f"timeline:{follower}", {tweet_id: timestamp})
# Pull模式(名人 > 1000粉丝)
def get_timeline_pull(user_id):
following = get_following(user_id)
tweets = [get_latest(celeb, 10) for celeb in following]
return merge_sort_by_time(tweets)
URL缩短(1亿URLs/天)
def generate_short_url(long_url, server_id):
counter = redis.incr(f"counter:server_{server_id}")
short_url = base62.encode(server_id * 1000000 + counter)
db.insert(short_url, long_url)
return short_url[:7]
Uber(200万次/天)
# Geohash + Redis
def update_location(driver_id, lat, lon):
geo = geohash2.encode(lat, lon, precision=5)
redis.geoadd(f"drivers:{geo}", lon, lat, driver_id)
def find_nearby(lat, lon, radius_km=5):
geo = geohash2.encode(lat, lon, 5)
neighbors = geohash2.neighbors(geo) + [geo]
drivers = []
for g in neighbors:
nearby = redis.georadius(f"drivers:{g}", lon, lat, radius_km)
drivers.extend(nearby)
return drivers[:10]