2016-05-26 29 views
7

sto sviluppando applicazioni distribuite con l'aiuto di MassTransit e rabbitmqArchitettura distribuita con MassTransit, RabbitMQ e SignalR

devo fornire capacità di generare il rapporto su una pagina web senza ricaricare la pagina facendo clic su un pulsante, anche io dovrebbe chiamare un servizio Windows per la preparazione dei dati (il servizio gestisce ogni richiesta per 30sek - 1min).

Il mio primo tentativo in base a questo campione: https://github.com/MassTransit/Sample-RequestResponse

[HttpPost] 
    public async Task<HttpStatusCodeResult> GenerateReport(string someJsonData) 
    {  
     var serviceAddress = new Uri(ConfigurationManager.AppSettings["BaseLineRecordService"]); 
     var client = this.Bus.CreateRequestClient<ICreateReportRequest, ICreateReportResponse>(serviceAddress, TimeSpan.FromHours(1)); 
     ICreateReportResponse response = await client.Request(new CreateReportRequest()); 
     reportHub.ShowRepordData(response); // Update data by SingleR 
     return new HttpStatusCodeResult(200); 
    } 

Ma a quanto mi risulta' non è un approccio migliore, perché sto mantenendo la connessione durante tutta la preparazione dei dati.

Ho letto molti articoli e ho trovato tre modi. Qual è il modo preferito?

1) Come questo articolo http://www.maldworth.com/2015/07/19/signalrchat-with-masstransit-v3/

enter image description here

2) Come prima, ma con Riposo API chiedendo invece di consumatori dal lato IIS

enter image description here

3) idea da questo articolo http://weblog.west-wind.com/posts/2013/Sep/04/SelfHosting-SignalR-in-a-Windows-Service

enter image description here

risposta

6

Lo faccio utilizzando gli hub da SignalR e osservo gli eventi sul server utilizzando regolarmente utenti MassTransit. Quando gli eventi vengono osservati, faccio scattare il gestore di eventi, che invia utilizzando l'hub ai client connessi. In questo modo, gli eventi sono inviati immediatamente al browser senza lasciare una chiamata asincrona in attesa sul server in un controller.

Si può vedere questo in Fooidity che fa qualcosa di simile:

https://github.com/phatboyg/Fooidity/blob/develop/src/Fooidity.Management.Web/Hubs/ApplicationHubEventHandler.cs#L18

Utilizzando la GlobalHost per risolvere il mozzo, poi alzando il metodo sul mozzo. Il contesto dell'evento può essere discriminato utilizzando i gruppi, che sono una funzione SignalR gestita per nodo. Quindi, finché ogni nodo sta osservando l'evento, i client possono essere connessi a qualsiasi hub e ricevere notifiche. Funziona bene per il bilanciamento del carico, senza dover utilizzare un backplane di cluster pesante per SignalR - dal momento che RabbitMQ è super leggero per la distribuzione degli eventi.

È possibile farlo anche con code non durevoli, il che lo rende ancora più veloce, poiché un ripristino del server/interruzione della connessione è più probabile di un arresto anomalo del broker.

autenticazione viene gestita all'interno della ApplicationHub, come mostrato nel file di origine adiacente: https://github.com/phatboyg/Fooidity/blob/develop/src/Fooidity.Management.Web/Hubs/ApplicationHub.cs

Check it out, si spera che aiuta.

+0

Ciao Chris, ho atteso la tua risposta, molte grazie! –