Devo passare da WCF a NserviceBus


13

Abbiamo un server centrale che invia e riceve messaggi da un certo numero di PC che si trovano su reti client in varie posizioni. Per facilitare questo, attualmente sto usando WCF con TCPNetBindings, usando la comunicazione duplex protetta con certificati.

Ora, abbiamo una serie di problemi con questo - principalmente che ci viene chiesto di supportare la "modalità disconnessa" (dobbiamo essere tolleranti ai guasti). Da quello che so, non esiste un modo semplice per farlo usando lo stack WCF: avremmo bisogno di implementare qualcosa e forse usare msmq. Ultimamente ho esaminato NServiceBus, e da quanto posso vedere sembra adattarsi bene al conto: tolleranza agli errori, i messaggi possono essere inviati su Internet tramite un semplice gateway http, ecc. So che è molto rispettato nella comunità e Posso capire perché dall'esaminarlo.

Quindi, la mia domanda è ... L'uso di NServiceBus sembra un'idea sensata o qualcuno ha altri suggerimenti / esperienze del mondo reale che si riferiscono a questo? Immagino di essere preoccupato di introdurre una nuova tecnologia di cui conosco relativamente poco, e di affrontare problemi con cose come proteggerla, impostare tutto in modo affidabile, trucchi lungo il cammino .. Sono anche diffidente nei confronti di "oro- placcare "l'architettura e scegliere qualcosa di brillante che finirà per impantanarmi nell'implementazione rispetto a restare con WCF e farlo funzionare per me ..

Grazie!


1
> supporta la "modalità disconnessa" (dobbiamo essere tolleranti ai guasti) Non dovrai ancora costruire tu stesso molta della tolleranza ai guasti sul lato client? La tolleranza agli errori di MSMQ sul server è ottima per ripristinare lo stato in caso di problemi, ma vedo ancora che essere un grande mal di testa sul client, qualunque cosa tu scelga.
Brian

1
Bene, quello che devo supportare è la "garanzia" che il client invierà un messaggio al server e che il server lo riceverà alla fine - quindi se siamo offline dobbiamo continuare a provare fino a quando non ci arriviamo. Questo è ciò che NSB fa "gratuitamente", mentre come soluzione WCF (credo) richiederebbe il codice ...
Matt Roberts,

Sono parzialmente d'accordo con Brian. MSMQ, se configurato correttamente nelle versioni recenti, offre una modalità di disconnessione abbastanza buona pronta all'uso, purché si configuri la coda e il messaggio per comportarsi in questo modo. Il client può conservare i messaggi nella coda in uscita locale e reinviare quando il server è nuovamente disponibile su una coda remota.
Bill,

WCF ha attacchi MSMQ ... Sono intimamente informato di diverse applicazioni di successo su larga scala che ne fanno uso. Detto questo, mi piace anche nServiceBus, ma fa una cosa diversa.
Kyle Hodgson,

Risposte:


12

Il mio suggerimento, se devi essere veloce su questo e hai solo bisogno di qualcosa di semplice per facilitare un funzionamento duraturo (disconnesso) con WCF, è quello di esaminare i binding WCF - MSMQ. Se hai bisogno di qualcosa in un ambiente più grande, guarda nServiceBus.

Nella mia mente, nServiceBus avrebbe davvero iniziato a brillare in un ambiente distribuito più ampio. Prendi, ad esempio, il seguente esempio (sarebbe un inferno sulla terra con WCF ma semplice con nServiceBus):

  • Infrastruttura composta da livello server app, livello server cache, livello database di sola lettura, livello database di lettura / scrittura
  • Ogni volta che il cliente invia una nuova voce, ti piacerebbe davvero aggiornare tutti questi livelli contemporaneamente
  • In WCF, dovresti esporre servizi separati a ogni livello e far spingere il cliente a tutti (o fare in modo che l'orchestrazione centrale faccia la stessa cosa per te)
  • In nServiceBus ogni livello dovrebbe essere abbonato a queste informazioni e il cliente le pubblicherebbe una volta, consentendo al bus di servizio di occuparsi del resto

WCF ha attacchi MSMQ

Se è necessario attenersi principalmente a WCF, tuttavia (linee temporali brevi, sono necessarie altre funzionalità WCF), suggerirei di leggere questo articolo su MSDN. Ti mostra come usare i bind WCF per MSMQ e poi ti mostra come migrare un servizio da HTTP a MSMQ. Lungo la strada ti mostra alcuni dei problemi con questo scenario (e utili soluzioni a questi problemi).

Entrambi questi suggerimenti fanno un uso intenso di MSMQ, quindi una nota a riguardo: a differenza di Apache MQ, RabbitMQ e altri sistemi di accodamento popolari, MSMQ non è una tipica architettura di coda basata su broker, ma è piuttosto una coda distribuita. Ciò significa che se il client WCF invia un messaggio su un trasporto MSMQ mentre non è in grado di connettersi al server remoto che ospita la coda, il computer client accoderà il messaggio in quella che viene definita localmente "coda in uscita". Il messaggio rimarrà lì in modo sicuro fino a quando il servizio MSMQ del client non rileverà che può connettersi nuovamente al servizio MSMQ remoto. A quel punto il messaggio fluirà dal client alla destinazione finale.

C'è almeno un'avvertenza a quanto sopra: se il server remoto è offline per troppo tempo (controlla la tua documentazione per MSMQ) il client si arrenderà e sposterà il messaggio dalla coda in uscita alla lettera morta. I messaggi trasferiti nella coda di messaggi non instradabili non possono essere rinviati automaticamente, devono essere ricostruiti.

Se è richiesta la crittografia e non si dispone di ActiveDirectory, in questo post di blog , Sergey Sorokin descrive in dettaglio i passaggi necessari per crittografare la comunicazione di MSMQ utilizzando WCF senza Active Directory.


7

Non sono un sostituto 1 per 1: molte volte utilizzerai NServiceBus per inviare messaggi o ricevere messaggi da un endpoint WCF.

In ogni caso, la gestione di scenari in modalità disconnessa come questa è dove le code dei messaggi brillano davvero. NServiceBus è un buon punto di partenza. Ci sono molte altre opzioni là fuori. Noterò che molti di loro in realtà avvolgono MSMQ alla fine della giornata - MSMQ è un back-end molto solido e probabilmente vale la pena usarlo quando è reso accessibile.


Grazie. Punto preso, anche se sto vedendo come una sostituzione 1: 1 nel mio caso perché la maggior parte delle mie comunicazioni WCF è lì per supportare le comunicazioni tra questi pc e il server - nsb sembra prendersi cura di tutto questo per me, quindi è uno scambio -per me.
Matt Roberts,

Gotcha, allora dovrebbe funzionare abbastanza bene per te.
Wyatt Barnett,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.