次の要件を備えたスケーラブルなチャットサーバーを設計するように求められたとします。
私はこの記事を読んでいます: League of Legendsはチャットを7000万人のプレーヤーにスケーリングしました そして、彼らがゲームで使用したコアアーキテクチャを逃したと思います。しかし、とにかくここに私の「思考プロセス」があります。誰かがそれを見ることができますか?
したがって、フローは次のようになります。
Bがオフラインの場合、ステップ5まではすべて同じままです。違いは、サーバー1はメッセージのコピーを破棄できますが、サーバー2は破棄できないことです。
したがって、全体的なアーキテクチャは次のようになります。
私は多くのことをここで見逃していることに気づきました、私は明白な何かを見逃しましたか?私の思考プロセスの一部がまったく間違っているのですか?
あなたはcan P2Pネットワークを使用しますが、アーキテクチャ的に興味深いものです。
ピア検出のDHTとしてKademliaのようなものを使用することは、ターゲットに到達する前に限られた数のノードと通信することを意味します。これらの各ホップにメッセージを保存した場合、メッセージストアに冗長性があり、要件に対して十分に信頼できる可能性があります。オフライン配信は、バッファリングされた各メッセージの定期的な転送試行を意味します。 ピアの発見の観点から、かなり低いレイテンシが保証されます。これは、おそらく問題の中で最もコストのかかる部分です。
直接P2P接続が確立されると、明らかにオンラインモードになり、オフラインストレージをスキップできます(またはスキップできません)。
メッセージを永続的に格納するノードを実行することもできますが、それ以外の場合は通常のDHT参加者として機能します。少数のノードを実行するだけで、より高い信頼性が得られます。
しかし、@ aridlehooverが書いているように、実際には最終的な回答を提供できないほど多くの可能な回答があります。
私はこれをクラウドで設計し、MongoDBやAzure Cosmos DBなどを使用します。良い点は、データベースがデータ側のスケーリングを処理するため、心配する必要がないことです。
あとは、選択したデータストアの上にWeb APIを作成するだけです。これはクラウドベースの場合もあるので、クラウドプロバイダーはリクエストのスケーリングを自動的に処理できます。
何らかの理由でクラウドが選択肢にならない場合(現時点では考えられません)、これらのデータベースプラットフォームはどちらもオンプレミスでもホスト可能であることを認識してください。これにより、コンテナーやKubernetesなどで簡単に実行できるWeb APIのスケーリングが可能になります。これは、データベースプラットフォーム自体をホストするための推奨事項でもあります。