Il modo topic di RabbitMQ in Golang è simile alla modalità di routing (Diretto), con la differenza principale che i parametri di routing nel modo topic supportano la corrispondenza approssimativa. Il tipo di exchange per la modalità topic è 'topic'.
L'architettura della modalità topic è la seguente:
Nota: Se non sei familiare con la modalità topic di RabbitMQ, leggi prima la sezione RabbitMQ modalità topic.
1. Tutorial Preliminare
Per favore, leggi le seguenti sezioni in ordine:
- Sezione concetti di base di RabbitMQ
- Sezione modalità topic di RabbitMQ
- Sezione Implementazione del modello di pubblicazione/iscrizione di Golang RabbitMQ
Nota: Poiché la sezione di pubblicazione/iscrizione di Golang RabbitMQ contiene già esempi di codice completi, cambiano solo la definizione dell'exchange e i parametri di routing per altri modi di RabbitMQ. Pertanto, viene mostrato solo il codice chiave.
2. Dichiarazione dell'Exchange Topic
err = ch.ExchangeDeclare(
"tizi365_topic", // Nome dell'exchange, deve essere univoco
"topic", // Tipo di exchange
true, // Durevole
false, // Auto-cancellabile
false, // Interno
false, // No-wait
nil, // Argomenti
)
3. Invio dei Messaggi
// Contenuto del messaggio
body := "Ciao Tizi365.com!"
// Invia il messaggio
err = ch.Publish(
"tizi365_topic", // Nome dell'exchange
"www.tizi365.com", // Parametro di routing, parametro cruciale che determina a quale coda verrà inviato il tuo messaggio
false, // Obbligatorio
false, // Immediato
amqp.Publishing {
ContentType: "text/plain", // Tipo di contenuto del messaggio, qui è testo semplice
Body: []byte(body), // Contenuto del messaggio
})
4. Consumo dei Messaggi
4.1. Binding dell'Exchange
// Dichiarare la coda su cui operare
q, err := ch.QueueDeclare(
"", // Nome della coda, verrà generato casualmente se non compilato
false, // Coda durevole
false, // Elimina quando non utilizzata
true, // Esclusiva
false, // No-wait
nil, // Argomenti
)
// Associare la coda all'exchange specificato
err = ch.QueueBind(
q.Name, // Nome della coda
"*.tizi365.com", // Parametro di routing, parametro cruciale, utilizzando il jolly * per corrispondere a una parola, se # è usato, può corrispondere a più parole
"tizi365_topic", // Nome dell'exchange, deve corrispondere all'exchange definito dal mittente del messaggio
false,
nil)
4.2. Gestione dei Messaggi
// Creare un consumatore
msgs, err := ch.Consume(
q.Name, // Riferimento al nome della coda sopra
"", // Nome del consumatore, generato automaticamente se non compilato
true, // Acquisizione automatica della coda che il messaggio è stato gestito
false, // Esclusivo
false, // No-local
false, // No-wait
nil, // Argomenti
)
// Iterare attraverso il consumo dei messaggi nella coda
for d := range msgs {
log.Printf("Messaggio ricevuto=%s", d.Body)
}