難
Twitter のタイムラインと検索を設計せよ
課題
ユーザーがtweetを投稿すると、フォロワーにpush通知(やemail)が届く。ユーザーは自分のuser timeline(自分の投稿一覧)、home timeline(フォローしている人の投稿が流れてくる)を閲覧できる。キーワードでtweetを検索できる。これを高可用かつ低レイテンシで実現するのが課題。難所は『誰のhome timelineに、いつtweetを配るか(fan-out)』です。
制約・前提
- アクティブユーザーは100M(1億)人
- tweet投稿は500M(5億)/日 = 15B(150億)/月
- 平均fanout(1tweetが届く先)は10配信 → 5B配信/日, 150B/月
- timeline読み取りは250B(2500億) req/月
- 検索は10B(100億) req/月
- 1 tweetあたり10 KB
- 10万 read req/s, 6千 tweet/s, 約6万 fanout配信/s, 4千 search req/s
- read-heavy(読み取りが圧倒的)、高可用が必須
主要数値
概算(back-of-the-envelope)の出発点。
| read req/s | 10万 req/s (read-heavy) |
|---|---|
| tweet投稿 | 6千 tweet/s |
| fanout配信 | 6万配信/s (投稿の10倍) |
| 検索 | 4千 search/s |
| 平均fanout | 10配信/tweet |
| tweetサイズ | 10 KB |
主要数値の可視化
操作別 req/s(対数軸)
readwrite検索配信(fanout)
read-heavy (10万 req/s) タイムライン参照が桁違いに多い。投稿1件で平均10配信される fanout の負荷にも注意。
まず自分で設計を考えてから、1ステップずつ答え合わせをしましょう。
Step 1: 要件・ユースケース(まだ伏せられています)
考えてみよう(面接官の追加質問)
- フォロワー数100でhome timelineを開く頻度が低いユーザーには、fan-out on write は無駄ではないか? どう最適化する?
- ハイブリッドfan-outで『有名人』の閾値(フォロワー何人から read に切り替えるか)はどう決める?
- home timeline cache がノード障害で消えた場合、どう復旧する?(ヒント: SQL DBから再構築)
- 検索インデックスをリアルタイムに保つコストと、数秒遅れを許容するコストのトレードオフは?
- tweetの削除や編集が来たとき、すでに配り終えたhome timeline cacheをどう整合させる?