SDN
← 演習一覧へ

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/s10万 req/s (read-heavy)
tweet投稿6千 tweet/s
fanout配信6万配信/s (投稿の10倍)
検索4千 search/s
平均fanout10配信/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をどう整合させる?