In RabbitMQ, quando un messaggio diventa un messaggio non elaborabile (un messaggio che i consumatori non possono elaborare) in una coda, viene reindirizzato a un altro exchange, che chiamiamo exchange dei messaggi non elaborabili. L'exchange dei messaggi non elaborabili quindi invia il messaggio non elaborabile a una coda, che è la coda dei messaggi non elaborabili.
Illustrazione della Coda dei Messaggi Non Elaborabili
L'illustrazione sopra descrive l'intero processo dalla generazione dei messaggi non elaborabili alla loro gestione.
Generazione dei Messaggi Non Elaborabili
Le seguenti sono le condizioni per la generazione dei messaggi non elaborabili:
- Il messaggio viene manualmente rifiutato dal consumatore (basic.reject / basic.nack) e requeue = false.
- Il tempo di vita del messaggio (TTL) scade.
- La coda raggiunge la lunghezza massima.
Passaggi per la Gestione della Coda dei Messaggi Non Elaborabili
- Definire un exchange dei messaggi non elaborabili (non lasciarti ingannare dal nome, è solo un exchange regolare, viene chiamato così solo nel contesto della gestione dei messaggi non elaborabili).
- Definire una coda da collegare all'exchange dei messaggi non elaborabili (questa coda viene chiamata coda dei messaggi non elaborabili ed è anche una coda regolare).
- Definire un consumatore dei messaggi non elaborabili per consumare la coda dei messaggi non elaborabili (non lasciarti ingannare dal nome, è anche un consumatore regolare).
- Collegare l'exchange dei messaggi non elaborabili alla coda specificata (la coda che deve gestire i messaggi non elaborabili dovrebbe essere collegata).
Suggerimento: fare riferimento all'illustrazione sopra per il principio. Tutti i linguaggi di programmazione gestiscono le code dei messaggi non elaborabili in modo simile.
Gestione della Coda dei Messaggi Non Elaborabili in Golang
1. Definire l'Exchange dei Messaggi Non Elaborabili
Definiscilo come un exchange regolare.
// Dichiarare l'exchange
err = ch.ExchangeDeclare(
"tizi365.dead", // Nome dell'exchange
"topic", // Tipo di exchange
true, // Persistente
false,
false,
false,
nil,
)
2. Definire la Coda dei Messaggi Non Elaborabili
Definiscila come una coda regolare.
// Dichiarare la coda
q, err := ch.QueueDeclare(
"", // Nome della coda, lasciarlo vuoto per generarne uno casuale
false, // Coda persistente
false,
true,
false,
nil,
)
// Collegare la coda all'exchange dei messaggi non elaborabili
err = ch.QueueBind(
q.Name, // Nome della coda
"#", // Chiave di instradamento, # significa corrispondere a tutte le chiavi di instradamento, ovvero ricevere tutti i messaggi non elaborabili
"tizi365.dead", // Nome dell'exchange dei messaggi non elaborabili
false,
nil)
Suggerimento: Tratta la coda dei messaggi non elaborabili come una coda regolare.
3. Definire il Consumatore dei Messaggi Non Elaborabili
// Creare un consumatore
msgs, err := ch.Consume(
q.Name, // Fare riferimento al nome della coda dei messaggi non elaborabili precedente
"", // Nome del consumatore, se non fornito, ne verrà generato uno casuale
true, // Conferma automatica dell'elaborazione del messaggio
false,
false,
false,
nil,
)
// Ciclo per consumare i messaggi dalla coda dei messaggi non elaborabili
for d := range msgs {
log.Printf("Ricevuto messaggio non elaborabile=%s", d.Body)
}
4. Collegare l'Exchange dei Messaggi Non Elaborabili a una Coda Specifica
// Proprietà della coda
props := make(map[string]interface{})
// Collegare l'exchange dei messaggi non elaborabili
props["x-dead-letter-exchange"] = "tizi365.dead"
// Opzionale: Impostare la chiave di instradamento quando il messaggio non elaborabile viene consegnato all'exchange dei messaggi non elaborabili. Se non impostato, verrà utilizzata la chiave di instradamento del messaggio originale.
// props["x-dead-letter-routing-key"] = "www.tizi365.com"
q, err := ch.QueueDeclare(
"tizi365.demo.hello", // Nome della coda
true, // Persistente
false,
false,
false,
props, // Impostare le proprietà della coda
)
In questo modo, se i messaggi nella coda tizi365.demo.hello diventano messaggi non elaborabili, saranno inoltrati all'exchange dei messaggi non elaborabili tizi365.dead.