システム設計面接:Twitterを設計する
「Twitterを設計せよ」はフィード生成問題の典型です。ツイートを投稿し、タイムラインを読むという、見た目はシンプルな問題ですが、面白いのは各ユーザーのホームタイムラインを規模を持って生成する部分であり、正解はハイブリッドなファンアウト戦略です。面接官は、あなたが2つの素朴なアプローチがどちらも破綻することを発見し、推論を重ねてその組み合わせに到達する様子を見たいのです。
意図的に進めましょう:要件を明確にし、読み書き比率を見積もり、ツイートの保存方法を設計し、それからタイムラインを設計します — ファンアウト・オン・ライトとファンアウト・オン・リードを比較し、著名人問題を扱うハイブリッドに到達します。以下のウォークスルーはこの流れに従います。
1. 要件を明確にする
フィードの中心的な問題に範囲を絞ります。ユーザーはツイートを投稿し、他のユーザーをフォローし、フォローしているすべての人のツイートを新しい順にまとめたホームタイムラインを読みます。
- 機能要件:ツイートの投稿、フォロー/フォロー解除、ホームタイムライン(フォローしている人々)、ユーザータイムライン(1人の著者)。基本的な検索は要求がない限り範囲外。
- 非機能要件:非常に読み取り主体、低レイテンシのタイムライン読み取り、高可用性。タイムラインの結果整合性は許容される。
- 確認すべき点:メディア、返信/スレッド、ランキング — これらを認識した上で、この回では時系列順のフィードに範囲を絞る。
2. 規模と読み書き比率を見積もる
この比率が設計全体を導きます。読み取りは書き込みを大幅に上回ります — ユーザーは投稿するよりもはるかに頻繁にタイムラインをスクロールします。数億人のユーザーがいる場合、システムは書き込みが多少高くなってもタイムラインの読み取りを安価にする必要があります。この一つの観察が、タイムラインの事前計算という方向性を示しています。
3. ツイートの保存
ツイート自体は単純で、追記(append)が多いデータです。ツイートIDをキーとして水平分割されたストアに保存します(時間でソート可能なID、例えばSnowflake IDを使うことで、順序が自然に組み込まれます)。別途ソーシャルグラフストアがフォロワー/フォロー関係を保持します。
- ツイート:分散ストア、ツイートIDでシャーディング。時間でソート可能なIDにより、安価な時系列順が得られる。
- ソーシャルグラフ:誰が誰をフォローしているか。「Xのフォロワー全員を取得」「Xがフォローしている全員を取得」に最適化されている。
- キャッシュ(Redis)がホットデータ — 最近のツイートと事前計算されたタイムライン — を保持する。
4. タイムライン生成:書き込み時ファンアウト 対 読み取り時ファンアウト
これが問題の核心です。ファンアウト・オン・ライト(プッシュ)は、投稿時に新しいツイートを各フォロワーの事前計算されたタイムラインリストに挿入します — タイムラインの読み取りは安価なキャッシュ参照になりますが、数百万人のフォロワーを持つ人の投稿は数百万件の書き込みを引き起こします。ファンアウト・オン・リード(プル)は、読み取り時に、あなたがフォローしているすべての人の最近のツイートをマージしてタイムラインを構築します — 書き込みは安価ですが、多くのアカウントをフォローしているユーザーにとっては読み取りが遅く高価になります。
- ファンアウト・オン・ライト:読み取りは高速、書き込みは高価。一般的なユーザーに最適。
- ファンアウト・オン・リード:書き込みは安価、読み取りは高価。フォロワー数が非常に多いアカウントに必要。
5. 著名人問題とハイブリッド
どちらの純粋なアプローチも勝者にはならないので、両方を組み合わせます。大多数のユーザーにはファンアウト・オン・ライトを使いますが、非常に多くのフォロワーを持つ「著名人」アカウントについては、書き込み時にそのツイートをファンアウトしません。代わりに、読み取り時に、フォロワーの事前計算されたタイムラインと、その人がフォローしている少数の著名人からのライブプルをマージします。これにより書き込み増幅を抑えつつ、読み取りを高速に保てます — これが面接官が聞きたい答えです。
6. 言葉にすべきトレードオフ
緊張関係を名指しして締めます:書き込み増幅 対 読み取りレイテンシ(ファンアウトの判断全体)、事前計算されたタイムラインの保存コスト 対 再計算のコスト、そして一貫性 — ツイートがフォロワーのタイムラインに表示されるまで数秒の遅延があっても許容されるため、結果整合性によってスケールできます。ハイブリッドの閾値(「著名人」をどう分類するか)を明示的に述べることが、シニアとしての判断力を示します。
リアルタイムサポートでTwitterのシステム設計を練習する
Nativelyのシステム設計面接アシスタントは、ライブの面接中にあなたを構造立てて支え、次に扱うべき観点を提案し、トレードオフをリアルタイムで表示します。すべて自分のデバイス上で完結します。
