Modo de Cola Simple de 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)
}
}