1

現在、PubNub を使用して Web アプリの通信を行っています。JSを介してメッセージを受信する2つの異なるアプリ(つまり、聞くだけ)と、メッセージを送信する(サーバーからクライアントへ)少なくとも3つの異なるアプリ(2つのWebと1つのワーカー)があります。

したがって、PubNub の場合は非常に単純です。コード ビハインドからサーバーに残りの呼び出しを行い、JS クライアントがメッセージを受信します。これを SignalR で複製したいのですが、使用する設計/アーキテクチャを確認する必要があります。

SignalR サーバーを実行する .Net Web アプリを作成することを計画していました。ここでは、ハブを作成し、Global.asax (RouteTable.Routes.MapHubs(new HubConfiguration() { EnableCrossDomain = true })) でルートを構成します。これは sr.mydomain.com に展開されます。

JS クライアント (client1.mydomain.com および clientx.mydomain.com として展開) は、sr.mydomain.com 設定 $.connection.hub.url によって送信されたメッセージを簡単にリッスンできます。

これまでのところ、すべて問題なく、コード化され、テストされ、機能しています。

ポイントは、webapp.mydomain.com および MyWorkerRole から JS クライアントにメッセージを送信する方法です。webapp.mydomain.com および MyWorkerRole から使用できる sr.mydomain.com で webmethod を作成することを考えています。したがって、MyWorkerRole は sr.mydomain.com の webmethod を呼び出し、sr.mydomain.com はメッセージを client1.mydomain.com に送信します。それは理にかなっていますか?これを行うためのより良いより直接的な方法はありますか?

4

1 に答える 1

1

あなたのアプローチはシングルサーバーモードで機能します。sr.mydomain.com を複数のインスタンスにスケールアウトする必要がある場合、明らかな問題は、signaler クライアントが Web サービス呼び出しを受信するノードに接続されていない可能性があることです。

スケールアウトをサポートする必要がある場合は、SQL サーバー、Azure サービス バス、または Redis をバックプレーンとして使用できます。参照: http://www.asp.net/signalr/overview/signalr-20/performance-and-scaling/scaleout-in-signalr

50K フィートのビューは次のようになります。

  1. 通常どおり、SignalR ハブから派生したハブを作成します。
  2. イベント プロデューサー (Web ロール) とコンシューマー側 (ワーカー ロールなど) の両方で、バックプレーンを使用するようにシグナルを初期化します。もちろん、webapp では、これを呼び出しGlobal.asaxと一緒に貼り付けMapHubsます。

    GlobalHost.DependencyResolver.UseRedis(redisServer, redisPort, redisPassword, key);
    
  3. IHubContextプロデューサー側 (worker ロール) では、次のように取得できます。

    var hubContext =
            GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
    

    でメッセージを送信できるようになりましhubContext.Clientsた。拡張機能と同様に、UseRedis次のような他の拡張機能があります。UseServiceBus

于 2013-11-14T03:40:30.740 に答える