O modo Tópico do RabbitMQ em Golang é semelhante ao modo de roteamento (Direto), com a maior diferença sendo que os parâmetros de roteamento no modo de tópico suportam correspondência difusa. O tipo de troca para o modo tópico é 'tópico'.
A arquitetura do modo tópico é a seguinte:
Nota: Se não estiver familiarizado com o modo tópico do RabbitMQ, por favor leia primeiro a seção Modo Tópico do RabbitMQ.
1. Tutorial Pré-requisito
Por favor, leia as seguintes seções em ordem:
- Seção Conceitos básicos do RabbitMQ
- Seção Modo tópico do RabbitMQ
- Seção Implementando o padrão de publicação/assinatura do RabbitMQ em Golang
Nota: Porque a seção de publicação/assinatura do RabbitMQ em Golang já contém exemplos de código completos, apenas a definição da troca e os parâmetros de roteamento são diferentes para outros modos do RabbitMQ. Portanto, apenas o código-chave é mostrado.
2. Declarando Troca de Tópico
err = ch.ExchangeDeclare(
"tizi365_topic", // Nome da troca, precisa ser único
"topic", // Tipo de troca
true, // Durável
false, // Auto-excluir
false, // Interno
false, // Sem espera
nil, // Argumentos
)
3. Enviando Mensagens
// Conteúdo da mensagem
body := "Olá Tizi365.com!"
// Publicar mensagem
err = ch.Publish(
"tizi365_topic", // Nome da troca
"www.tizi365.com", // Parâmetro de roteamento, parâmetro crucial que determina a qual fila sua mensagem será enviada
false, // Obrigatório
false, // Imediato
amqp.Publishing {
ContentType: "text/plain", // Tipo de conteúdo da mensagem, aqui é texto simples
Body: []byte(body), // Conteúdo da mensagem
})
4. Consumindo Mensagens
4.1. Vinculando Troca
// Declarar a fila a ser operada
q, err := ch.QueueDeclare(
"", // Nome da fila, será gerado aleatoriamente se não preenchido
false, // Fila durável
false, // Excluir quando não utilizada
true, // Exclusiva
false, // Sem espera
nil, // Argumentos
)
// Vincular a fila à troca especificada
err = ch.QueueBind(
q.Name, // Nome da fila
"*.tizi365.com", // Parâmetro de roteamento, parâmetro crucial, usando o curinga * para combinar uma palavra, se # for usado, pode combinar várias palavras
"tizi365_topic", // Nome da troca, precisa corresponder à troca definida pelo remetente da mensagem
false,
nil)
4.2. Lidando com Mensagens
// Criar um consumidor
msgs, err := ch.Consume(
q.Name, // Referência ao nome da fila acima
"", // Nome do consumidor, gerado automaticamente se não preenchido
true, // Reconhecimento automático para a fila de que a mensagem foi tratada
false, // Exclusivo
false, // Não local
false, // Sem espera
nil, // Args
)
// Iterar através do consumo de mensagens na fila
for d := range msgs {
log.Printf("Mensagem recebida=%s", d.Body)
}