Padrão de Roteamento do RabbitMQ em Golang

O padrão de roteamento no RabbitMQ estende o método de roteamento de troca com base no padrão de publicação e assinatura. O tipo de troca para o padrão de roteamento é direto, que também é a troca padrão para o RabbitMQ. Nas seções anteriores, não foi utilizada uma troca explícita, mas a troca subjacente utilizada era na verdade uma troca direta.

Dica: Se você não está familiarizado com as regras do padrão de roteamento, por favor leia Padrões de Roteamento do RabbitMQ.

1. Tutorial Prévio

Por favor, leia o capítulo sobre Padrão de Publicação e Assinatura do RabbitMQ em Golang primeiro. Essencialmente, os vários modos de funcionamento do RabbitMQ são implementados por vários tipos de trocas. O código é quase o mesmo, sendo a principal diferença a definição da troca. Portanto, uma vez que o padrão de publicação e assinatura é compreendido, os outros padrões são bastante simples.

2. Declarando uma Troca Direta

err = ch.ExchangeDeclare(
  "tizi365_direct", // Nome da troca, precisa ser único
  "direct",         // Tipo de troca
  true,             // Durável
  false,            // Auto-exclusão
  false,            // Interno
  false,            // Sem espera
  nil,              // Argumentos
)

3. Enviando Mensagens

	// Conteúdo da mensagem
	body := "Olá Tizi365.com!"
	
	// Enviando a mensagem
	err = ch.Publish(
		"tizi365_direct",     // Troca (nome da troca)
		"blog",               // Chave de roteamento, um parâmetro crucial que determina para qual fila sua mensagem será enviada
		false,                // Obrigatório
		false,                // Imediato
		amqp.Publishing {
			ContentType: "text/plain",   // Tipo de conteúdo da mensagem, neste caso, texto simples
			Body:        []byte(body),    // Conteúdo da mensagem
		})

4. Consumidor Recebendo Mensagens

4.1. Vinculando a Troca

// Declarando a fila a ser operada
q, err := ch.QueueDeclare(
  "",     // Nome da fila, se não especificado, um será gerado aleatoriamente
  false,  // Fila durável
  false,  // Excluir quando não utilizada
  true,   // Exclusiva
  false,  // Sem espera
  nil,    // Argumentos
)

// Vinculando a fila à troca especificada
err = ch.QueueBind(
  q.Name,             // Nome da fila
  "blog",             // Chave de roteamento, se corresponder ao parâmetro de roteamento especificado ao enviar uma mensagem, a mensagem é entregue à fila atual
  "tizi365_direct",   // Nome da troca, que precisa ser consistente com a troca definida no final do remetente da mensagem
  false,
  nil)

4.2. Consumindo Mensagens

// Criando um consumidor
msgs, err := ch.Consume(
  q.Name, // Referência ao nome da fila anterior
  "",     // Nome do consumidor, se não preenchido, um será gerado aleatoriamente
  true,   // Reconhecer automaticamente as mensagens processadas pela fila
  false,  // Exclusivo
  false,  // Sem local
  false,  // Sem espera
  nil,    // Argumentos
)

// Loop para consumir mensagens na fila
for d := range msgs {
  log.Printf("Mensagem recebida=%s", d.Body)
}