web-dev-qa-db-ja.com

SignalRでのRedisの使用

サーバーAで実行されるASP.NET MVCアプリケーションと、サーバーBで実行されるいくつかのWebサービスがあります。サーバーAでSignalRを使用したリアルタイム通知を実装しました。サーバーA(メインWebアプリケーション)から提供されるビューにメッセージを送信します。したがって、Redisバックプレーンを使用するために、チュートリアル here を試しています。

サーバーAでの起動時に、以下を追加しました。

GlobalHost.DependencyResolver.UseRedis("localhost", 6379, string.Empty, "abc");
app.MapHubs();

ここでは、「myApp」がチャネルを示していると想定しています。Redisコンソールでpublish abc "hello world"を実行すると、サブスクライバー数が1として返されますが、SignalRハブがチャネル。サーバー/ビューのどこでメッセージを受け取りますか? 1つのredisチャネルのみをサブスクライブできますか?特定のチャンネルにサブスクライブするように動的に構成できないのですか?

編集:abcに登録すると、RedisコンソールでSignalRを使用して実装されたチャットアプリケーションから送信されたメッセージを確認できます。

また、今のところ、サーバーAに独自のredisリスナーを実装しています。redisチャネルからメッセージを受信するときに、signalRハブ関数を呼び出します。これを行うには別の方法があるはずだと確信しています。redisバックプレーンが役立つことを願っていますが、それがどのように機能するかは不明です。

18
labyrinth

バックプレーンはサーバー間でメッセージを配信します。

GlobalHost.DependencyResolver.UseRedis("localhost", 6379, string.Empty, "abc");

ここで、abcはredisチャネルです。つまり、このチャネルでredisサーバーに接続されているサーバーがメッセージを共有します。 SignalRチャネル(グループ)はRedisチャネルとは異なります。 SignalRチャネル(グループ)メッセージも共有できます。

次に、 Microsoft.AspNet.SignalR.Redis NuGetをサーバーにインストールします。

次のようにサーバーをRedisに接続します。

_ GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");
 app.MapSignalR();
_

次に、以前のように信号を使用します。他に何もする必要はありません。

サーバーAがクライアントにメッセージを送信するとき、サーバーAは最初にメッセージをRedisに送信します。次に、Redisはすべてのサブスクライバー(サーバーAおよびB)とメッセージを共有します。次に、AとBはクライアントにメッセージを送信します。 (逆も真ですが、Bがメッセージを送信した場合も同様です)。

Aがクライアントにメッセージを送信するとします。 _context.Clients.All.TestMessage("Hello");

これは最初にredisに移動し、redisはこれをAおよびBと共有します。

次に、AとBの両方がこのメッセージをクライアントに送信します。

_context.Clients.All.TestMessage("Hello");

しかし、このようなことを心配する必要はありません。前に言った。パッケージをインストールし、サーバーを再接続して以前のようにシグナルを使用するように接続します。

あなたの質問に来たら。答えはイエスです。サーバーBは、シグナルバックプレーンによってサーバーAのクライアントにメッセージを送信できます。

この画像は私が言ったことを要約しています:

enter image description here

41
Erkan Demirel