Kombinera SignalR med message bus delivery tillförlitlighet

Vi satt nyligen med kund och diskuterade hur vi skulle kunna utöka deras befintliga applikation med live data, vilket ju är straight forward enough. Tvisten i just det här fallet var att datat i fråga inte genererades i en konstant ström, utan i korta omgångar med en livslängd på 5-10 minuter. Kunden ville att data skulle plottas när data började strömma in, för att sedan tas bort när dataflödet upphörde.

Istället för att låta websidan ligga och polla servern efter uppdateringar,  kände vi att en lite mer modern implementation var på plats. Dessutom kunde vi inte låta sidan laddas om för att uppdatera grafiken, så en AJAX-liknande lösning var mer eller mindre ett måste.

Med SignalR kunde vi låta backenden publicera data till webfronten, utan att tvingas ladda om sidan. Dessutom kunde vi göra publiceringen när det verkligen fanns data att skicka. Eftersom vi precis varit delaktiga i ett stort DDD projekt så fanns den typen av arkitektur i bakhuvudet när vi började diskutera hur vi skulle gå till väga för att lösa problemet.

Datat som vi behvöde få tag på placeras på en MSMQ i form av “telegram” (kundens vokabulär)  med en kö för varje datainsamlare.  Vi behövde ett sätt att polla en MSMQ efter inkommande data. Dom “telegram” vi var intresserade av var inte NServiceBus typ av meddelanden så vi beslöt oss för att bygga två tjänster. En som kunde polla MSMQ:n efter telegram periodiskt och lägga meddelanden till NServiceBus, och en som hanterade dom eventen.

Dataflödet översätts från telegram till events

Dataflödet översätts från telegram till events

 

När vi kunde samla in och publicera datat på ett lite mer kontrollerat sätt, fattades bara en bit av pusslet, att kunna uppdatera webapplikationen i realtid utan att ladda om sidan. SignalR passade perfekt in här. Genom att låta en SignalR hub implementera en messagehandler för dom meddelanden vi behövde kunde vi lösa problemet relativt enkelt. Arkitekturen såg nu ut så här

Message handling som en del av SignalR

Message handling som en del av SignalR

När användaren loggar in i  webapplikationen så kopplar vi via SignalR sessionen till en grupp som är gemensam för alla användare i samma organisation. På sätt kan vi se till all information som rör en viss organisation når alla användare, och bara dom.

Varje meddelande som läggs på bussen innehåller, förutom de data som ska presenteras, även information om vilken kund det aktuella datat tillhör. I implementationen av message handlern är det sedan enkelt att via SignalR gruppen vidarebefodra det data som kommer in på bussen till rätt mottagare.

 

Om du är intresserad av  en teknisk referensimplementation så har jag ett exempel här.

 

Daniel Ripoll on twitterDaniel Ripoll on linkedin
Daniel Ripoll
Daniel är VD och grundare av Consulence AB och har nästan 20 års erfarenhet av att bygga och designa globala, högpresterande webapplikationer.