O que são Filas de Mensagens
Fila de Mensagens (Message Queue) é um mecanismo para troca assíncrona de mensagens entre aplicações. Ela separa remetente e receptor, melhorando a tolerância a falhas e escalabilidade do sistema como um todo.
Por que é necessário: No processamento síncrono, o remetente precisa aguardar até que o receptor responda. Usando filas de mensagens, você pode tornar o processamento assíncrono e reduzir a dependência entre sistemas.
Componentes Básicos
flowchart LR
Producer["Producer<br/>(Remetente)"] --> Queue["Queue<br/>(Fila de Mensagens)"] --> Consumer["Consumer<br/>(Receptor)"]
- Producer (Produtor): Aplicação que envia mensagens
- Queue (Fila): Local que armazena mensagens temporariamente
- Consumer (Consumidor): Aplicação que recebe e processa mensagens
- Broker: Servidor que intermedia as mensagens
Padrões de Mensagens
Point-to-Point (1 para 1)
Uma mensagem é processada por apenas um consumidor.
Producer → Queue → Consumer A (processa)
↛ Consumer B (não recebe)
Casos de uso: Fila de tarefas, jobs em background
Publish/Subscribe (1 para muitos)
Uma mensagem é recebida por múltiplos subscribers.
flowchart LR
Publisher --> Topic
Topic --> SubA["Subscriber A<br/>(Serviço de Notificação)"]
Topic --> SubB["Subscriber B<br/>(Serviço de Análise)"]
Topic --> SubC["Subscriber C<br/>(Serviço de Log)"]
Casos de uso: Notificação de eventos, atualizações em tempo real
Principais Sistemas de Filas de Mensagens
RabbitMQ
Características:
- Compatível com protocolo AMQP
- Roteamento flexível (Exchange)
- Entrega de mensagens altamente confiável
- Interface de administração completa
Adequado para: Roteamento complexo, integração empresarial
Apache Kafka
Características:
- Throughput extremamente alto
- Persistência e releitura de mensagens
- Processamento paralelo por partição
- Suporte a stream processing
Adequado para: Processamento de grande volume de dados, event sourcing, agregação de logs
Amazon SQS
Características:
- Totalmente gerenciado
- Escalabilidade ilimitada
- Filas padrão e FIFO
- Integração com serviços AWS
Adequado para: Infraestrutura AWS, quando se deseja reduzir carga operacional
Garantias de Entrega de Mensagens
At-Most-Once (No máximo uma vez)
A mensagem ou não é entregue, ou é entregue apenas uma vez.
Producer → Broker → Consumer
↑ ↓
Esquece Em caso de falha
após mensagem é
enviar perdida
Trade-off: Rápido, mas há possibilidade de perda de mensagens
At-Least-Once (Pelo menos uma vez)
A mensagem é entregue pelo menos uma vez.
flowchart LR
Producer --> Broker --> Consumer --> ACK
ACK -->|"Se não houver ACK, reenvia"| Broker
Trade-off: Alta confiabilidade, mas possibilidade de processamento duplicado
Exactly-Once (Exatamente uma vez)
A mensagem é processada exatamente uma vez.
Métodos de implementação:
1. Transação + Idempotência
2. Mecanismo de deduplicação
3. Transação distribuída
Trade-off: Maior confiabilidade, mas implementação complexa e alto overhead
Casos de Uso
Jobs em Background
flowchart LR
Web["Servidor Web<br/>Resposta imediata<br/>\"Solicitação recebida\""] --> Queue["Fila"] --> Worker["Worker<br/>Processamento demorado<br/>- Redimensionamento de imagem<br/>- Envio de email<br/>- Geração de relatório"]
Comunicação entre Microsserviços
flowchart TB
Order["Serviço de Pedidos"] --> Event["Evento: Pedido Concluído"]
Event --> Stock["Serviço de Estoque<br/>(Redução de estoque)"]
Event --> Notify["Serviço de Notificação<br/>(Email de confirmação)"]
Event --> Analytics["Serviço de Análise<br/>(Registro de vendas)"]
Nivelamento de Picos de Carga
Normal: [Requisição] → [Fila] → [Processamento]
(vazia)
Pico: [Requisição] → [Fila] → [Processamento]
Grande volume (acumula) (consome em velocidade constante)
Considerações de Design
Garantia de Idempotência
Projete de forma que o resultado não mude mesmo se a mesma mensagem for processada múltiplas vezes.
// Exemplo ruim: Valor aumenta com processamento duplicado
async function processPayment(orderId, amount) {
await db.payments.create({ orderId, amount });
}
// Exemplo bom: Garantir idempotência com verificação de existência
async function processPayment(orderId, amount) {
const existing = await db.payments.findByOrderId(orderId);
if (existing) return; // Já processado
await db.payments.create({ orderId, amount });
}
Dead Letter Queue (DLQ)
Mensagens que falharam no processamento são movidas para uma fila separada.
Fila Principal → Falha no processamento (3 tentativas) → DLQ
↓
Investigação/Reprocessamento posterior
Ordenação de Mensagens
Quando a ordem é importante, use chaves de partição ou filas FIFO.
Eventos do Pedido ID: 123 → Mesma partição → Ordem garantida
Eventos do Pedido ID: 456 → Partição diferente → Processamento paralelo
Resumo
Filas de mensagens são uma tecnologia fundamental para processamento assíncrono e comunicação entre serviços em sistemas distribuídos. Com a escolha adequada do nível de garantia de entrega, garantia de idempotência e design de tratamento de erros, é possível construir sistemas altamente confiáveis.
← Voltar para a lista