Pular para o conteúdo
~/.primo-academy.sh
☰ Aulas · RabbitMQ e Mensageria · 0/12
Recomendado: essencial

Fanout e topic: broadcast e padrões

3 min de leitura

fonte

A direct resolve quando cada evento tem um destino certo. Mas e quando muita gente precisa saber da mesma coisa? É aí que entram a fanout e a topic.

Fanout: manda pra todo mundo

A fanout é a mais simples de todas, porque ela ignora a routing key. Não tem filtro, não tem comparação: chegou mensagem, todas as filas ligadas naquela exchange recebem uma cópia.

Fanout: todas as filas ligadas recebem, sem filtro.

Você pode até informar uma routing key na hora de publicar - ela simplesmente não é levada em conta.

Lembra do exemplo da loja lá do primeiro nó? "Pedido criado" é um fato que interessa a três serviços ao mesmo tempo: pagamento, estoque e notificação. Fanout resolve isso sem você precisar listar quem escuta.

E é aí que mora a vantagem real: pra plugar um quarto serviço - digamos, antifraude - você não mexe no produtor. Cria a fila, liga na exchange, pronto. O serviço de pedidos nem fica sabendo.

Topic: o meio-termo com curinga

A topic é uma direct que aceita padrão em vez de texto exato. A routing key vira uma sequência de palavras separadas por ponto - tipo pedido.br.criado - e a binding key pode usar dois curingas:

  • * - substitui exatamente uma palavra.
  • # - substitui zero ou mais palavras.

Essa diferença é sutil no texto e óbvia no exemplo. Com a routing key pedido.br.criado:

Binding keyCasa?Por quê
pedido.br.criadosimtexto idêntico
pedido.*.criadosim* cobre br, uma palavra
pedido.#sim# cobre br.criado, duas palavras
#sim# cobre tudo
pedido.*não* cobre uma palavra só, sobrou criado
*.criadonãosobrou uma palavra no meio
pedido.brnãofaltou criado

A linha que pega todo mundo é a quinta: pedido.* não casa com pedido.br.criado, porque * vale por uma palavra e sobrou uma. Se você quer "tudo que começa com pedido", o certo é pedido.#.

Dica: monte a routing key do mais geral pro mais específico - dominio.regiao.evento, tipo pedido.br.criado. Assim pedido.# pega o domínio inteiro e pedido.br.# pega só o Brasil. Chave mal ordenada, tipo criado.pedido.br, deixa o curinga inútil.

Qual usar

ExchangeUse quando
directcada evento tem um destino certo e conhecido
fanouttodo mundo ligado precisa saber, sem exceção
topicos consumidores querem recortes diferentes do mesmo fluxo

Existe ainda a headers, que roteia pelos cabeçalhos da mensagem em vez da routing key. É bem menos comum - vale saber que existe e seguir em frente.

Três coisas pra fixar:

  • Fanout ignora a routing key e entrega pra todas as filas ligadas.
  • * é uma palavra, # é zero ou mais. Trocar os dois é o erro clássico de topic.
  • Fanout é pra broadcast, topic é pra recorte. Se todo mundo recebe tudo mesmo, fanout é mais simples e mais honesto.

Agora que o modelo mental tá montado, chegou a hora de sair da teoria: no próximo nó a gente sobe um RabbitMQ de verdade com Docker.

// Quiz

Com a routing key pedido.br.criado, qual binding key NÃO casa?

Escolha uma alternativa

// recursos

// avaliação da trilha

—
ainda sem avaliações