Modo de Fila Simples do Golang RabbitMQ
Explicação: P representa o produtor, C representa o consumidor e vermelho representa a fila.
Nota: Se não estiver familiarizado com o RabbitMQ, por favor leia a seção Conceitos Básicos do RabbitMQ primeiro.
1. Instalar Dependências
go get github.com/streadway/amqp
Importar o pacote de dependência
import (
"github.com/streadway/amqp"
)
2. Enviar Mensagens
Os passos a seguir demonstram como o produtor de mensagens completa o envio da mensagem.
2.1. Conectar-se ao Servidor RabbitMQ
// Conectar-se ao Servidor RabbitMQ
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
defer conn.Close()
Explicação do endereço de conexão:
amqp://nome de usuário:senha@endereçoRabbitMQ:porta/
2.2. Criar um Canal
A maioria das operações é realizada no canal.
ch, err := conn.Channel()
defer ch.Close()
2.3. Declarar uma Fila
Representa a fila da qual precisamos ler ou escrever.
q, err := ch.QueueDeclare(
"hello", // Nome da fila
false, // Persistência da mensagem
false, // Excluir a fila quando não estiver em uso
false, // Exclusivo
false, // Sem espera
nil, // Argumentos
)
2.4. Enviar Mensagens
// Conteúdo da mensagem
body := "Olá Mundo!"
// Enviar a mensagem
err = ch.Publish(
"", // Troca (ignorar aqui)
q.Name, // Parâmetro de roteamento, usar o nome da fila como parâmetro de roteamento
false, // Obrigatório
false, // Imediato
amqp.Publishing {
ContentType: "text/plain",
Body: []byte(body), // Conteúdo da mensagem
})
2.5. Código Completo para o Envio de Mensagens
package main
// Importar pacotes
import (
"log"
"github.com/streadway/amqp"
)
// Lidar com erros
func failOnError(err error, msg string) {
if err != nil {
log.Fatalf("%s: %s", msg, err)
}
}
func main() {
// Conectar-se ao RabbitMQ
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
failOnError(err, "Falha ao conectar-se ao RabbitMQ")
defer conn.Close()
// Criar um canal
ch, err := conn.Channel()
failOnError(err, "Falha ao abrir um canal")
defer ch.Close()
// Declarar a fila para operar
q, err := ch.QueueDeclare(
"hello", // Nome
false, // Durável
false, // Excluir quando não estiver em uso
false, // Exclusivo
false, // Sem espera
nil, // Argumentos
)
failOnError(err, "Falha ao declarar uma fila")
// Conteúdo da mensagem a enviar
body := "Olá Mundo!"
// Enviar a mensagem
err = ch.Publish(
"", // Troca
q.Name, // Chave de roteamento
false, // Obrigatório
false, // Imediato
amqp.Publishing{
ContentType: "text/plain",
Body: []byte(body),
})
failOnError(err, "Falha ao publicar uma mensagem")
log.Printf(" [x] Enviado %s", body)
}
3. Recebendo Mensagens
Os primeiros três passos para receber mensagens são os mesmos que para enviar mensagens, correspondendo às seções 2.1, 2.2 e 2.3, respectivamente. O código completo para receber mensagens é o seguinte:
package main
// Importar pacotes
import (
"log"
"github.com/streadway/amqp"
)
// Tratamento de erros
func failOnError(err error, msg string) {
if err != nil {
log.Fatalf("%s: %s", msg, err)
}
}
func main() {
// Conectar ao RabbitMQ
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
failOnError(err, "Falha ao conectar ao RabbitMQ")
defer conn.Close()
// Criar um canal
ch, err := conn.Channel()
failOnError(err, "Falha ao abrir um canal")
defer ch.Close()
// Declarar a fila a ser operada
q, err := ch.QueueDeclare(
"hello", // O nome da fila precisa ser consistente com o nome da fila para enviar mensagens
false, // durável
false, // deletar quando não utilizada
false, // exclusiva
false, // no-wait
nil, // argumentos
)
failOnError(err, "Falha ao declarar uma fila")
// Criar um consumidor de mensagens
msgs, err := ch.Consume(
q.Name, // Nome da fila
"", // Nome do consumidor, se não preenchido, um ID único será gerado automaticamente
true, // Se deve reconhecer automaticamente as mensagens, ou seja, informar automaticamente ao RabbitMQ que a mensagem foi processada com sucesso
false, // exclusiva
false, // no-local
false, // no-wait
nil, // args
)
failOnError(err, "Falha ao registrar um consumidor")
// Buscar mensagens da fila em um loop
for d := range msgs {
// Imprimir o conteúdo da mensagem
log.Printf("Recebeu uma mensagem: %s", d.Body)
}
}