2010-07-19 10 views
5

Il nostro team è in uno sprint di picco per scegliere tra ActiveMQ o RabbitMQ. Abbiamo creato 2 picchi di produttori/consumatori che inviano un messaggio oggetto con una serie di 16 stringhe, un timestamp e 2 numeri interi. I picchi sono ok sulle macchine dei nostri sviluppatori (i messaggi sono ben consumati).I messaggi del messaggio RabbitMQ smettono di consumare messaggi

Poi sono arrivate le panchine. Per prima cosa abbiamo notato che, sulle nostre macchine, quando inviavamo molti messaggi, il consumatore a volte pendeva. Era lì, ma i messaggi si stavano accumulando in coda.

Quando siamo andati sul plateform panca:

  • gruppo di 2 macchine RabbitMQ 4 core/3.2Ghz, 4GB di RAM, carico bilanciato da un VIP
  • uno a 6 consumatori in esecuzione su macchine RabbitMQ, salvataggio dei messaggi in un DB mysql (stesso tipo di macchina per il DB)
  • 12 produttori che eseguono su 12 macchine AS (tomcat), attaccati con jmeter in esecuzione su un'altra macchina. Il carico è circa da 600 a 700 http request al secondo, sui servlet che producono lo stesso carico di messaggi RabbitMQ.

abbiamo notato che volte, consumatori appendere (beh, non sono bloccati, ma essi non consumano più messaggi). Possiamo vedere che ogni consumatore risparmia circa 100 msg/sec nel database, quindi quando uno interrompe il consumo, i messaggi globali salvati per secondo in DB ricadono con lo stesso rapporto (se diciamo 3 consumatori si fermano, cadiamo intorno a 600 msg/sec a 300 msg/sec).

Durante questo periodo, i produttori sono a posto e continuano a produrre alla velocità jmeter (circa 600 msg/sec). I messaggi sono in coda e presi dai consumatori ancora "vivi".

Prima carichiamo tutti i servlet con i produttori, quindi lanciamo tutti i consumatori uno alla volta, controllando se le connessioni sono ok, quindi esegui jmeter.

Stiamo inviando messaggi a uno scambio diretto. Tutti i consumatori stanno ascoltando una coda persistente limitata allo scambio.

Questo punto è importante per la nostra scelta. Hai visto questo con rabbitmq, hai un'idea di cosa sta succedendo?

Grazie per le vostre risposte.

+0

Questo potrebbe essere più appropriato per serverfault. – danben

+0

Grazie, lo posterò anche in serverfault. –

+0

Strano che non ci sia menzione delle versioni. Ad esempio, Ubuntu e Debian tendono a confezionare versioni più vecchie di roba, ma quando quella roba è uno strumento critico che è in fase di sviluppo attivo, come RabbitMQm è meglio eseguire versioni più recenti. –

risposta

4

Vale sempre la pena impostando il conteggio prefetch quando si utilizza basic.consume:

channel.basicQos(100); 

prima della linea channel.basicConsume al fine di garantire che non hai mai più di 100 messaggi in coda nel vostro QueueingConsumer.

+0

Potresti elaborare un po 'di più? In che modo questa impostazione potrebbe aiutare a risolvere il problema dei messaggi persi? Grazie. – Kimi

+3

beh, secondo la domanda, i messaggi non vengono persi, i consumatori * sembrano * smettere di elaborare più messaggi. Con l'impostazione basicQos, impedisce al consumatore di precaricare un numero elevato di messaggi prima che gli altri utenti possano recuperare i messaggi. Con il prefetch infinito e se non si avviano contemporaneamente tutti i consumatori, il primo utente può precaricare un numero elevato di messaggi. Questi messaggi precaricati non verranno consegnati agli altri consumatori –

+0

@Al Bundy Non intendevo dire che i messaggi erano persi, ma che alcuni consumatori non consumavano più messaggi. I messaggi sono in coda e non vengono persi. –

1

Ho visto questo comportamento quando si utilizza il plug-in RabbitMQ STOMP. Non ho ancora trovato una soluzione.

Stai utilizzando il plug-in STOMP?

+0

Grazie per la risposta. No, non lo facciamo. Hai visto una differenza con e senza plug-in STOMP? –

+0

Ho riscontrato questo problema con l'adattatore STOMP ma non senza. – Seb

0

Il canale in una RabbitMQ non è thread-safe. quindi controllare nel canale di consumo per eventuali richieste di thread.