Patrón de enrutamiento de RabbitMQ en Golang

El patrón de enrutamiento en RabbitMQ extiende el método de enrutamiento de intercambio sobre la base del patrón de publicación-suscripción. El tipo de intercambio para el patrón de enrutamiento es directo, que también es el intercambio predeterminado para RabbitMQ. En las secciones anteriores, no se utilizó un intercambio explícito, pero el intercambio subyacente utilizado era en realidad un intercambio directo.

Consejo: Si no está familiarizado con las reglas del patrón de enrutamiento, por favor lea Patrones de enrutamiento de RabbitMQ.

1. Tutorial Prerrequisito

Por favor, lea primero el capítulo sobre Patrón de publicación-suscripción de RabbitMQ en Golang. Básicamente, los diversos modos de trabajo de RabbitMQ se implementan mediante varios tipos de intercambios. El código es casi el mismo, siendo la principal diferencia la definición del intercambio. Por lo tanto, una vez entendido el patrón de publicación-suscripción, otros patrones son bastante simples.

2. Declaración de un intercambio directo

err = ch.ExchangeDeclare(
  "tizi365_direct", // Nombre del intercambio, debe ser único
  "direct",         // Tipo de intercambio
  true,             // Duradero
  false,            // Auto-eliminado
  false,            // Interno
  false,            // Sin espera
  nil,              // Argumentos
)

3. Envío de mensajes

	// Contenido del mensaje
	body := "¡Hola Tizi365.com!"
	
	// Enviar el mensaje
	err = ch.Publish(
		"tizi365_direct",     // Intercambio (nombre del intercambio)
		"blog",               // Clave de enrutamiento, un parámetro crucial que determina a qué cola se enviará su mensaje
		false,                // Obligatorio
		false,                // Inmediato
		amqp.Publishing {
			ContentType: "text/plain",   // Tipo de contenido del mensaje, en este caso, texto sin formato
			Body:        []byte(body),    // Contenido del mensaje
		})

4. Recepción de mensajes por el consumidor

4.1. Vinculación del intercambio

// Declarar la cola en la que se operará
q, err := ch.QueueDeclare(
  "",     // Nombre de la cola, si no se especifica, se generará uno aleatorio
  false,  // Cola duradera
  false,  // Eliminar cuando no se use
  true,   // Exclusiva
  false,  // Sin espera
  nil,    // Argumentos
)

// Vincular la cola al intercambio especificado
err = ch.QueueBind(
  q.Name,             // Nombre de la cola
  "blog",             // Clave de enrutamiento, si coincide con el parámetro de enrutamiento especificado al enviar un mensaje, el mensaje se entrega a la cola actual
  "tizi365_direct",   // Nombre del intercambio, que debe ser consistente con el intercambio definido en el extremo del emisor del mensaje
  false,
  nil)

4.2. Consumir mensajes

// Crear un consumidor
msgs, err := ch.Consume(
  q.Name, // Referencia al nombre de cola anterior
  "",     // Nombre del consumidor, si no se completa, se generará uno aleatorio
  true,   // Reconocer automáticamente los mensajes procesados por la cola
  false,  // Exclusivo
  false,  // No local
  false,  // Sin espera
  nil,    // Argumentos
)

// Recorrer para consumir mensajes en la cola
for d := range msgs {
  log.Printf("Mensaje recibido=%s", d.Body)
}