ASP.NET MVCとC#を使用しています。リアルタイムでデータを転送するためのSignalRが見つかりましたが、signalRにはいくつかの制限があります。
この問題による :
バックプレーンを使用すると、最大メッセージスループットは、クライアントが単一のサーバーノードと直接通信する場合よりも低くなります。これは、バックプレーンがすべてのメッセージをすべてのノードに転送するため、バックプレーンがボトルネックになる可能性があるためです。この制限が問題になるかどうかは、アプリケーションによって異なります。たとえば、ここにいくつかの典型的なSignalRシナリオがあります:
私のプロジェクトは、高頻度のリアルタイム(リアルタイムゲームなど)にする必要があります。
また、リアルタイムのビデオチャットが必要です
私のシナリオ:
マスターサーバーとマルチスレーブサーバーがあり、クライアントはスレーブサーバーに接続し、スレーブサーバーはマスターサーバーに接続します。
例:サーバースレーブ1とサーバースレーブ2はマスターサーバーに接続され、クライアントAとクライアントBはスレーブ1に接続され、クライアントCとクライアントDはスレーブ2に接続されます。
クライアント-メッセージまたはデータの送信、またはクライアントとのライブチャット-D
このシナリオを実装するにはどうすればよいですか?
[更新-1]
その問題にsignalRを使用しない場合、何を使用すればよいですか?
[アップデート-2]
私のシナリオでは、マスターサーバーはルーターのように機能し、スレーブサーバーはスイッチのように機能します。スイッチに接続されているクライアントとルーターに接続されているスイッチ。client-Aがclient-Cにデータパケットを送信する場合、データパケットはルーターに送信する必要があります。ルーターはデータパケットを処理します。 10,000を超えています。
ありがとう。
バックプレーンはメッセージ配信の遅延を引き起こしますが、これは低遅延の作業にはうまく機能しません。クライアントを処理するために絶対に複数のサーバーが必要であり、絶対に必要な最小の遅延がある場合、バックプレーンはおそらく機能しません。
ただし、ASPフォーラムで この会話 を確認してください。ポスターは、3,000の接続されたクライアント1つのサーバー上。
よくあることですが、ここでのトレードオフは、レイテンシーと複雑さの間です。最適な解決策は、メッセージがターゲットクライアントを含むサーバーにのみルーティングされることです。これを実現するには、すべてのクライアント接続を追跡したり、さまざまなサーバーへの再接続に対処したりする方法が必要です。おそらく、数十時間のハードslogプログラミングでこれを解決できますが、そうすることで、ほとんどのSignalRが役立つ理由。
別の方法として、最初に頭に浮かぶのは ZeroMQ です。特にクライアントがブラウザベースの場合はもう少し作業が必要ですが、ZeroMQのプロジェクトの目標は低レイテンシと高スループットです。ただし、スケールアウトを自分で処理する必要があります...そして、複数のサーバーにわたる接続ポイントの追跡と再接続に戻ります。
これらのどちらも問題を解決しない場合は、アーキテクチャの変更を検討する必要があるかもしれません。 MMOの一般的な方法の1つは、関連するクライアントを同じサーバーに接続して、サーバー間の通信要件を減らすことです。リアルタイムデータを合法的に通信する必要があるクライアントは、バックプレーンの問題を心配する必要のない単一のサーバーにまとめられます。次に、このサーバーは、ワールド状態などを維持するために必要なものだけを「マスター」サーバーに通信します。
問題が発生する前に、問題を減らすようにアーキテクチャを計画してください...ただし、不要な作業に何週間も費やさないでください。 SignalRでいくつかのテストを行い、深淵に飛び込む前に、バックプレーンが実際にレイテンシーにどのような影響を与えるかを確認します。