2012-11-29 10 views
7

Sto tentando di implementare una coda dlx in RabbitMQ. Lo scenario è abbastanza facile Ho 2 code: 1) vivi 2) morti (x-dead-letter-scambio: "immediato", x-messaggio-TTL: 5000)Scambio di lettere perse Messaggi di caduta di RabbitMQ

e uno scambio "immediato "che è destinata a 1) vivi

ho cercato di eseguire questo esempio: http://blog.james-carr.org/2012/03/30/rabbitmq-sending-a-message-to-be-consumed-later/ ma sembra che i messaggi vengono eliminati dopo il TTL scade e non ottengono pubblicato sullo scambio, quindi il mio coda vivo è sempre vuota .

Ho anche provato a creare le code manualmente nella console di gestione e ottengo lo stesso comportamento.

ho provato con Ubuntu/RabbitMQ 3.0.0 e con Mac OS X e RabbitMQ 2.8.7

Mi sto perdendo qualcosa?

+0

Vuoi che i messaggi che scadono dalla coda "viva" entrino nella coda "morta"? – kzhen

+0

no effettivamente è il contrario, voglio che i messaggi scaduti dalla coda morta nella coda viva. –

+0

come vanno in coda? – kzhen

risposta

8

Quando i messaggi "scompaiono" in RabbitMQ, il problema è in genere ridotto ai binding. Quindi, per ottenere il vostro esempio di lavoro che ho fatto la seguente:

  1. Creato 2 code, vivi, morti (con il TTL e DLX)

  2. creato uno scambio chiamata immediata di tipo diretto

  3. Creato un legame tra lo scambio "immediato" e la coda "vivo" con una chiave di instradamento "morto" - il motivo per questo è perché, la chiave di routing per i messaggi nella coda morta (se si utilizza lo scambio predefinito è "morto" questo deve corrispondere nel binding allo scambio di lettere morte).

La parte importante è nel legame tra la immediato scambio e la coda di viva .

Per testare ho pubblicato un messaggio nella coda inattiva, posso vederlo brevemente nella coda inattiva quindi comparire nella coda attiva.

+0

funziona ora! grazie mille! –

+0

Ho fatto un picco e ho colpito alcuni showstoppers: 1. I messaggi sono solo DLQ: it quando nella parte superiore della Q (http://www.rabbitmq.com/ttl.html - sezione Caveats) Ciò significa che se per prima cosa metto msg 1 a scadere in 4 ore e msg2 a scadere in 1 ora msg2 scadrà solo dopo che msg1 è scaduto. 2. Il TTL per il messaggio è tenuto da Rabbit, quindi diciamo che usi un breve timeout di 10 s. Se il consumatore non è stato in grado di consumare il messaggio entro 10 secondi dalla sua scadenza (a causa di un arretrato) verrà scartato e perso Quanto sopra è stato verificato con Rabbit 3.0.1. Ragazzi, vedete qualche soluzione alternativa? –

+2

@ AndreasÖhlund, prova a progettare utilizzando "per coda TTL", non "per messaggio TTL", se possibile. –

Problemi correlati