Coda messaggi e servizi Web? [chiuso]


258

In quali condizioni si preferirebbero le app che parlano tramite una coda di messaggi anziché tramite servizi Web (intendo solo XML o JSON o YAML o qualsiasi altra cosa su HTTP qui, non un tipo particolare)?

Devo parlare tra due app su una rete locale. Una sarà un'app Web e dovrà richiedere comandi su un'altra app (in esecuzione su hardware diverso). Le richieste sono cose come la creazione di utenti, lo spostamento di file e la creazione di directory. In quali condizioni preferirei i servizi Web XML (o TCP o altro) piuttosto che utilizzare una coda di messaggi?

L'app Web è Ruby on Rails, ma penso che la domanda sia più ampia di così.

Risposte:


315

Quando usi un servizio web hai un client e un server:

  1. Se il server non funziona, il client deve assumersi la responsabilità di gestire l'errore.
  2. Quando il server funziona di nuovo, il client è responsabile del rinvio.
  3. Se il server risponde alla chiamata e il client fallisce, l'operazione viene persa.
  4. Non hai contese, vale a dire: se milioni di client chiamano un servizio web su un server in un secondo, molto probabilmente il tuo server si spegnerà.
  5. Puoi aspettarti una risposta immediata dal server, ma puoi anche gestire le chiamate asincrone.

