Consumidores AWS SQS
O Amazon SQS oferece filas gerenciadas sem a necessidade de operar Redis. Workers Node.js utilizam o AWS SDK v3 com long polling, timeouts de visibilidade e filas de mensagens mortas (DLQ).
Busque em todas as páginas da documentação
O Amazon SQS oferece filas gerenciadas sem a necessidade de operar Redis. Workers Node.js utilizam o AWS SDK v3 com long polling, timeouts de visibilidade e filas de mensagens mortas (DLQ).
Cartão de receita de referência rápida - pronto para copiar e colar.
import {
SQSClient,
ReceiveMessageCommand,
DeleteMessageCommand,
} from "@aws-sdk/client-sqs";
const sqs = new SQSClient({});
const queueUrl = process.env.SQS_QUEUE_URL!;
const res = await sqs.send(
new ReceiveMessageCommand({
QueueUrl: queueUrl,
MaxNumberOfMessages: 10,
WaitTimeSeconds: 20,
VisibilityTimeout: 60,
})
);
for (const msg of res.Messages ?? []) {
await processBody(msg.Body!);
await sqs.send(
new DeleteMessageCommand({ QueueUrl: queueUrl, ReceiptHandle: msg.ReceiptHandle! })
);
}Quando usar isso:
// src/sqs/poll.ts
import {
SQSClient,
ReceiveMessageCommand,
DeleteMessageCommand,
ChangeMessageVisibilityCommand,
} from "@aws-sdk/client-sqs";
const sqs = new SQSClient({ region: process.env.AWS_REGION });
const queueUrl = process.env.SQS_QUEUE_URL!;
async function handleMessage(body: string) {
const payload = JSON.parse(body) as { type: string; orderId: string };
if (payload.type === "fulfill") {
await fulfillOrder(payload.orderId);
}
}
export async function pollForever(signal: AbortSignal) {
while (!signal.aborted) {
const res = await sqs.send(
new ReceiveMessageCommand({
QueueUrl: queueUrl,
MaxNumberOfMessages: 10,
WaitTimeSeconds: 20,
VisibilityTimeout: 120,
MessageAttributeNames: ["All"],
})
);
for (const msg of res.Messages ?? []) {
try {
await handleMessage(msg.Body ?? "{}");
await sqs.send(
new DeleteMessageCommand({
QueueUrl: queueUrl,
ReceiptHandle: msg.ReceiptHandle!,
})
);
} catch (err) {
console.error({ msg: "sqs_handler_error", messageId: msg.MessageId, err });
// A mensagem retorna para a fila após o timeout de visibilidade
}
}
}
}
// src/worker-main.ts
const ac = new AbortController();
process.on("SIGTERM", () => ac.abort());
await pollForever(ac.signal);O que isso demonstra:
WaitTimeSeconds: 20 reduz custo e uso de CPUvisibility_timeout >= p99_processing_time * 1.5
ChangeMessageVisibility para trabalhos de duração variável{
"RedrivePolicy": {
"deadLetterTargetArn": "arn:aws:sqs:...:dlq",
"maxReceiveCount": 5
}
}| Tipo | Ordenação | Throughput | Deduplicação |
|---|---|---|---|
| Standard | Melhor esforço | Muito alto | Idempotência em nível de aplicativo |
| FIFO | Por grupo de mensagens | 300 TPS/grupo | Deduplicação de conteúdo opcional |
MessageGroupId// O corpo da mensagem pode ser um JSON wrapper do SNS - desembrulhar o Envelope
const outer = JSON.parse(body);
const inner = outer.Message ? JSON.parse(outer.Message) : outer;maxReceiveCount + alarme DLQ.Message.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| BullMQ | Redis já em execução, API rica de jobs | Desejar infraestrutura de fila zero |
| Kinesis | Análise de streaming | Fila de tarefas simples |
| EventBridge | Regras de roteamento de eventos | Apenas fila de workers ponto a ponto |
| Google Pub/Sub | Pilha GCP | Organização apenas com AWS |
sqs-consumer encapsula o polling com eventos. Bom para workers ECS. Entenda a semântica de visibilidade de qualquer forma.
Escalone os consumidores pela métrica ApproximateNumberOfMessagesVisible. Evite loops apertados duplicados sem long polling.
Não. A fila padrão é "pelo menos uma vez". Projete handlers idempotentes.
Use o padrão de cliente estendido S3 - SQS carrega o ponteiro S3 quando >256KB.
sqs:ReceiveMessage, DeleteMessage, ChangeMessageVisibility apenas no ARN da fila.
LocalStack ou ElasticMQ para testes de integração. Docker ElasticMQ para laptop.
SendMessageCommand da API com corpo JSON pequeno. Mesmas regras de idempotência do produtor BullMQ.
Padrão de 4 dias. Aumente para 14 para janelas de repetição durante interrupções.
Batching e múltiplos IDs de grupo de mensagens escalam fluxos ordenados paralelos.
Contagem de requisições. Long polling reduz recebimentos vazios. Receba em lote até 10 mensagens.
Versões da Pilha: Esta página foi escrita para Node.js 24.18.0 (LTS Ativo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026