El modo de tema de RabbitMQ de Golang es similar al modo de enrutamiento (Direct), con la mayor diferencia de que los parámetros de enrutamiento en el modo de tema admiten coincidencias difusas. El tipo de intercambio para el modo de tema es 'topic'.
La arquitectura del modo de tema es la siguiente:
Nota: Si no estás familiarizado con el modo de tema de RabbitMQ, por favor lee primero la sección Modo de tema de RabbitMQ.
1. Tutorial Prerrequisito
Por favor lee las siguientes secciones en orden:
- Sección de conceptos básicos de RabbitMQ
- Sección de modo de tema de RabbitMQ
- Sección de Implementando el patrón de publicación/suscripción de RabbitMQ de Golang
Nota: Debido a que la sección de publicación/suscripción de RabbitMQ de Golang ya contiene ejemplos de código completos, solo la definición de intercambio y los parámetros de enrutamiento son diferentes para otros modos de RabbitMQ. Por lo tanto, solo se muestra el código clave.
2. Declaración de Intercambio de Tema
err = ch.ExchangeDeclare(
"tizi365_topic", // Nombre del intercambio, debe ser único
"topic", // Tipo de intercambio
true, // Duradero
false, // Auto-eliminado
false, // Interno
false, // No esperar
nil, // Argumentos
)
3. Envío de Mensajes
// Contenido del mensaje
body := "¡Hola Tizi365.com!"
// Publicar mensaje
err = ch.Publish(
"tizi365_topic", // Nombre del intercambio
"www.tizi365.com", // Parámetro de enrutamiento, parámetro crucial que determina a qué cola se enviará el mensaje
false, // Obligatorio
false, // Inmediato
amqp.Publishing {
ContentType: "text/plain", // Tipo de contenido del mensaje, aquí es texto sin formato
Body: []byte(body), // Contenido del mensaje
})
4. Consumo de Mensajes
4.1. Enlazar Intercambio
// Declarar la cola en la que se va a operar
q, err := ch.QueueDeclare(
"", // Nombre de la cola, se generará aleatoriamente si no se completa
false, // Cola duradera
false, // Eliminar cuando no se use
true, // Exclusiva
false, // No esperar
nil, // Argumentos
)
// Enlazar la cola al intercambio especificado
err = ch.QueueBind(
q.Name, // Nombre de la cola
"*.tizi365.com", // Parámetro de enrutamiento, parámetro crucial, usando el comodín * para hacer coincidir una palabra, si se usa #, puede hacer coincidir varias palabras
"tizi365_topic", // Nombre del intercambio, debe coincidir con el intercambio definido por el remitente del mensaje
false,
nil)
4.2. Manejo de Mensajes
// Crear un consumidor
msgs, err := ch.Consume(
q.Name, // Referencia al nombre de la cola anterior
"", // Nombre del consumidor, se genera automáticamente si no se completa
true, // Reconocimiento automático a la cola de que el mensaje ha sido manejado
false, // Exclusivo
false, // No local
false, // No esperar
nil, // Argumentos
)
// Iterar a través de la consumición de mensajes en la cola
for d := range msgs {
log.Printf("Mensaje recibido=%s", d.Body)
}