Quando si utilizza una coda di messaggi come RabbitMQ, Beanstalkd, ActiveMQ, IBM MQ Series, Tuxedo, ci si aspettano risultati diversi e più tolleranti agli errori:

  1. Se il server non riesce, la coda persiste il messaggio (facoltativamente, anche se l'arresto della macchina).
  2. Quando il server funziona di nuovo, riceve il messaggio in sospeso.
  3. Se il server fornisce una risposta alla chiamata e il client ha esito negativo, se il client non ha riconosciuto la risposta, il messaggio persiste.
  4. Hai delle controversie, puoi decidere quante richieste vengono gestite dal server (chiamalo invece worker).
  5. Non ti aspetti una risposta sincrona immediata, ma puoi implementare / simulare chiamate sincrone.

Code dei messaggi ha molte più funzioni, ma questa è una regola empirica per decidere se si desidera gestire autonomamente le condizioni di errore o lasciarle nella coda dei messaggi.


1
Se si utilizza l'associazione SOAP / JMS , si ottiene anche un accoppiamento libero nei servizi Web.
koppor,

Per più micro servizi sul lato server quale dovrebbe essere il servizio Web preferito o Accodamento?
Shivendra Pratap singh

Caro @sw. , posso sapere se ciò significa che possiamo mettere MQ davanti ai normali siti Web? Diciamo che ho un sito Web Wordpress (stack LAMP). Posso usare MQ di fronte ad Apache in modo che le richieste arrivino 1 dopo 1, anziché tutte contemporaneamente. In questo caso, i client (browser) sono collegati a MQ anziché ad Apache, vero? Ma poi, i browser mantengono aperta la connessione HTTP e aspettano che Apache risponda? Per favore, aiutami a capire un po 'su questo. Apprezzo la tua gentilezza.
夏 期 劇場

@ 夏 期 劇場 qual è il tuo caso d'uso? Cosa stai cercando di ottenere a beneficio dell'utente finale utilizzando il browser?
sw.

Questi problemi con le configurazioni client / server non sono ancora problemi tra la coda e il server e tra il client e la coda? Sembra che il paradigma client / server esista ancora e ora in due punti.
imagerhat

75

Ci sono state molte ricerche recenti nel considerare come le chiamate HTTP REST potrebbero sostituire il concetto di coda dei messaggi.

Se si introduce il concetto di processo e attività come risorsa, la necessità di un livello di messaggistica centrale inizia a evaporare.

Ex:

POST /task/name
    - Returns a 202 accepted status immediately
    - Returns a resource url for the created task: /task/name/X
    - Returns a resource url for the started process: /process/Y

GET /process/Y
    - Returns status of ongoing process

Un'attività può avere più passaggi per l'inizializzazione e un processo può restituire lo stato quando sottoposto a polling o POST a un URL di richiamata al termine.

Questo è molto semplice e diventa abbastanza potente quando ti rendi conto che ora puoi iscriverti a un feed rss / atom di tutti i processi e le attività in esecuzione senza alcun livello intermedio. Qualsiasi sistema di accodamento richiederà comunque una sorta di front-end Web e questo concetto è integrato senza un altro livello di codice personalizzato.

Le tue risorse esistono fino a quando non le elimini, il che significa che puoi visualizzare le informazioni storiche molto tempo dopo il completamento del processo e dell'attività.

Hai individuato il servizio di rilevamento, anche per un'attività che prevede più passaggi, senza protocolli extra complicati.

GET /task/name
    - returns form with required fields

POST (URL provided form's "action" attribute)

La scoperta del servizio è un modulo HTML, un formato universale e leggibile dall'uomo.

L'intero flusso può essere utilizzato a livello di codice o da un essere umano, utilizzando strumenti universalmente accettati. È un client guidato e quindi RESTful. Ogni strumento creato per il Web può guidare i tuoi processi aziendali. Hai ancora canali di messaggi alternativi POSTANDO in modo asincrono su un array separato di log server.

Dopo averlo considerato per un po ', ti siedi e inizi a capire che REST potrebbe semplicemente eliminare la necessità di una coda di messaggistica e di un ESB.

http://www.infoq.com/presentations/BPM-with-REST


11
@tempire che dire della tolleranza agli errori e così via? REST è carino, ma lo sviluppatore finisce per creare se stesso il middleware
Dan Rosenstark,

10
@Yar La maggior parte delle domande su "che dire di questo" può essere ribadita, "come viene gestita sul web?". La tolleranza ai guasti potrebbe essere gestita tramite bilanciamento del carico o persino manipolazione dei record DNS. Ci sono ancora un paio di problemi da risolvere, come la scalabilità orizzontale: il Web non lo gestisce intrinsecamente bene (attacchi ddos, ad esempio).
tempire

8
@tempire, non esiste una consegna garantita sul Web, giusto? Premo invio e prego affinché il messaggio arrivi a destinazione. Con un MQ, so che se arrivo al MQ ho finito. Gestirà l'invio del messaggio alla destinazione.
Dan Rosenstark,

10
Tuttavia, considera cosa significa "consegna garantita". È "garantito" solo come il tempo di attività della coda dei messaggi. Sostituisci la coda dei messaggi con uno o più server REST che trattano attività e processi come risorse e hai la stessa "garanzia" di qualsiasi altra cosa. In sostanza, hai ancora una coda di messaggi, ma in un formato accessibile standard web, che può essere monitorato utilizzando qualsiasi strumento web.
tempiro

16
@Yar - Non credo che molte persone capiscano la definizione del problema che MQ sta cercando di risolvere abbastanza da considerare anche queste cose. Capiscono l'MQ, ma è diverso dalla comprensione dello spazio del problema. È un problema diffuso, tuttavia, perché penso che la maggior parte dei programmatori e manager nel mondo siano stati addestrati a collegare pezzi anziché soluzioni ingegneristiche.
tempire

32

Le code dei messaggi sono ideali per le richieste che potrebbero richiedere molto tempo per l'elaborazione. Le richieste sono in coda e possono essere elaborate offline senza bloccare il client. Se il client deve essere informato del completamento, è possibile fornire un modo per controllare periodicamente lo stato della richiesta.

Le code dei messaggi consentono anche di ridimensionare meglio nel tempo. Migliora la tua capacità di gestire esplosioni di attività pesanti, poiché l'elaborazione effettiva può essere distribuita nel tempo.

Si noti che le code dei messaggi e i servizi Web sono concetti ortogonali, ovvero non si escludono a vicenda. Ad esempio, è possibile disporre di un servizio Web basato su XML che funge da interfaccia per una coda di messaggi. Penso che la distinzione che stai cercando sia Coda messaggi rispetto a Richiesta / Risposta, quest'ultima è quando la richiesta viene elaborata in modo sincrono.


3
Sì, stavo solo pensando a questo: non è se stanno bloccando o non bloccando. Indipendentemente dal fatto che richiedano tempi più lunghi e / o imprevedibili per l'elaborazione ... Considerando che sono ortogonali, è anche vero che i servizi Web possono essere utilizzati per lunghe richieste (dropoff e pickup separati, ovviamente). Tuttavia, se hai il lusso di una coda di messaggi, potrebbe essere una buona idea.
Dan Rosenstark,

La mia nuova domanda è: cosa succederebbe se il processo fosse sincrono, ma asincrono al timeout? Quindi forse i servizi web sarebbero più adatti.
Dan Rosenstark,

27

Le code dei messaggi sono asincrone e possono riprovare più volte se la consegna fallisce. Utilizzare una coda di messaggi se il richiedente non deve attendere una risposta.

La frase "servizi web" mi fa pensare alle chiamate sincrone a un componente distribuito su HTTP. Utilizzare i servizi Web se il richiedente necessita di una risposta.


1
Grazie per quello, sì "consegna garantita", dovrò pensare se è importante. Voglio dire, sync vs. async è una specie di gusto, in un certo senso. Mentre ci sono casi chiaramente in bianco e nero, c'è anche un enorme centro grigio.
Dan Rosenstark,

22

Penso in generale che vorresti un servizio Web per un'attività di blocco (queste attività devono essere completate prima di eseguire più codice) e una coda di messaggi per un'attività non bloccante (potrebbe richiedere un po 'di tempo, ma non non c'è bisogno di aspettare).


I servizi Web offrono anche metodi a senso unico ( @Oneway ). Per ricevere la risposta, il cliente deve offrire un servizio web.
koppor,
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.