Modo de Fila Simples do Golang RabbitMQ

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)
	}
}