2015-03-01 16 views
13

Sto usando rabbitMQ, prendo tutti i messaggi dalla coda con basic_get senza procedura acking automatica, il che significa che il messaggio rimane in coda fino a quando non accetto o nack il messaggio.Ack o Nack in rabbitMQ

A volte ho messaggi che non possono essere elaborati a causa di qualche eccezione generata, che ha impedito loro di essere completamente elaborati.

Domanda è che cosa importa se entrambi i messaggi accedono in modo corretto ed eccezione generata, voglio dire in termini di risultati i messaggi usciranno sempre dalla coda, quindi cosa importa se uso ack o nack in questo scenario? Forse mi manca qualcosa quando uso ciascuna oprazione?

+0

L'unica differenza è che nack consente di riaccodare, mentre ack no? – JavaSa

risposta

27

Il comando basic.nack è apparentemente un'estensione RabbitMQ, che estende la funzionalità di basic.reject per includere una modalità di elaborazione di massa. Entrambi includono un "bit" (cioè booleano) bandiera della requeue, in modo che in realtà hanno diverse scelte:

  • nack/reject con requeue=1: il messaggio verrà restituito alla coda è venuto da come se si trattasse di una nuova Messaggio; questo potrebbe essere utile in caso di un guasto temporaneo sul lato del consumatore
  • nack/reject con requeue=0 e un Dead Letter Scambio configurato (DLX), pubblicherà il messaggio che lo scambio, permettendo così di essere preso da un'altra coda
  • nack/reject con requeue=0 e nessun DLX semplicemente scartare il messaggio
  • ack rimuoverà il messaggio dalla coda, anche se un DLX è configurato

Se non avete configurato DLX, sempre usin g ack sarà lo stesso di nack/reject con requeue=0; tuttavia, l'utilizzo della funzione logicamente corretta dall'inizio ti darà più flessibilità per configurare le cose in modo diverso successivamente.

+0

Risposta spettacolare! Tuttavia si può chiarire un po 'se il DLX è già considerato come una coda. E quale differenza tra la coda e lo scambio? – JavaSa

+1

@JavaSa Un'analogia comune (che può o non ha senso per te) è che uno scambio è come un ufficio postale e una coda è come una casella postale. Pubblichi sempre un nuovo messaggio in uno scambio (anche se è lo scambio predefinito); lo scambio verrà quindi indirizzato a zero, una o più code, generalmente in base alla sua "chiave di routing". Quindi il DLX più semplice sarebbe uno che ha indirizzato tutto in una singola coda, ma potrebbe essere complesso quanto necessario. – IMSoP

1

Ack e Nack rimuovono entrambi il messaggio dalla coda, con la differenza che quando si effettua il Nack di un messaggio viene inserito nella DLX (dead letter queue) se ne esiste uno definito per tale coda.