Modello di instradamento RabbitMQ in Golang

Il modello di instradamento in RabbitMQ estende il metodo di instradamento dello scambio basato sul modello di pubblicazione-sottoscrizione. Il tipo di scambio per il modello di instradamento è diretto, che è anche lo scambio predefinito per RabbitMQ. Nelle sezioni precedenti, non è stato utilizzato uno scambio esplicito, ma lo scambio sottostante utilizzato era effettivamente uno scambio diretto.

Suggerimento: Se non sei familiare con le regole del modello di instradamento, leggi Modelli di instradamento RabbitMQ.

1. Tutorial Prerequisito

Si prega di leggere il capitolo su Modello di pubblicazione-sottoscrizione RabbitMQ in Golang prima. Fondamentalmente, i vari modi di lavoro di RabbitMQ sono implementati da vari tipi di scambi. Il codice è quasi lo stesso, con la principale differenza nella definizione dello scambio. Pertanto, una volta compreso il modello di pubblicazione-sottoscrizione, gli altri modelli sono piuttosto semplici.

2. Dichiarare uno Scambio Diretto

err = ch.ExchangeDeclare(
  "tizi365_direct", // Nome dello scambio, deve essere unico
  "direct",         // Tipo di scambio
  true,             // Durevole
  false,            // Auto-cancellato
  false,            // Interno
  false,            // No-wait
  nil,              // Argomenti
)

3. Inviare Messaggi

	// Contenuto del messaggio
	body := "Ciao Tizi365.com!"
	
	// Invio del messaggio
	err = ch.Publish(
		"tizi365_direct",     // Scambio (nome dello scambio)
		"blog",               // Chiave di instradamento, un 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, in questo caso, testo semplice
			Body:        []byte(body),    // Contenuto del messaggio
		})

4. Ricezione dei Messaggi da Parte del Consumatore

4.1. Associazione dello Scambio

// Dichiarazione della coda su cui operare
q, err := ch.QueueDeclare(
  "",     // Nome della coda, se non specificato, ne verrà generato uno casuale
  false,  // Coda durevole
  false,  // Eliminare quando inutilizzata
  true,   // Esclusiva
  false,  // No-wait
  nil,    // Argomenti
)

// Associazione della coda allo scambio specificato
err = ch.QueueBind(
  q.Name,             // Nome della coda
  "blog",             // Chiave di instradamento, se corrisponde al parametro di instradamento specificato durante l'invio di un messaggio, il messaggio viene consegnato alla coda corrente
  "tizi365_direct",   // Nome dello scambio, che deve essere coerente con lo scambio definito sul lato del mittente del messaggio
  false,
  nil)

4.2. Consumare Messaggi

// Creazione di un consumatore
msgs, err := ch.Consume(
  q.Name, // Riferimento al nome della coda precedente
  "",     // Nome del consumatore, se non compilato, ne verrà generato uno casuale
  true,   // Riconoscimento automatico dei messaggi elaborati dalla coda
  false,  // Esclusivo
  false,  // No-local
  false,  // No-wait
  nil,    // Argomenti
)

// Ciclo per consumare i messaggi nella coda
for d := range msgs {
  log.Printf("Messaggio ricevuto=%s", d.Body)
}