Modo de Cola Simple de Golang RabbitMQ

Golang RabbitMQ

Explicación: P representa el productor, C representa el consumidor, y rojo representa la cola.

Nota: Si no estás familiarizado con RabbitMQ, por favor lee primero la sección de Conceptos Básicos de RabbitMQ.

1. Instalar Dependencias

go get github.com/streadway/amqp

Importar el paquete de dependencia

import (
  "github.com/streadway/amqp"
)

2. Enviar Mensajes

Los siguientes pasos demuestran cómo el productor de mensajes completa el envío de mensajes.

2.1. Conectar al Servidor de RabbitMQ

// Conectar al Servidor de RabbitMQ
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
defer conn.Close()

Explicación de la dirección de conexión:

amqp://usuario:contraseña@direcciónRabbitMQ:puerto/

2.2. Crear un Canal

La mayoría de las operaciones se realizan en el canal.

ch, err := conn.Channel()
defer ch.Close()

2.3. Declarar una Cola

Representa la cola de la que necesitamos leer o a la que necesitamos escribir.

q, err := ch.QueueDeclare(
  "hello", // Nombre de la cola
  false,   // Persistencia del mensaje
  false,   // Eliminar la cola cuando no esté en uso
  false,   // Exclusiva
  false,   // No esperar
  nil,     // Argumentos
)

2.4. Enviar Mensajes

// Contenido del mensaje
body := "¡Hola Mundo!"

// Envía el mensaje
err = ch.Publish(
  "",     // Intercambio (ignorar aquí)
  q.Name, // Parámetro de enrutamiento, usar el nombre de la cola como parámetro de enrutamiento
  false,  // Obligatorio
  false,  // Inmediato
  amqp.Publishing {
    ContentType: "text/plain",
    Body:        []byte(body),  // Contenido del mensaje
  })

2.5. Código Completo para Enviar Mensajes

package main

// Importar paquetes
import (
	"log"
	"github.com/streadway/amqp"
)

// Manejar errores
func failOnError(err error, msg string) {
	if err != nil {
		log.Fatalf("%s: %s", msg, err)
	}
}

func main() {
	// Conectar a RabbitMQ
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	failOnError(err, "Error al conectar a RabbitMQ")
	defer conn.Close()

	// Crear un canal
	ch, err := conn.Channel()
	failOnError(err, "Error al abrir un canal")
	defer ch.Close()

	// Declarar la cola a operar
	q, err := ch.QueueDeclare(
		"hello", // Nombre
		false,   // Duradera
		false,   // Eliminar cuando no esté en uso
		false,   // Exclusiva
		false,   // No esperar
		nil,     // Argumentos
	)
	failOnError(err, "Error al declarar una cola")

	// Contenido del mensaje a enviar
	body := "¡Hola Mundo!"

	// Enviar el mensaje
	err = ch.Publish(
		"",     // Intercambio
		q.Name, // Clave de enrutamiento
		false,  // Obligatorio
		false,  // Inmediato
		amqp.Publishing{
			ContentType: "text/plain",
			Body:        []byte(body),
		})
	failOnError(err, "Error al publicar un mensaje")
	log.Printf(" [x] Enviado %s", body)
}

3. Recepción de mensajes

Los primeros tres pasos para recibir mensajes son los mismos que para enviar mensajes, correspondientes a las secciones 2.1, 2.2 y 2.3 respectivamente. El código completo para recibir mensajes es el siguiente:

paquete principal

// Importar paquetes
import (
	"log"
	"github.com/streadway/amqp"
)

// Manejo de errores
func failOnError(err error, msg string) {
	si err != nil {
		log.Fatalf("%s: %s", msg, err)
	}
}

func main() {
	// Conectar a RabbitMQ
	con, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	failOnError(err, "Error al conectar a RabbitMQ")
	defer con.Close()

	// Crear un canal
	ch, err := con.Channel()
	failOnError(err, "Error al abrir un canal")
	defer ch.Close()
	
	// Declarar la cola en la que se va a operar
	q, err := ch.QueueDeclare(
		"hello", // El nombre de la cola necesita ser consistente con el nombre de la cola para enviar mensajes
		false,   // durable
		false,   // elimina cuando no se utiliza
		false,   // exclusiva
		false,   // no esperar
		nil,     // argumentos
	)
	failOnError(err, "Error al declarar una cola")

	// Crear un consumidor de mensajes
	msgs, err := ch.Consume(
		q.Name, // Nombre de la cola
		"",     // Nombre del consumidor, si no se completa, se generará automáticamente un ID único
		true,   // Si reconocer automáticamente los mensajes, es decir, informar automáticamente a RabbitMQ que el mensaje ha sido procesado correctamente
		false,  // exclusiva
		false,  // no local
		false,  // no esperar
		nil,    // argumentos
	)
	failOnError(err, "Error al registrar un consumidor")
	
	// Obtener mensajes de la cola en un bucle
	para d := rango msgs {
		// Imprimir el contenido del mensaje
		log.Printf("Recibido un mensaje: %s", d.Body)
	}
}