2016-03-22 23 views
14

Ich habe eine ASP.NET MVC-Anwendung, die auf Server A und einige Webdienste auf Server B ausgeführt wird. Ich habe Echtzeitbenachrichtigungen implementiert, für die ich SignalR auf Server A verwendet habe. Aber jetzt ich Server B muss auch in der Lage sein, Nachrichten an ein View zu senden, das von Server A (der Haupt-Webanwendung) bereitgestellt wird. Daher versuche ich das Tutorial here Redis Backplane zu beteiligen.Verwenden von Redis mit SignalR

In meinem Start in Server A, habe ich folgendes hinzugefügt:

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

Hier gehe ich davon aus, dass „myApp“ bezeichnet den Kanal, und wenn ich publish abc "hello world" auf der Redis Konsole laufen, kann ich den Teilnehmer sehen count kam als 1 zurück, aber ich bin nicht in der Lage herauszufinden, wie ein SignalR-Hub mit dem Kanal interagiert. Woher bekomme ich die Nachricht auf dem Server/View? Können wir nur einen Redis-Kanal abonnieren? Können wir nicht dynamisch konfigurieren, um einen bestimmten Kanal zu abonnieren?

BEARBEITEN: Ich kann Nachrichten sehen, die von Chat gesendet werden Anwendung, die mit SignalR auf Redis-Konsole implementiert wird, wenn ich abc abonniere.

Auch für jetzt habe ich meinen eigenen Redis-Listener auf Server A implementiert, der beim Empfang einer Nachricht vom Redis-Kanal die signalR-Hub-Funktion aufruft. Ich bin sicher, dass es einen anderen Weg geben muss, um dies zu tun, und ich hoffe, dass Backplane mir helfen kann, aber nicht sicher ist, wie es funktioniert.

+0

Eine einfache Lösung. Veröffentlichen Sie eine Nachricht auf dem gewünschten Kanal auf Server B. Abonnieren Sie den Kanal auf Server A und drücken Sie die Nachricht manuell auf signalR Hub. –

+0

Das klingt vielleicht dumm, aber es würde mir helfen, mit Klarheit zu verstehen. Bedeutet dies, dass jede zu sehende Nachricht nur über Server A und niemals direkt über Server B gesendet werden kann? Was nützt da SignalR.red dann? – labyrinth

+0

Bitte überprüfen Sie dies: - http://gigi.nullneuron.net/gigilabs/backplane-signalr-scaleout-with-redis/ Auch unten: http://www.asp.net/signalr/overview/performance/scaleout -mit-redisist –

Antwort

27

Die Rückwandplatine verteilt Nachrichten zwischen Servern. Hier

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

, abc ist der redis Kanal, das heißt, je nachdem, welcher Server verbunden ist Server mit diesem Kanal ReDiS, werden sie Nachrichten teilen. SignalR-Kanal (Gruppe) ist anders als Redis-Kanal. Sie können auch SignalR-Kanal (gruppen) -Nachrichten teilen.

Dann installieren Sie einfach die Microsoft.AspNet.SignalR.Redis NuGet auf Ihren Servern.

Ihre Server in Verbindung, wie dies Redis:

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

Verwenden Sie dann Ihre signalr wie zuvor. Sie müssen nichts anderes tun.

Wenn Server A eine Nachricht an die Clients sendet, wird die Nachricht zuerst an Redis gesendet. Dann teilt Redis die Nachricht mit allen Teilnehmern (Server A und B). Dann senden A und B die Nachricht an ihre Kunden. (Auch umgekehrt ist es wahr, es wird gleich sein, wenn B eine Nachricht sendet).

Sagen wir, A sendet eine Nachricht an die Clients. _context.Clients.All.TestMessage("Hello");

Dies wird zuerst zum Redis und redis wird dies mit A und B teilen

Dann werden beide A ein B diese Nachricht an ihre Kunden schicken.

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

Aber Sie müssen nicht über diese Art von Dingen kümmern. Ich sagte Davor. Installieren Sie das Paket, verbinden Sie Ihre Server, um sie erneut zu verwenden, und verwenden Sie den Signalgeber wie zuvor.

Wenn wir in Ihrer Frage kommen. Die Antwort ist ja. Server B kann Nachrichten an Server-A-Clients über Signalr Backplane senden.

Dieses Bild fasst zusammen, was ich gesagt:

enter image description here

+0

Danke für eine ausführliche Erklärung! Kann ich hier sagen, dass wir Redis-Kanäle nicht dynamisch abonnieren/abbestellen können und stattdessen den globalen Kanal in Server A und B verwenden und alle Nachrichten auf diesen Kanälen verwenden? – labyrinth

+0

Zuerst Redis Channel und Signalr Channel sind verschiedene Sache. Zweitens können Sie den Redis-Kanal nach dem Mapping-Signal nicht dynamisch ändern (warum möchten Sie ändern?). Signalkanäle (Gruppen) können Sie dynamisch verwenden. Wenn Server B Nachricht eine Gruppe (Kanal) sendet, erhalten Server A-Clients, die diese Gruppe (Kanal) verbunden ist, diese Nachricht. –

+1

Sie können fragen, ob Sie eine Frage haben und diese als Antwort akzeptieren, wenn sie Ihre Fragen beantwortet hat –

Verwandte Themen