大規模なオンラインアプリケーションは、過去XNUMX年間で長い道のりを歩んできました。 これらの革新は、ソフトウェア開発に対する私たちの認識を変えました。 たとえば、Facebook、Instagram、Twitterはすべてスケーラブルなプラットフォームです。
これらのシステムは、世界中で何十億もの人々が同時に使用しているため、大量のトラフィックとデータを管理するように構築する必要があります。 これはいつ システム設計 画像に入る。
特定の基準を満たすシステムのアーキテクチャ、インターフェイス、およびデータを確立するプロセスは、システム設計と呼ばれます。 一貫性のある効率的なシステムを通じて、システム設計はビジネスまたは組織の要求を満たします。
会社または組織が基準を決定したら、消費者の要求を満たす物理システム設計にそれらを組み込み始めることができます。
特注の開発、商用ソリューション、またはそのXNUMXつの組み合わせのいずれを選択する場合でも、システムの設計方法によって、システムの構築方法が決まります。
この投稿では、チュートリアルを備えたTwitterタイムラインのシステム設計について詳しく見ていきます。 始めましょう。
ステップ1:ユースケースと制約の概要
使用事例
- ユーザーがツイートをアップロードします。
- このサービスは、ツイートのフォロワーにプッシュ通知と電子メールを送信します。
- ユーザーのタイムラインが表示されます(ユーザーからのアクティビティ)
- ユーザーはホームタイムラインを確認します(ユーザーがフォローしているユーザーのアクティビティ)
- キーワードはユーザーによって検索されます。
- サービスは本当にアクセス可能です。
範囲外
- ツイートは、このサービスを使用してTwitterFirehoseおよびその他のストリームに送信されます。
- このサービスは、ユーザーの可視性設定に基づいてツイートを削除します。
- ユーザーが返信先のユーザーもフォローしていない場合は、返信を非表示にします。
- 「リツイートを非表示」オプションを確認してください。
- アナリティクス
制約と仮定
州の仮定
- トラフィックは均等に分散されません。
- ツイートを送信するのは簡単なはずです。
- フォロワーが数百万人いない限り、すべてのフォロワーにツイートをすばやく送信する必要があります。
- 100億人のアクティブユーザーがいます。
- 毎月15億ツイートまたは毎日500億ツイート
- 各ツイートには、平均10回の配信のファンアウトがあります。
- ファンアウトは毎日5億のツイートを配信しています。
- ファンアウトは毎月150億のツイートを配信しています。
- 月間250億件の読み取りリクエスト
- 月間10億回の検索
タイムライン
- タイムラインはナビゲートしやすいものでなければなりません。
- Twitterは、書くことよりも読むことを目的としています。
- ツイートをすばやく読むために最適化する
- ツイートの消費には時間がかかります。
を検索
- 検索プロセスは迅速でなければなりません。
- 検索には時間がかかります。
使用量を計算する
各ツイートのサイズ:
- 8バイトのツイートID
- 32バイトのユーザーID
- 140バイトのテキスト
- メディア–平均10 KB
- 合計:〜10 KB
毎月、150TBの新鮮なツイートコンテンツが生成されます。
- *毎日500億ツイート*月に30日*ツイートあたり10KB
- 5.4年間で、XNUMXPBの新鮮なツイートコンテンツがありました。
毎秒100,000件の読み取り要求があります。
- *(400秒あたり1リクエスト/ 250か月あたりXNUMX億リクエスト)毎月XNUMX億件の読み取りリクエスト
毎秒6,000件のツイートがあります。
- *(400秒あたり1リクエスト/ 15か月あたりXNUMX億リクエスト)毎月XNUMX億ツイート
ファンアウトでは、毎秒60万件のツイートが送信されます。
- ファンアウトは毎月150億のツイートを配信します*(400秒あたり1リクエスト/ XNUMXか月あたりXNUMX億リクエスト)。
毎秒4,000件の情報要求
- *(400秒あたり1リクエスト/ 10か月あたりXNUMX億リクエスト)毎月XNUMX億回の検索
いくつかの有用な変換
- 毎月2.5万秒が経過します。
- 2.5秒あたり1リクエストでXNUMXか月あたりXNUMX万リクエスト
- 100か月あたり40億リクエストxXNUMX秒あたりXNUMXリクエスト
- 1か月あたり400億リクエスト=XNUMX秒あたりXNUMXリクエスト
ステップ2:高レベルの図
ステップ3:コアコンポーネントの説明
ユーザーがツイートを送信した場合、ユーザー自身のツイートを保存して、ユーザーのタイムライン(ユーザーからのアクティビティ)をリレーショナルデータベースに入力することができます。 ツイートを配信してホームタイムラインを作成することはより困難です(ユーザーがフォローする個人からのアクティビティ)。
典型的なリレーショナルデータベースは、すべてのフォロワーにツイートをファンアウトすることで圧倒されます(毎秒60万件のツイートが配信されます)。 おそらく、NoSQLデータベースやメモリキャッシュのような高速書き込みデータストレージを使用したいと思うでしょう。
メモリから1MBを順次読み取るには、約250マイクロ秒かかりますが、SSDからの読み取りには4倍の時間がかかり、ディスクからの読み取りには80倍の時間がかかります。
オブジェクトストアは、画像やビデオなどのデータを保存するために使用できます。
- リバースプロキシとして機能しているWebサーバーは、クライアントからツイートを受信します。
- リクエストは、WebサーバーによってWriteAPIサーバーに送信されます。
- Write APIは、ツイートをユーザーのタイムラインのSQLデータベースに保存します。
ファンアウトサービスは書き込みAPIから接続され、次のタスクを実行します。
- User Graph Serviceにクエリを実行して、メモリキャッシュ内のユーザーのフォロワーを検索します。
- メモリキャッシュでは、ツイートはユーザーのフォロワーのホームタイムラインに保存されます。
- 1,000フォロワー=1,000ルックアップおよび挿入=O(n)操作。
- ツイートは検索インデックスサービスに保存され、すばやく検索できます。
- オブジェクトストアは、メディアを保存するために使用されます。
- 通知サービスを介してフォロワーにプッシュアラートを送信します。
- アラートを非同期で送信するために、キューを使用します。
メモリキャッシュがRedisの場合、次の構造のネイティブRedisリストを利用できます。
ユーザーのホームタイムラインは、メモリキャッシュに保存される新しいツイートで更新されます。 次のパブリックRESTAPIを利用します。
ユーザーのタイムラインはユーザーによって表示されます。
- Webサーバーは、クライアントからユーザータイムライン要求を受信します。
- リクエストは、WebサーバーによってReadAPIサーバーに送信されます。
- Read APIは、SQLデータベースにユーザーの時間枠を照会します。
REST APIは、すべてのツイートがフォローしているユーザーではなくユーザーから発信されることを除いて、ホームタイムラインと同様に機能します。
ユーザーがキーワードを検索します。
- Webサーバーは、クライアントから検索要求を受信します。
- リクエストは、WebサーバーによってSearchAPIサーバーに送信されます。
ステップ4:Twitterのタイムライン
タイムラインの作成は難しい作業です。 Webサーバーまたはアプリケーションサーバーにリンクするタイムライン生成サーバーが必要です。
ユーザーがサインインするたびに、タイムラインサービスは、フォロワーのテーブル内のユーザーからの最新のツイートを追跡し、ユーザーのタイムラインを更新または更新します。
ここでは、いかなる種類のランキングシステムも実装していません。 代わりに、ユーザーのフォロワーからの上位5つのツイートが作成時間の順にタイムラインに表示されると想定しています。 50ツイートの更新カットオフを維持できます。 そのしきい値に達した後も、ユーザーがページを更新するまで、更新またはタイムラインの作成を停止します。
高いレイテンシとパフォーマンスの懸念は、ライブユーザーフィードの作成から生じます。 代わりに、すぐに表示できるオフラインストリームを作成することが、パフォーマンスを向上させるための最良の方法です。 アプリケーションサーバーに定期的にpingを実行する専用のタイムラインサーバーを実行して、フィードが作成された時間に基づいてフィードを更新します。
ランキングアルゴリズムは、重要なシグナルを考慮し、ユーザーのタイムラインが、フォローしているXNUMXつ以上のアカウントからの資料によって支配されないことを保証するための重みを提供する必要があります。
より正確には、いいね、コメント、共有の数、更新時間など、フィードアイテムの関連性に関連する機能を選択できます。 これらの各基準を使用してツイートを評価し、そのランクを使用してタイムラインにツイートを表示する必要があります。
ニュースフィードの新しいコンテンツが利用可能になったときに、ユーザーに常に警告する必要がありますか? ユーザーは、新しいデータが利用可能になったときにアラートを受け取ることが有益であると感じることができます。 ただし、モバイルデバイスでは、データの使用にかなりのコストがかかる場合、帯域幅を浪費する可能性があります。
その結果、モバイルデバイスにデータをプッシュせず、代わりにユーザーが新しい投稿のために「プルして更新」できるようにすることができます。
ステップ5:スケーリング設計
潜在的なボトルネックはファンアウトサービスです。 数百万人のフォロワーを持つTwitterユーザーは、ツイートが公開されるまで数分待つ必要があります。 これにより、ツイートへの返信との競合が発生する可能性があります。これは、配信時にツイートを並べ替えることで回避できます。
また、フォロワー数の多い人からのツイートの拡散を防ぐこともできます。 代わりに、フォローの多い個人からのツイートを検索し、検索結果をユーザーのホームタイムラインの結果と統合して、配信時にツイートを並べ替えることができます。
追加の機能強化は次のとおりです。
- ホームタイムラインごとに、メモリキャッシュに数百のツイートのみを保持します。
- メモリキャッシュには、アクティブなユーザーのホームタイムライン情報のみが保存されます。
- ユーザーが過去30日間アクティブでなかった場合は、SQLデータベースから年表を再構築できます。
- ユーザーが誰であるかを確認するには、ユーザーグラフサービスを利用します。
- ツイートをSQLデータベースから取得して、メモリキャッシュに追加します。
- ツイート情報サービスは、XNUMXか月分のツイートしか保存できません。
- ユーザー情報サービスでは、アクティブなユーザーのみが保存されます。
- レイテンシーを低く保つために、検索クラスターはおそらくツイートをメモリーに保持する必要があります。
まとめ
Twitterは大規模な組織ですが、より優れた組織です。 システム設計の理解。 Twitterのタイムラインの概要をお伝えできるように最善を尽くしました。
そこから有益な情報を得て、活用していただければ幸いです。
コメントを残す