2012-06-21 15 views
6

Sono nuovo di RabbitMQ e mi chiedevo un buon approccio a questo problema che sto rimuginando. Voglio creare un servizio che si abbona a una coda e tira solo messaggi che soddisfano un criterio specifico; ad esempio, se nel messaggio è presente un'intestazione dell'oggetto specifico.RabbitMQ-- recupero selettivo dei messaggi da una coda

Sto ancora imparando su RabbitMQ e stavo cercando suggerimenti su come affrontarlo. Le mie domande includono: in che modo il consumatore può prelevare solo messaggi specifici dalla coda? Come può il produttore impostare l'intestazione dell'oggetto nel messaggio (se questo è anche il termine giusto?)

+0

Se davvero il vostro consumatore deve iscriversi ** ** (non interessato a messaggi che vengono pubblicati _prima_ la sottoscrizione), l'abbonamento (e vincolante con la regola di selezione) non è un _queue_ esistente ma uno _exchange_ esistente (come indicato di seguito). Quindi, la formulazione della domanda deve essere modificata. – Myobis

risposta

14

RabbitMQ è perfetto per questa situazione. Hai un numero di opzioni per fare ciò che vuoi. Suggerisco di leggere la documentazione per capire meglio. Ti suggerirei di utilizzare un argomento o uno scambio diretto. L'argomento è più flessibile. Va così.

Il codice produttore si collega al RabbitMQ Broker e crea e scambia con un nome specifico.

Il produttore pubblica per lo scambio. Ogni messaggio pubblicato sarà pubblicato con una chiave di instradamento.

Il cliente si connette al broker RabbitMQ.

consumatori crea lega coda

consumatori Coda per lo scambio, lo stesso cambio definito nel produttore. Il bind include anche le chiavi di instradamento per ogni messaggio richiesto per questo particolare utente.

Diciamo che stavate pubblicando i messaggi di registro. La chiave di routing potrebbe essere qualcosa come "log.info", "log.warn", "log.error". Ogni messaggio pubblicato dal produttore avrà la relativa chiave di routing allegata. Avrai quindi un consumatore che invia e invia per tutti i messaggi di errore e un altro che scrive tutti i messaggi di errore in un file. Quindi l'emailer definirà l'associazione dalla sua coda allo scambio con la chiave di routing "log.error". In questo modo, sebbene lo scambio riceva tutti i messaggi, la coda definita per l'e-mail conterrà solo i messaggi di errore. Il filelogger definirà una nuova coda separata legata allo stesso scambio e configurerà una chiave di instradamento diversa. È possibile eseguire tre binding separati per le tre chiavi di routing differenti o utilizzare semplicemente il "log. *" Jolly per richiedere tutti i messaggi dallo scambio che iniziano con il registro.

Questo è un semplice esempio che mostra come è possibile ottenere ciò che si vuole fare.

sguardo here per esempi di codice specifico numero di esercitazione 5.

+0

Vuoi dire che il consumatore può recuperare il messaggio con una chiave di routing specifica in una coda? Sembra che il consumatore non abbia scelta, semplicemente riceve tutti i messaggi dalla coda. – ThemeZ

+2

Gli utenti di @ThemeZ ricevono tutti i messaggi dalla coda. Penso che sia per definizione. Il punto qui è che sono filtrati al livello di scambio. Con uno scambio di argomenti, la coda riceverà solo determinati messaggi. In questo modo un consumatore leggerà i messaggi che desidera perché la coda riceve solo i messaggi che il consumatore desidera. – robthewolf

Problemi correlati