Amazon SQS é um serviço de filas gerenciadas; Amazon SNS é um serviço de notificações pub/sub. Juntos, eles formam a base da mensageria desacoplada na AWS — permitindo que serviços se comuniquem sem depender da disponibilidade uns dos outros.
🎯 Para a certificação
Questões sobre SQS e SNS testam se você entende a diferença entre "empurrar" (SNS) e "puxar" (SQS) mensagens, o padrão fanout, Standard vs FIFO, o papel do visibility timeout no ciclo de vida de uma mensagem, como configurar dead-letter queues corretamente (inclusive o
maxReceiveCount), e quando usar SQS/SNS em vez de EventBridge.
Resumo
Pense no SNS como uma rádio ao vivo e no SQS como uma caixa de correio. Uma rádio (SNS) transmite uma mensagem uma única vez, e qualquer ouvinte inscrito (e-mail, SMS, uma fila SQS, uma função Lambda) a recebe no mesmo instante — se ninguém estiver ouvindo naquele momento, a mensagem se perde. Uma caixa de correio (SQS), por outro lado, guarda a carta até que alguém venha buscá-la — não importa se o destinatário está de férias por uma semana, a carta continua lá, esperando.
- SNS: push, pub/sub, entrega imediata a múltiplos subscribers (SQS, Lambda, HTTP/S, e-mail, SMS). Não retém mensagem se ninguém está inscrito.
- SQS: pull, fila, retém a mensagem até que um consumidor a processe e a delete explicitamente. Existe em duas variantes: Standard (alto throughput, at-least-once) e FIFO (ordenação garantida, exactly-once).
- Fanout: o padrão mais cobrado na prova — um tópico SNS publica uma vez, e várias filas SQS inscritas recebem cópias independentes, permitindo processamento paralelo e desacoplado.
1. Dois modelos de entrega: push (SNS) vs pull (SQS)
A diferença mais fundamental entre os dois serviços não é "fila vs notificação" — é quem inicia a entrega da mensagem.
- SNS empurra (push): no momento em que uma mensagem é publicada num tópico, a AWS já tenta entregá-la ativamente a cada subscriber inscrito. Não há "buscar" — a mensagem chega sozinha.
- SQS é puxado (pull): uma mensagem colocada numa fila fica parada lá, esperando. Nada acontece com ela até que um consumidor chame
ReceiveMessageativamente (ou, no caso de uma Lambda com event source mapping, até que o serviço faça esse polling por você, por trás dos panos).
Essa diferença tem uma consequência prática importante: SNS não é durável para quem não está ouvindo. Se um tópico SNS publica uma mensagem e nenhum subscriber está inscrito (ou o subscriber está indisponível no momento), a mensagem simplesmente não é entregue — não existe "retenção" no SNS como existe no SQS. Por isso, o padrão mais seguro é quase sempre inscrever uma fila SQS como subscriber de um tópico SNS, mesmo quando o consumidor final é outra coisa: a fila garante que a mensagem sobrevive até ser processada, mesmo que o consumidor caia temporariamente.
2. Ciclo de vida de uma mensagem no SQS: visibility timeout
Esse é o conceito mais mal-entendido do SQS, e um dos mais cobrados na prova.
Quando um consumidor chama ReceiveMessage, a mensagem não é removida da fila — ela apenas fica invisível para outros consumidores por um período configurável chamado visibility timeout (padrão: 30 segundos). A ideia é dar tempo ao consumidor para processar a mensagem antes de confirmar que terminou.
O que acontece depois depende do que o consumidor faz:
- Consumidor processa com sucesso e chama
DeleteMessage: a mensagem é removida permanentemente da fila. - Consumidor falha, trava, ou simplesmente não chama
DeleteMessagea tempo: quando o visibility timeout expira, a mensagem volta a ficar visível na fila automaticamente, e outro consumidor (ou o mesmo) pode recebê-la de novo. Isso é o mecanismo que dá ao SQS sua entrega at-least-once: a mensagem só some quando alguém explicitamente confirma que terminou.
| Limite | Valor |
|---|---|
| Visibility timeout padrão | 30 segundos |
| Visibility timeout máximo | 12 horas |
| Retenção de mensagem (padrão) | 4 dias |
| Retenção de mensagem (máximo configurável) | 14 dias |
| Tamanho máximo de mensagem | 256 KB |
| Delay queue (atraso antes de ficar visível pela primeira vez) | até 15 minutos |
| Long polling (espera por mensagem antes de retornar vazio) | até 20 segundos |
💡 Para a prova: se o cenário descreve uma mensagem sendo processada duas vezes porque o consumidor demorou mais que o esperado, a causa quase sempre é um visibility timeout configurado baixo demais em relação ao tempo real de processamento. A correção é aumentar o visibility timeout (idealmente para pelo menos o dobro do tempo médio de processamento da função consumidora).
💡 Mensagens acima de 256 KB não cabem diretamente no SQS — a solução para "mensagens grandes" é o Amazon SQS Extended Client Library, que armazena o payload real num bucket S3 e envia apenas uma referência (ponteiro) através da fila.
3. Standard vs FIFO
| Recurso | Standard | FIFO |
|---|---|---|
| Throughput | Praticamente ilimitado | Até 3.000 msg/s (com batching); 300/s sem batching |
| Ordem de entrega | Não garantida (best-effort) | Garantida, por message group ID |
| Entrega duplicada | Possível (at-least-once) | Evitada via dedupe (exactly-once dentro de uma janela de 5 min) |
| Nome da fila | Livre | Precisa terminar em .fifo |
| Deduplicação | Não nativa | Automática (por MessageDeduplicationId ou hash do conteúdo) |
Dois detalhes que a prova adora testar:
- A ordenação do FIFO é por message group, não pela fila inteira. Se você não especificar um
MessageGroupId, todas as mensagens caem no mesmo grupo e são processadas estritamente em sequência (limitando o paralelismo). Se você usar IDs de grupo diferentes (ex: um por cliente), mensagens de grupos diferentes podem ser processadas em paralelo, mas a ordem dentro de cada grupo continua garantida. - "Exactly-once" no FIFO é sobre não introduzir duplicatas na fila, não uma garantia mágica de que o consumidor nunca vai processar algo duas vezes por qualquer motivo (ex: se o consumidor falhar depois de processar mas antes de deletar a mensagem, ela ainda pode voltar a ficar visível). Por isso, mesmo com FIFO, projetar consumidores idempotentes continua sendo boa prática.
4. Padrões: Fanout e Pub/Sub
4.1 Fanout (SNS → múltiplas SQS)
O padrão mais cobrado da prova para SQS/SNS juntos. Um único tópico SNS publica uma mensagem, e ela é replicada automaticamente para todas as filas SQS inscritas — cada fila recebe sua própria cópia independente.
Explicação didática: imagine um comunicado da empresa (SNS) que precisa chegar simultaneamente ao setor de faturamento, ao setor de atendimento e ao setor de analytics — cada um com sua própria "caixa de entrada" (fila SQS). O comunicado é anunciado uma única vez, mas cada setor processa sua cópia no seu próprio ritmo, sem que um dependa do outro e sem que o publicador precise saber quantos ou quais setores estão ouvindo.
Por que usar fanout em vez de publicar direto em cada fila? Porque o publicador fica desacoplado do número e da identidade dos consumidores. Adicionar um quarto setor consumidor (ex: um novo serviço de auditoria) significa apenas inscrever uma nova fila SQS no tópico existente — nenhuma mudança é necessária no lado de quem publica.
4.2 Pub/Sub direto (sem fila intermediária)
SNS também entrega diretamente a endpoints HTTP/S, e-mail, SMS ou Lambda, sem passar por uma fila. É mais simples, mas menos resiliente: se o endpoint estiver indisponível no momento da publicação, a entrega pode falhar sem um buffer para reter a mensagem (embora o SNS tenha retry automático com backoff para HTTP/S e Lambda, ele não é ilimitado).
5. Dead-letter queues (DLQ)
Uma DLQ captura mensagens que não puderam ser processadas com sucesso após um número configurável de tentativas — permitindo diagnóstico e reprocessamento posterior, sem perder o dado nem travar a fila principal indefinidamente com uma mensagem "problemática".
5.1 DLQ de uma fila SQS
Configurada através de uma redrive policy, que define:
- Fila de destino (a própria DLQ, que é outra fila SQS comum).
maxReceiveCount: quantas vezes uma mensagem pode ser recebida (e voltar a ficar visível sem ser deletada) antes de ser movida automaticamente para a DLQ.
Se uma mensagem está sendo recebida repetidamente e nunca deletada (ex: o consumidor trava toda vez que tenta processá-la), ela seria reprocessada para sempre sem uma DLQ configurada — bloqueando efetivamente o consumidor de avançar para outras mensagens "boas" atrás dela na fila.
5.2 DLQ associada ao SNS
SNS também suporta DLQ, mas com propósito diferente: captura mensagens que falharam na entrega a um subscriber específico (ex: um endpoint HTTP que retornou erro repetidamente, ou uma Lambda que falhou em todas as tentativas de invocação assíncrona vindas do SNS).
💡 Não confunda a DLQ da fila SQS (mensagens que o consumidor não conseguiu processar) com a DLQ do SNS (mensagens que o SNS não conseguiu entregar a um subscriber). São mecanismos parecidos na ideia, mas resolvem problemas em pontos diferentes do fluxo.
6. Segurança e permissões
- Resource-based policy (queue/topic policy): controla quem pode publicar ou consumir — por exemplo, permitir que um bucket S3 específico publique eventos numa fila SQS, ou que um tópico SNS só aceite publicações de uma role específica.
- Criptografia (SSE): tanto SQS quanto SNS suportam server-side encryption com KMS, protegendo o conteúdo da mensagem em repouso.
- IAM policy na role do consumidor/publicador continua sendo necessária além da resource policy — assim como no Lambda, a permissão de "quem pode chamar" (resource policy) e "o que a entidade pode fazer" (IAM policy do usuário/role) são camadas independentes.
7. Integração com Lambda
- SQS → Lambda: sempre via event source mapping (invocação baseada em polling) — o serviço Lambda faz o polling da fila por trás dos panos e invoca a função com um lote de mensagens. Se o processamento falhar, as mensagens voltam a ficar visíveis na fila (não são deletadas) e podem ser reprocessadas até o
maxReceiveCount, quando então vão para a DLQ da própria fila SQS. - SNS → Lambda: invocação assíncrona direta (push) — o SNS invoca a função e, em caso de falha após os retries automáticos do Lambda, o evento pode ser roteado para o destino de falha configurado na própria função (ou para a DLQ do SNS, se configurada no lado do subscriber).
💡 Para a prova: se o cenário menciona uma Lambda consumindo uma fila SQS que tem mensagens "presas" sendo reprocessadas indefinidamente, verifique o
maxReceiveCountda redrive policy e confirme se existe uma DLQ configurada para capturar essas mensagens.
8. Quando usar SQS, SNS ou EventBridge
- Use SQS quando você precisa de um buffer confiável entre produtor e consumidor, especialmente quando o consumidor processa no seu próprio ritmo (worker pulling de uma fila) ou quando picos de carga precisam ser absorvidos sem sobrecarregar o consumidor.
- Use SNS quando você precisa notificar múltiplos destinos diferentes em tempo real a partir de um único evento, especialmente quando os destinos são heterogêneos (e-mail, SMS, HTTP, filas).
- Considere EventBridge em vez de SNS quando o cenário envolve roteamento baseado em conteúdo/regras entre múltiplos produtores e consumidores de diferentes serviços AWS ou SaaS de terceiros, ou quando você precisa de um barramento de eventos com schema registry — SNS é mais simples e direto para fanout puro, EventBridge é mais adequado para arquiteturas orientadas a eventos mais complexas.
9. Boas práticas
- Prefira o padrão SNS → SQS → worker em vez de push direto (SNS → HTTP) quando resiliência importa mais que latência mínima — a fila absorve indisponibilidades temporárias do consumidor.
- Configure DLQ com
maxReceiveCountem toda fila de produção, evitando que uma mensagem "envenenada" bloqueie o processamento das demais. - Ajuste o visibility timeout para ser maior que o tempo médio (idealmente com folga) de processamento do consumidor, evitando reentregas duplicadas por timeout prematuro.
- Projete consumidores idempotentes — mesmo com FIFO, falhas no meio do processamento podem levar a reentregas.
- Use FIFO com message group ID apenas quando ordering realmente importa para o caso de uso — caso contrário, Standard oferece throughput maior sem necessidade real.
- Use long polling (
ReceiveMessageWaitTimeSeconds> 0) em vez de short polling, reduzindo custo com chamadas vazias e latência de entrega.
10. Como cai na certificação
- Cenário "replicar um evento para múltiplos serviços consumirem de forma independente" → Fanout: SNS com múltiplas filas SQS inscritas.
- Cenário "mensagens sendo processadas fora de ordem" ou "processamento duplicado indevido para o mesmo cliente" → SQS FIFO com message group ID.
- Cenário "mensagem sendo reprocessada repetidamente sem nunca ter sucesso, travando a fila" → configurar DLQ com
maxReceiveCountadequado. - Cenário "consumidor recebe a mesma mensagem mais de uma vez, mesmo processando com sucesso" → revisar o visibility timeout, provavelmente configurado abaixo do tempo real de processamento.
- Cenário "mensagens maiores que 256 KB" → SQS Extended Client Library com payload no S3.
- Cenário "notificar múltiplos tipos de destino (e-mail, SMS, fila, HTTP) a partir de um único evento" → SNS.
- Cenário "roteamento baseado em regras/conteúdo entre múltiplos serviços e origens" → considerar EventBridge em vez de SNS.
- Cenário "Lambda consumindo SQS com falhas persistentes num pequeno subconjunto de mensagens" → verificar redrive policy e DLQ da fila, não apenas o destino de falha da função Lambda.
11. Exercícios práticos
- Desenhe um sistema de e-commerce em que um evento de "pedido criado" precisa disparar processamento independente em faturamento, envio de e-mail e atualização de estoque. Identifique o padrão e os componentes envolvidos.
- Explique, com um exemplo concreto, por que uma fila SQS Standard pode entregar a mesma mensagem duas vezes mesmo sem nenhum erro do consumidor.
- Um consumidor demora em média 45 segundos para processar cada mensagem, mas a fila está configurada com visibility timeout de 30 segundos. Explique o sintoma que isso provavelmente está causando e como corrigir.
- Compare o comportamento de um tópico SNS sem nenhuma fila SQS inscrita publicando para um endpoint HTTP indisponível, contra o mesmo cenário usando o padrão SNS→SQS→worker.
- Explique a diferença entre a DLQ de uma fila SQS e a DLQ associada a um subscriber do SNS.
12. Questões de Revisão
Questão 1
Você precisa replicar uma notificação de "novo pedido" para três sistemas independentes, cada um processando no seu próprio ritmo. Qual padrão é o mais adequado?
Questão 2
Qual fila é mais adequada quando é necessário garantir ordenação estrita de mensagens por cliente e evitar duplicatas na fila?
Questão 3
Uma fila SQS Standard está configurada com `maxReceiveCount` de 5 numa redrive policy apontando para uma DLQ. O que acontece com uma mensagem que falha no processamento repetidamente?
Questão 4
Um consumidor de uma fila SQS Standard está recebendo mensagens que ele mesmo já processou e deletou anteriormente. Qual é a causa mais provável?
Questão 5
Uma aplicação precisa enviar mensagens de até 2 MB através do SQS, mas o limite de tamanho de mensagem do serviço é 256 KB. Qual é a solução recomendada pela AWS?
Questão 6
Qual é a principal diferença entre a DLQ configurada numa fila SQS e a DLQ associada a um subscriber do SNS?
Questão 7
Uma equipe precisa notificar simultaneamente um endpoint HTTP, enviar um SMS e disparar processamento assíncrono numa fila, a partir de um único evento de negócio. Qual serviço inicia esse fluxo?
Questão 8
Qual é a diferença fundamental entre o modelo de entrega do SNS e do SQS?
Questão 9
Um tópico SNS publica uma mensagem, mas nenhum subscriber está inscrito naquele momento. O que acontece com a mensagem?
Questão 10
Qual é o tamanho máximo de uma mensagem enviada diretamente através do SQS, sem usar nenhum mecanismo adicional?
Questão 11
Uma equipe quer garantir uma pequena janela de atraso antes que TODAS as mensagens de uma fila fiquem visíveis pela primeira vez, por exemplo para esperar outro sistema terminar de gravar dados relacionados. Qual recurso do SQS atende esse requisito?
Questão 12
Qual é o benefício principal de habilitar long polling numa fila SQS, em vez de usar o comportamento padrão (short polling)?
Questão 13
Uma fila SQS recebe eventos publicados automaticamente por um bucket S3 sempre que um novo objeto é criado. A equipe quer garantir que **apenas** esse bucket específico possa publicar nessa fila. Onde essa restrição deve ser configurada?
Questão 14
Uma função Lambda consome mensagens de uma fila SQS Standard via event source mapping. Uma mensagem específica falha repetidamente no processamento. Qual é o comportamento correto dessa mensagem, assumindo que não há DLQ configurada?
Questão 15
Qual é a diferença de comportamento entre a integração SQS → Lambda e SNS → Lambda?
Questão 16
Uma arquitetura precisa de um barramento de eventos com roteamento baseado em regras de conteúdo, integrando eventos de múltiplos serviços AWS e também de aplicações SaaS de terceiros, com necessidade de um schema registry para validar formatos de evento. Qual serviço é mais adequado, em vez de SNS puro?
Questão 17
Uma fila SQS FIFO usa o mesmo `MessageGroupId` para absolutamente todas as mensagens enviadas por diferentes clientes, buscando garantir ordenação global. Qual é a consequência prática dessa escolha?
Questão 18
Sobre a garantia "exactly-once" do SQS FIFO, qual afirmação está correta?
Questão 19
Uma aplicação precisa que uma fila SQS armazene mensagens de forma criptografada em repouso, atendendo a um requisito de segurança. Qual recurso viabiliza isso?
Questão 20
Uma arquitetura de e-commerce precisa: notificar simultaneamente três sistemas heterogêneos (faturamento via fila SQS, um serviço de e-mail via SMTP/HTTP, e um parceiro externo via endpoint HTTP) a partir de um único evento "pedido criado"; garantir que o sistema de faturamento nunca perca uma mensagem mesmo se ficar offline temporariamente; e capturar, para diagnóstico, qualquer mensagem que o faturamento falhe em processar repetidamente. Qual combinação de recursos atende a todos os requisitos simultaneamente?
Laboratório Prático
Objetivo: implementar o padrão fanout (SNS → múltiplas filas SQS) e observar o comportamento de reentrega causado por um visibility timeout mal dimensionado.
Pré-requisitos: conta AWS com permissão para SNS, SQS e IAM.
Tempo estimado: 25 minutos
Possíveis custos: praticamente nulo dentro do free tier para poucas mensagens de teste.
Passos:
- Crie um tópico SNS (ex:
pedido-criado). - Crie duas filas SQS (ex:
fila-faturamentoefila-notificacao) e inscreva ambas como subscribers do tópico SNS. - Publique uma mensagem de teste no tópico e confirme, no console, que ambas as filas receberam uma cópia independente da mesma mensagem.
- Em uma das filas, reduza o visibility timeout para um valor bem baixo (ex: 5 segundos).
- Simule um consumidor lento: receba a mensagem (
ReceiveMessage) e espere mais tempo que o visibility timeout antes de tentar deletá-la. - Observe que a mensagem volta a ficar visível na fila antes de você conseguir deletá-la — reproduzindo, na prática, o comportamento de reentrega por timeout mal dimensionado.
- Corrija aumentando o visibility timeout para um valor maior que o tempo de processamento simulado, e repita o teste confirmando que a reentrega não ocorre mais.
Resultado esperado: você observa na prática tanto o padrão fanout (uma publicação, múltiplas cópias independentes) quanto a causa mais comum de mensagens duplicadas no SQS Standard.
Limpeza dos recursos: delete as duas filas SQS e o tópico SNS criados.
Referências:
- Amazon SQS Developer Guide: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html
- Amazon SNS Developer Guide: https://docs.aws.amazon.com/sns/latest/dg/welcome.html
- SQS Visibility Timeout: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html
- SQS Dead-letter queues: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html
- SNS Fanout pattern: https://docs.aws.amazon.com/sns/latest/dg/sns-common-scenarios.html
- SQS Extended Client Library: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/s3-messages.html