Como Funcionam as Filas de Mensagens - Processamento Assíncrono e Integração de Sistemas

16 min leitura | 2025.12.17

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