質問

面白いものを見たばかりです 「ツイッターの盛衰」 それは私に考えさせました:

Twitter を再実装するとしたら、何を変えますか?

どのようなテクノロジーを使用しますか?どの言語?

サービスがスケーラブルであることをどのように確認しますか?

他に何を変更しますか?

役に立ちましたか?

解決

私なら次のように GAE に実装します。

各ユーザーは、フォローしている人のツイートを含むテーブルを持ちます。このテーブルには、(ユーザー、タイムスタンプの降順) がキーとして付けられます。

各ユーザーには、ユーザーを一連の連続するフォロワー ID 範囲にマップする follower_ranges テーブルもあります。フォロワーが数千人しかいないほとんどのユーザーの場合、このテーブルには 1 つのエントリ (-inf..+inf) が含まれます。これが暗黙のデフォルトになります。より多くのフォロワーを持つユーザーの場合、表内の各範囲には数千人のユーザーが含まれます。範囲は時間の経過とともにバランスが取られ、一定の間隔内でそれぞれのユーザー数が維持されます。1000 より大きい、10000 より小さい。すべての範囲の結合には、すべてのユーザー ID が含まれます。

ユーザー -> フォロワーの操作が作成されるたびに、アクションとしてエンコードされ、キューに追加されます。キュー内の各要素は (送信者、アクション、ペイロード、フォロワーのサブ範囲) タプルです。キュー ワーカーはアイテムを取得し、指定されたサブ範囲内のすべてのフォロワーを検索し、それぞれにアクションを適用します。(アクションには「ツイートを追加」、「ツイートを削除」、「ツイートを編集」などがあることに注意してください。基本的にはすべてのフォロワーに適用する必要があります。)

各フォロワーにキュー アクションを適用するには、各ユーザーのツイート テーブルに対して対応する書き込みと削除を発行する必要があります。キューの障壁により、書き込みは即座に行われないことになりますが、遅延を数秒未満に抑えることは可能です。

ユーザーにツイートを表示するのは低コストの操作です。「SELECT * FROM ツイート WHERE user_id = :user_id ORDER BY (created_at DESC) LIMIT :max_per_page」。これは単一のテーブルをスキャンし、非常に高速な操作になります。(ユーザー ブロックの遅延を抑えることは良いことです!)

このデザインは最初はかなりうまく拡張できると思います。システムの各コンポーネントを簡単にスケールアップできるようになりました。

  • キュー ストレージは GAE によってサポートされ、任意のデータストア テーブルに応じて拡張できます。
  • フロントエンドは自然にスケーリングでき、スティッキーさは必要ありません
  • いつでもキュー プロセッサを追加できます
  • 実際のストレージ テーブルは自然に拡大し、データストア上で適切に拡張できるはずです。

そうは言っても、すぐに検討できる将来の改善点がいくつか思いつきます。

  • めったに表示されないデータのストレージを削減します。この設計により、各ツイートがフォロワーごとのコピーに非正規化されます。ただし、通常は最新のツイートのみがアクセスされます。N 日経過後にツイートのユーザーごとのコピーを削除することで、大量のストレージを回復できます。ユーザーが古代の歴史から何かを見ようとすると、非正規化されたテーブルからデータがフェッチされます。これは遅くなりますが、それほど頻繁に発生するものではなく、大幅な節約になります。ストレージの節約:(#平均フォロワー数 - 1) / #平均フォロワー数
  • 書き込みパターンが最適ではありません。複数のキュー項目にわたって、各キュー ワーカーはすべてのユーザーのツイート テーブルに書き込むことになるため、書き込みの局所性はあまり良くありません。(最悪の場合、#processor * #storage サーバー接続が必要になります。)これは、各範囲のユーザーに複数の更新を適用することで修正できます。たとえば、2 つのアクション A と B を範囲 [0, 10000) に適用する場合、単一のキュー プロセッサにこれら 2 つのアクションを同時に適用させます。

他のヒント

それはすでに行われています: ラコニカ

  1. それはすでに行われています パート II - 復讐: 識別情報 (ラコニカの上にあります)
  2. それはすでに行われています パート III - ダークサイドから: ヤマー

VBG!(-:

戻ってやり直すという前提から始めます。当時私がツイッターをやっていたら、違うことをするだろうか?

何もありません。

Twitter は重要なことに焦点を当て続けました。実際に人が利用するサービスを提供する 欲しい 使用します。

短期間で非常に人気が高まり、その最大の脅威がそのスケーラビリティになった製品に携わってみたいと思っています。つまり、あなたが勝ったということです。成功には、成功を活かすためのリソースと注目が伴います。

私なら最初からめちゃくちゃスケーラブルに設計します。

私の選択は、Microsoft Platform、C#、IIS、SQL Server、Memcached (または、最終版で起動時に正常に動作する場合は Velocity です ;-)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top