3

WebRole.csの一部としてWebSocketサーバーを実装しましたが、これまでのところ、ユーザーはWebサイトのURLと指定されたエンドポイントを使用してサーバーに接続できます。ここで、WebSocketサーバーに接続したい50,000人のユーザーがいるとしましょう。負荷を処理するには、そのWebロールのインスタンスをさらに必要とします。

私の質問は、複数のWebロールインスタンスがある場合、これは複数のWebソケットサーバーにもなりますか?つまり、ユーザーは引き続き単一のURL / IPを使用して接続し、すべてが相互に接続されますか(たとえば、メッセージをブロードキャストする場合)、またはユーザーは異なるWebSocketサーバー(インスタンスごとに1つ)に接続するために異なるIPを入力する必要がありますか?同じサーバー/インスタンス上のユーザーに接続しますか?

編集:特定の問題

したがって、接続時にユーザーが追加される場合:

private static List<UserContext> Users = new List<UserContext>();

WebRole.cs内。そして私は放送方法を持っています:

private static void Broadcast(String message)
        {
            foreach (UserContext uc in Users)
            {
                uc.Send(message);
                Console.WriteLine("Broadcasting to: " + Users.IndexOf(uc));
            }
        }

メッセージはWebサイトのすべてのユーザーにブロードキャストされますか、それとも各インスタンスに独自のユーザーリストがあり、特定のインスタンスに接続しているユーザーにのみブロードキャストされますか?

4

2 に答える 2

4

ロードバランサーがすべてのリクエストを処理するという事実についてSimonは正しいですが(接続する必要のあるインスタンスについて心配する必要はありません)、考慮しなければならないことが他にもあります。あなたの質問から、たとえばメッセージをブロードキャストしたいと思います。

アプリケーションを2つのインスタンスにスケーリングしたと仮定します。

  • インスタンス1
  • インスタンス2

ロードバランサーは、yourapp.cloudapp.netへのすべてのリクエストがこれらのインスタンスの1つ(ラウンドロビン)に送信されるように注意します。ここで、ユーザーA、B、およびCがインスタンス1にルーティングされ、ユーザーD、E、およびFがインスタンス2にルーティングされるとします。

  • インスタンス1:ユーザーA、ユーザーB、ユーザーC
  • インスタンス2:ユーザーD、ユーザーE、ユーザーF

したがって、ユーザーAがアプリケーションで何かを実行し、これをすべてのユーザーにブロードキャストするとします。インスタンス1には、接続されている他の2人のユーザー(ユーザーBとC)のみが表示され、それらのユーザーにメッセージが送信されます。ここでの問題は、ユーザーD、E、およびFが別のインスタンスにある場合でも、これらにもメッセージを送信する必要があることです。

そのため、WebSocket / broadcast / ...フレームワーク(SignalRなど)は、すべてのインスタンスからアクセスできるサービスバスのようなものを使用する必要があります。SignalRがWindowsAzureServiceBusまたはredisを使用してこの問題をどのように解決するかを見てください。

于 2013-02-27T11:38:50.110 に答える
3

接続しているWebサイトのURLは、実際にはロードバランサーのURLであり、特定のインスタンスではありません(ロードバランサーの仮想IPであるパブリックIPと同じです)。さらにインスタンスを追加すると、ロードバランサーはトラフィックを基盤となるインスタンスに転送します(ラウンドロビンを介して)。パブリックURLとIPアドレス以外のことを心配する必要はありません(ロードバランサーが使用されていない仮想ネットワークは例外です)。

AlchemyUserContextにはEndpointClientAddressがあります。単一のサーバーには、他のサーバーではなく、それに接続しているユーザーの送信元アドレスのみが含まれます。両方のサーバーからブロードキャストする必要があります。したがって、すべてのサーバーでbroadcast()を実行すると、すべてのユーザーをキャッチできます。重複する場合は注意してください。NLBはスティッキーセッションを実行しないため、単一のユーザーが複数のサーバーに存在する可能性があります。クライアントコードが複数のサーバーからの同じメッセージを処理できることを確認してください

于 2013-02-27T09:11:56.950 に答える