web-dev-qa-db-fra.com

Utilisation de Redis avec SignalR

J'ai une application ASP.NET MVC qui s'exécute sur le serveur A et certains services Web qui s'exécutent sur le serveur B. J'ai implémenté des notifications en temps réel pour lesquelles j'ai utilisé SignalR sur le serveur A. Mais maintenant, j'ai besoin du serveur B pour pouvoir également pour envoyer des messages à une vue servie depuis le serveur A (l'application Web principale). Par conséquent, j'essaie le tutoriel ici pour impliquer le fond de panier Redis.

Dans mon démarrage sur le serveur A, j'ai ajouté ce qui suit:

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

Ici, je suppose que "myApp" indique le canal et lorsque j'exécute publish abc "hello world" sur la console Redis, je peux voir le nombre d'abonnés renvoyé comme 1, mais je ne suis pas en mesure de comprendre comment un concentrateur SignalR interagit avec le canal. Où puis-je recevoir le message sur le serveur/la vue? Pouvons-nous nous abonner à une seule chaîne redis? Ne pouvons-nous pas configurer dynamiquement pour vous abonner à une chaîne particulière?

EDIT: Je peux voir les messages envoyés à partir de l'application de chat implémentée à l'aide de SignalR sur la console redis si je m'abonne à abc.

Pour l'instant, j'ai également implémenté mon propre écouteur redis sur le serveur A qui, en recevant un message du canal redis, appelle la fonction concentrateur signalR. Je suis sûr qu'il doit y avoir une autre façon de procéder et j'espère que le fond de panier redis peut m'aider, mais je ne sais pas comment cela fonctionne.

18
labyrinth

Le fond de panier distribue des messages entre les serveurs.

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

Ici, abc est le canal redis, ce qui signifie que quel que soit le serveur connecté au serveur redis avec ce canal, ils partageront des messages. Le canal (groupe) SignalR est différent du canal Redis. Vous pouvez également partager des messages de canal (groupe) SignalR.

Ensuite, installez simplement Microsoft.AspNet.SignalR.Redis NuGet sur vos serveurs.

Connectez vos serveurs à Redis comme ceci:

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

Ensuite, utilisez votre signal comme précédemment. Vous n'avez rien d'autre à faire.

Lorsque le serveur A envoie un message aux clients, il envoie d'abord le message à Redis. Ensuite, Redis partagera le message avec tous les abonnés (serveurs A et B). Ensuite, A et B enverront le message à leurs clients. (Aussi vice versa est vrai, il en sera de même si B envoie un message).

Disons que A envoie un message aux clients. _context.Clients.All.TestMessage("Hello");

Cela ira d'abord à redis et redis partagera cela avec A et B.

Ensuite, les deux A et B enverront ce message à leurs clients.

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

Mais vous n'avez pas à vous soucier de ce genre de choses. Je l'ai dit avant. Installez le package, connectez vos serveurs à redis et utilisez signalr comme précédemment.

Si nous venons dans votre question. La réponse est oui. Le serveur B peut envoyer des messages aux clients du serveur A via le fond de panier Signalr.

Cette image résume ce que j'ai dit:

enter image description here

41
Erkan Demirel