如果你正準備大廠系統設計面試,那 Reddit 絕對是你的「必刷」公司之一。作為一個全球知名的社群新聞聚合平台,Reddit的用戶規模已超 5 億月活。它不光是“外網的知乎”,更是矽谷面試官的最愛——為什麼?因為 Reddit System Design Interview 超級貼合真實場景:高並發、讀寫分離、個人化推薦,這些都是大廠(如 Meta、Google)面試的常客。
但話說回來,系統設計面試的難度可不小。它不像演算法題有標準答案,而是檢視你的架構思維:你能不能從需求分析到瓶頸優化,一步一步建立一個可擴展的系統?很多人卡在「高 QPS 下怎麼緩存」或「寫負載怎麼異步化」上,面試官一追問就露餡。別慌,今天我就來帶大家深度拆解 Reddit 的兩道經典題:Design Reddit’s feed ranking system 和 Design the voting system。這些都是 Reddit 面試高頻題,幫你理清思路,面試時自信滿滿。
第一題:Design Reddit’s Feed Ranking System,包括Home Feed和r/popular
這題是 Reddit 系統設計的“開胃菜”,考察你對讀密集型系統的把控。 Feed 是用戶打開 App 的第一眼,延遲要超過 200ms,用戶就跑了。核心:從海量貼文中,為用戶產生個人化/熱門列表,支援無限滾動。
1. 功能需求:先明確邊界
- Home Feed:登入用戶看到訂閱 subreddits(子版塊)的帖子,按 Hot/Best/New 排序。個人化強,考慮用戶活躍度。
- r/popular Feed:全站熱門,匿名用戶也能看。不分 subreddit,純靠演算法推全球 Top。
- 非功能:QPS 超 10 萬,99.9%可用性,支援 A/B 測試排序演算法。
2. 架構大綱:讀寫分離是王道
Feed 系統的痛點是讀 QPS 是寫的 100 倍!直接讀資料庫?崩潰。解決方案:Fan-out on Write(寫時扇出),預先計算 Feed 存快取。
- 寫入路徑(貼文發布):
- 使用者發文→ 存 Posts 表(用 Cassandra,寫友善、分區鍵是 subreddit_id)。
- Kafka 投遞「新貼文事件」 → Feed 服務訂閱,查詢訂閱使用者清單(從 User-Sub 表,sharding by user_id)。
- 對每個活躍用戶(eg, 過去 30 天登入),將 post_id 推入其 Redis Feed(sorted set,score 是排序值)。大 subreddit(如 r/all)訂閱者百萬級?用混合策略:小 sub 全扇出,大 sub 讀時即時合併。
- 讀取路徑(拉Feed):
- 使用者請求→ 從 Redis 取 Top N post_ids(ZREVRANGE)。
- 大量拉帖子詳情(從 Memcached 緩存,miss 則 Cassandra)。
- 支援分頁:用 Redis 的 cursor 或時間戳錨點,實現無限滾動。
r/popular 呢?簡單:維護一個全域 Redis sorted set,全站新帖實時推入,score 用 Hot 公式計算。匿名用戶直讀,QPS 高但個人化低。
3. 排序演算法:Reddit 的“黑科技”
排序是靈魂! Reddit 開源過公式,別死記,理解原理。
- Hot Ranking:新帖衝榜,老帖衰減。公式:score = log10(|up – down|) + (timestamp / 45000)。 log 壓低極端票數,時間項目讓貼文「熱窗」內爆發。實作:Feed 服務計算 score,存 Redis。
- Best Ranking:防刷票,用 Wilson Score Interval(信賴區間):score = (p + z²/(2n) – z√(p(1-p)/n + z²/(4n²))) / (1 + z²/n),p 是按讚率,n 總票,z=1.96(95%置信)。小帖懲罰大,公平。
- 擴充:加 ML?用 TensorFlow Serving 嵌入使用者向量,實時 re-rank Top 100。
4. 優化&擴充:別忘瓶頸
- 快取:L1 Redis(Feed IDs),L2 Memcached(貼文內容)。失效:貼文更新時異步 evict。
- Hot Sub问题:限流大 sub 發帖,或用「pull on read」:使用者讀取時,從 sub Feed 合併(用 Bloom Filter 去重)。
- 监控:Prometheus抓QPS/延迟,A/B测试不同算法。
這題面了,面試官常問:「如果 subreddit 破億訂閱,怎麼辦?」答:分層扇出+採樣活躍用戶。穩!
第二题:Design the Voting System (Upvote/Downvote) for Posts and Comments
投票是 Reddit 的“社交心臟”,每秒萬級寫入操作!這題考 write-heavy 設計,重點防爭用、非同步化。瓶頸:並發更新票數鎖表。
1. 需求&瓶頸:高並發寫是魔鬼
- 功能:用戶對 post/comment 投+1/-1,支援撤回/切換。即時更新 UI 票數,但最終一致 OK。
- 瓶頸:Naive 更新 Posts 表的 up/down 字段,高並發下鎖爭用。 QPS: 寫 10k/s,讀更高。
2. 架構:非同步聚合,解耦寫讀
別再同步寫 DB!用事件驅動+批量聚合。
- API 層:POST /vote {content_id, Direction: 1/-1/0}。檢查使用者是否已投下(Redis set: user_votes:{user_id})。
- 寫入路徑:
- 投後→存票表(schema: user_id, content_id, Direction;按 content_id 分片,Vitess 或 CockroachDB)。
- 投遞 Kafka 事件→ Vote Aggregator 服務訂閱,每分鐘/5 分鐘批次聚合:SUM(direction)更新 Posts 的 up/down/score。
- 讀取路徑:票數讀 Posts(最終一致,延遲<1min)。即時 UI?用 WebSocket 推增量,或 Redis pub/sub 廣播熱門貼文。
3. 資料模型:冗餘&Sharding
- Posts/Comments:id, up, down, score=up-down。Cassandra分区。
- Votes:巨表,TTL 過期舊投。索引:(user_id, content_id)防重投。
- User Votes:Redis hash,快速查/撤。
4. Anti-Abuse:社群安全第一
刷票毀平台! Reddit 封過無數 bot。
- Rate Limit:API 網關,user/IP 限 5/s,用 Token Bucket。
- 行為偵測:非同步 Spark job 分析:新號群投? IP 叢集?用 ML(Isolation Forest)標記,排除其票。
- 指纹:存 device_id + IP,聚類防馬甲。
- Captcha:高風險投加驗證。
最佳化:聚合視窗調小(熱門貼文 1min),冷帖日批。面試追問:「最終不一致怎麼通知用戶?」答:樂觀 UI + 輪詢/WS。
面試思路總結
Reddit 的系統設計題難度中等偏上,屬於「多模組協同+ trade-off 表達」型問題。面試官期待聽到的重點是:
- 你能辨識系統的讀寫比例和效能瓶頸。
- 你能設計事件流(Kafka)和快取(Redis)的配合機制。
- 你能分析 fan-out on write/read 的取捨邏輯。
- 你考慮到了反作弊與最終一致性問題。
面試時可以用白板畫出整體架構圖,從資料流向入手,再講細節最佳化與擴充方案。
Programhelp 助攻系統設計面試:語音即時救場直推 Offer
大廠真槍實彈導師:團隊多位 Amazon SDE、Meta 工程師、他們不只教理論,還分享內幕:Reddit 面試官愛問“Hot Subreddit 負載怎麼破?”,我們有現成 case 幫你秒答。
实时语音助攻,零压力模拟:全程遠程 Zoom/語音聯機,導師在旁低聲提醒:「別忘 Wilson Score 防小帖刷票!」或「這裡加個 Redis sorted set 畫圖」。幫你釐清從需求→架構→優化的全流程,優化答案節奏-5min 需求、10min 高階圖、5min 瓶頸。
真實面試無痕守護:支援直播面試遠端語音(耳機模式,面試官聽不見)。安全加密,無痕退出。學員回饋:“Meta 系統設計輪,本來卡在 Voting sharding,導師語音點醒,順利過!”
成功率爆表:已助 500+學員碾壓 Meta、Reddit、Amazon 等大廠面試。一位學員分享:“Programhelp 讓我從'畫不出圖'到'面試官點頭',直推 HFT Offer。”