2012-10-24 11 views
20

Oltre a leggere il codice in github, c'è qualche tipo di documentazione cartacea su come funziona il pacchetto SignalR.Redis? Nello specifico mi chiedo quali chiavi aggiunga a Redis, strategia di aggiornamento/cancellazione, ecc. Quando guardo dentro Redis tutto ciò che vedo è l'unica chiave specificata nella seguente chiamata (es. "SignalR.Redis.Sample"):Come funziona SignalR.Redis sotto il cofano?

GlobalHost.DependencyResolver.UseRedis(server, Int32.Parse(port), password, "SignalR.Redis.Sample"); 

Questa chiave sembra essere un contatore in Redis. Suppongo che altre chiavi vengano create e rapidamente eliminate per facilitare i messaggi tra ogni server di app connesso a Redis.

risposta

48

No, non esiste un white paper ed è come 200 linee di codice, quindi non tanto da inghiottire.

In SignalR ogni messaggio passa attraverso una cosa chiamata bus di messaggi. Quando si desidera ridimensionare i nodi (o processi o domini delle app), l'implementazione di questo bus deve essere in grado di comunicare con ciascuna istanza dell'applicazione. Per fare ciò è possibile utilizzare RedisMessageBus. Redis ha un meccanismo pub sub così come la sua capacità di memorizzare coppie di valori chiave e usiamo solo il primo per SignalR.

OffTopic: Questo è MOLTO importante! SignalR non è un messaggio affidabile, è un'astrazione di connessione. Potremmo bufferizzare i messaggi per longpolling ma non puoi * fare affidamento sui messaggi che ci sono per sempre. Se hai messaggi importanti devi persistere, quindi persisterli.

Ogni server Web si collega a uno (o più nella nuova implementazione) eventi redis per inviare messaggi tra di loro. Quando arriva un messaggio per uno o più client, viene inviato al backplane (redis) e arriva su tutti i server web. Ogni server Web riceve il messaggio da redis e lo memorizza in una cache locale. Questa cache locale è dove vengono serviti i client SignalR (browser ecc.).

Una parte importante del design della scala è cursori. Un cursore rappresenta dove un particolare client si trova in un flusso infinito di messaggi. Quando i client si riconnettono dopo aver rilasciato una connessione o una connessione longpolling ritorna dopo aver ricevuto un messaggio, chiede al bus di recuperare tutto dal valore del cursore. I cursori sono definiti dall'implementazione del bus dei messaggi e lo abbiamo normalizzato nelle fonti più recenti (non ancora rilasciato al momento della scrittura, ma non entrerò nei dettagli qui). Il cursore dell'attuale implementazione di redis è solo un numero incrementato, niente di troppo complicato.

Speriamo che questo dia un'idea di come funziona.

+2

Grazie mille. Ottima spiegazione. – user1574808

+1

Grazie per l'ottima spiegazione. Considerare il seguente scenario: Ho una ** web-farm con bilanciamento del carico in cui ogni server ospita un hub. Supponiamo che tutti i client stiano tornando al polling lungo. _Client X_ si connette tramite il bilanciatore del carico e la sua richiesta viene inviata a _server 1_. Al prossimo sondaggio tuttavia, il load-balancer indirizza la sua richiesta a _server 2_. La mia domanda è: il backplane garantisce che tutti gli hub siano a conoscenza di tutti i client connessi, indipendentemente dall'hub a cui erano originariamente connessi? – demius

+1

Il backplane è a conoscenza di tutti i server, quindi tutto funzionerà. Non ha bisogno di sapere a quale server è originariamente connesso. – davidfowl

Problemi correlati