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.
Grazie mille. Ottima spiegazione. – user1574808
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
Il backplane è a conoscenza di tutti i server, quindi tutto funzionerà. Non ha bisogno di sapere a quale server è originariamente connesso. – davidfowl