2016-03-22 36 views
14

Possiedo un'applicazione ASP.NET MVC in esecuzione sul server A e alcuni servizi Web eseguiti sul server B. Ho implementato notifiche in tempo reale per le quali ho utilizzato SignalR sul server A. Ma ora I è necessario che il server B sia in grado di inviare messaggi a una vista servita dal server A (l'applicazione Web principale). Quindi, sto provando il tutorial here per coinvolgere il backplane di Redis.Uso di Redis con SignalR

A mio avvio nel server A, ho aggiunto il seguente:

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

Qui, suppongo che "myApp" indica il canale e quando corro publish abc "hello world" sulla console Redis, posso vedere l'abbonato count restituito come 1, ma non sono in grado di capire come un hub SignalR interagisce con il canale. Dove ricevo il messaggio sul server/vista? Possiamo abbonarci a un solo canale redis? Non possiamo configurare dinamicamente per iscriversi ad un particolare canale?

MODIFICA: Riesco a vedere i messaggi inviati dalla chat Applicazione implementata utilizzando SignalR su console redis se mi abbono a abc.

Anche per ora ho implementato il mio listener redis sul server A che, ricevendo un messaggio dal canale redis, chiama la funzione hub signalR. Sono sicuro che ci deve essere un modo diverso per farlo e spero che il backplane redis possa aiutarmi, ma non sono sicuro di come funzioni.

+0

Una soluzione semplice. Pubblicare un messaggio sul canale desiderato sul server B. Sottoscrivere il canale sul server A e inviare manualmente il messaggio all'hub signalR. –

+0

Questo può sembrare stupido ma mi aiuterebbe a capire con chiarezza. Questo significa che ogni messaggio da visualizzare può essere inviato solo attraverso il server A e mai attraverso il server B direttamente? Qual è l'uso di signalR.redis qui allora? – labyrinth

+0

Per favore controlla questo: - http://gigi.nullneuron.net/gigilabs/backplane-signalr-scaleout-with-redis/ Anche qui di seguito: - http://www.asp.net/signalr/overview/performance/scaleout -with-redis –

risposta

27

Il backplane distribuisce i messaggi tra i server.

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

Qui, abc è il canale Redis, che significa a seconda di quale server è connesso alla Redis server con questo canale, condivideranno i messaggi. Il canale SignalR (gruppo) è diverso dal canale Redis. È possibile condividere anche i messaggi del canale SignalR (gruppo).

Quindi installare il telefono Microsoft.AspNet.SignalR.Redis NuGet sui server.

Collegare i server per Redis in questo modo:

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

Quindi, utilizzare il vostro signalr come prima. Non devi fare nient'altro.

Quando il server A invia un messaggio ai client, invierà il messaggio prima a Redis. Quindi Redis condividerà il messaggio con tutti gli abbonati (server A e B). Quindi, A e B invieranno il messaggio ai loro clienti. (Anche viceversa è vero, sarà lo stesso per se B manda un messaggio).

Diciamo che A invia un messaggio ai clienti. _context.Clients.All.TestMessage("Hello");

Questo andrà prima a Redis Redis e condividerà questo con A e B.

Poi sia A un B sarà inviare questo messaggio ai loro clienti.

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

Ma non dovete preoccuparvi di questo genere di cose. Ho detto prima. Installa il pacchetto, conntect i tuoi server per redis e usa signalr come prima.

Se veniamo alla tua domanda. La risposta è si. Il server B può inviare messaggi ai client del server A dal backplane Signalr.

Questa immagine riassume quello che ho detto:

enter image description here

+0

Grazie per una spiegazione dettagliata! Posso quindi dire che non possiamo sottoscrivere/disiscriversi dinamicamente ai canali redis e utilizzare invece il canale globale nei server A e B e utilizzare tutti i messaggi su questi canali? – labyrinth

+0

Prima di tutto Canale Redis e Canale Signalr sono cose diverse. In secondo luogo, non è possibile modificare dinamicamente il canale redis (perché si desidera modificare?) Dopo aver mappato signalr. Canali signalr (gruppi) che puoi usare dinamicamente. Se il server B invia un messaggio a un gruppo (canale), il server A i client che sono collegati a questo gruppo (canale) riceveranno questo messaggio. –

+1

Puoi chiedere se hai domande e accettarle come risposta, se ha risposto alle tue domande –