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

Por que filas existem

2 min de leitura

fonte

Muita gente aprende fila como "um lugar onde eu mando uma mensagem e outro sistema consome". Funciona como definição, mas não te ajuda em nada na hora de decidir. O resultado é sempre um dos dois: usar fila onde não precisava, ou não usar onde precisava muito.

Antes de falar de RabbitMQ, exchange, routing key e esse monte de nome, vamos entender o problema. Porque fila não é sobre a ferramenta - é sobre uma decisão de arquitetura.

O pedido que demora uma eternidade

Imagina uma loja online. O usuário clica em "finalizar pedido" e o seu sistema precisa:

  • registrar o pedido no banco
  • processar o pagamento
  • emitir a nota fiscal
  • dar baixa no estoque
  • enviar o e-mail de confirmação

Repara numa coisa: registrar no banco e dar baixa no estoque são coisas suas. Mas pagamento depende de um gateway externo. Nota fiscal depende da Receita ou de um intermediário. E-mail depende de um serviço de envio.

Se você faz tudo em sequência, dentro da mesma request, o usuário fica olhando pro spinner esperando três sistemas que não são seus responderem.

// tudo numa request só - o usuário espera por tudo
await registrarPedido(pedido)
await processarPagamento(pedido)   // gateway externo
await emitirNotaFiscal(pedido)     // Receita
await darBaixaEstoque(pedido)
await enviarEmail(pedido)          // serviço de e-mail

return { status: "ok" }

E aí vem a pergunta que resolve tudo: se a emissão da nota falhar, o que acontece? O pagamento já passou. O estoque já baixou. Você vai ter que desfazer o processo inteiro na mão - e torcer pra que o desfazer também não falhe.

"Mas eu quebro em microserviços que resolve." Não resolve. Se o serviço de pedidos precisa chamar pagamento, esperar, chamar nota, esperar, chamar estoque e esperar, você só trocou funções por requisições HTTP. Microserviço que depende de outro pra responder não é microserviço, é monolito distribuído - com a latência da rede de brinde.

A virada de chave

O que a mensageria propõe é o seguinte: responde pro usuário assim que o pedido estiver registrado. O resto acontece depois.

Em vez de chamar cada serviço, o sistema de pedidos anuncia um fato: "pedido criado". Quem se interessa por esse fato consome e faz sua parte, no seu tempo.

O usuário recebe a resposta sem esperar os sistemas externos.

O usuário recebeu a confirmação em milissegundos. Se a Receita estiver fora do ar, a mensagem espera na fila e é processada quando voltar - sem derrubar a compra e sem desfazer nada.

Três ideias pra levar deste nó:

  • Fila desacopla no tempo. Quem publica não espera quem consome. Uma parte lenta para de segurar a resposta.
  • Fila absorve pico e queda. Serviço fora do ar não perde trabalho, a mensagem fica guardada esperando.
  • Fila muda o modelo mental: em vez de mandar alguém fazer, você anuncia que algo aconteceu. Quem quiser, reage.

Dica: nem tudo vira fila. Se o usuário precisa do resultado pra continuar - login, consulta de saldo, validação de cupom - resposta síncrona é o certo. Fila é pra trabalho que pode terminar depois sem ninguém olhando.

No próximo nó a gente coloca nome nas peças: produtor, exchange, fila e consumidor - e você vai ver uma mensagem andando entre elas antes de instalar qualquer coisa.

// Quiz

Em qual destes casos a resposta síncrona, sem fila, é a escolha certa?

Escolha uma alternativa

// recursos

// avaliação da trilha

—
ainda sem avaliações