sql >> Databasteknik >  >> NoSQL >> Redis

Hur fungerar SignalR.Redis under huven?

Nej det finns inget whitepaper och det är som 200 rader kod så inte så mycket att svälja.

I SignalR går varje meddelande genom en sak som kallas en meddelandebuss. När du vill skala ut över noder (eller processer eller appdomäner) måste implementeringen av denna buss kunna prata med varje instans av din applikation. För att göra detta kan du använda RedisMessageBus. Redis har en pub-sub-mekanism samt dess förmåga att lagra nyckelvärdespar och vi använder bara den förra för SignalR.

OffTopic:Det här är MYCKET viktigt! SignalR är INTE tillförlitlig meddelandehantering, det är en anslutningsabstraktion. Vi kan buffra meddelanden för longpolling men du **kan inte* lita på att meddelandena finns där för alltid. Om du har viktiga meddelanden som du måste bevara, bevara dem sedan.

Varje webbserver ansluter till en (eller flera i den nya implementeringen) redis-händelser för att skicka meddelanden mellan dem. När ett meddelande kommer in för en eller flera klienter skickas det till bakplanet (redis) och det kommer till alla webbservrar. Varje webbserver får meddelandet från redis och lagrar det i en lokal cache. Denna lokala cache är där SignalR-klienter (webbläsare etc) serveras.

En viktig del av utskalningsdesignen är markörer. En markör representerar var en viss klient befinner sig i en oändlig ström av meddelanden. När klienter återansluter efter att ha avbrutit en anslutning eller en longpolling-anslutning kommer tillbaka efter att ha fått ett meddelande ber den bussen att hämta mig allt eftersom något markörvärde. Markörer definieras av meddelandebussimplementeringen och vi har normaliserat detta i de senaste källorna (ännu inte släppt i skrivande stund men jag kommer inte gå in på detaljer här). Markören i den nuvarande implementeringen av redis är bara en siffra som har ökats, inget för komplicerat.

Förhoppningsvis ger det en uppfattning om hur det fungerar.




  1. Guide till Upsert i MongoDB

  2. hur läser man alla bytes som kommer på en tcp-anslutning?

  3. Vad är det korrekta sättet att starta en mongod-tjänst på linux / OS X?

  4. MapReduce med MongoDB riktigt, riktigt långsam (30 timmar mot 20 minuter i MySQL för en motsvarande databas)