Introdução ao Amazon Simple Queue Service (SQS)
![Marcelo Amorim](https://cdn.hashnode.com/res/hashnode/image/upload/v1729350466582/d596116a-d766-4c6a-bfdb-abc438726371.jpeg?w=500&h=500&fit=crop&crop=entropy&auto=compress,format&format=webp)
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1736305005421/e9501ebf-4353-466d-a325-abf6d1bf7f9c.png)
O Amazon Simple Queue Service (SQS) é um serviço de filas de mensagens totalmente gerenciado que permite o desacoplamento e comunicação entre microsserviços, sistemas distribuídos e aplicativos sem servidor. O SQS facilita a troca de mensagens entre diferentes componentes de um sistema de forma assíncrona e confiável, ajudando a construir soluções altamente escaláveis e resilientes. Aqui é importante reforçar a ideia de tornar nossa solução mais resiliente e o caráter assíncrono da comunicação.
Principais Características do SQS
Gera menor acoplamento entre integrações: Permite que diferentes partes de um aplicativo se comuniquem sem depender da disponibilidade imediata uma da outra.
Escalabilidade Automática: é capaz de lidar com alto volume de mensagens, escalando automaticamente para atender às possíveis variações de carga, sem a necessidade de gerenciamento da sua infraestrutura.
Segurança: Oferece controle de acesso granular com o AWS Identity and Access Management (IAM) e criptografia em trânsito (TLS) e em repouso (AWS KMS).
Tipos de Filas: Suporta filas Standard (padrão) e FIFO (First-In-First-Out).
Integração com Serviços AWS: Integra-se facilmente com outros serviços AWS, como AWS Lambda, Amazon S3, Amazon EC2 e Amazon SNS.
Conceitos Fundamentais
a) Filas
Uma fila é um repositório temporário para mensagens que aguardam processamento. O SQS oferece dois tipos de filas:
- Filas Standard: Oferecem throughput ilimitado, entrega pelo menos uma vez e ordem de mensagens com melhor esforço.
Aqui já é interessante abrirmos um parênteses rápido para discutirmos alguns pontos. Vamos focar em duas características de filas padrão, a saber, (i) entrega pelo menos uma vez e (ii) ordem de mensagens com melhor esforço.
(i) entrega pelo menos uma vez (ver documentação em https://docs.aws.amazon.com/pt_br/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-queue-types.html). Nesse ponto, é de extrema importância lembrarmos dessa característica, já que esta aponta para a necessidade de sabermos lidar com a possível duplicação na entrega de mensagens via fila SQS padrão. Aqui surge um nome fundamental que é idempotência.
(ii) ordem de mensagens com melhor esforço.
Aqui também fica o lembrete que não podemos esquecer que na fila padrão não existe garantia de ordem exata, quem garante a ordem de processamento igual à ordem de envio é a fila FIFO (first in first out - em tradução livre seria algo como “primeira a chegar, primeira a sair”).
- Filas FIFO: Garantem que as mensagens sejam processadas exatamente uma vez e na ordem em que foram enviadas. Ideal para aplicações que exigem processamento ordenado.
b) Mensagens
Uma mensagem é a unidade de dados enviada para a fila (em outras palavras, o que enviamos). Pode conter até 256 KiB de dados em texto sem formatação ou JSON. As mensagens permanecem na fila até serem consumidas ou expirarem. Podemos consultar os limites de uma mensagem no link seguinte https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/quotas-messages.html:
c) Consumidores
Consumidores são aplicativos ou serviços que recebem e processam mensagens da fila. Eles podem ser executados em qualquer plataforma e linguagem que suporte chamadas à API do SQS.
d) Visibilidade da Mensagem
O Tempo de Visibilidade é o período após um consumidor receber uma mensagem durante o qual essa mensagem fica invisível para outros consumidores. Se o processamento falhar, a mensagem torna-se visível novamente após esse período. Podemos visualizar essa propriedade como uma pausa entre as tentativas de entregar a mensagem. Isso vai de acordo com a proposta de oferecer maior resiliência, já que retentivas com maior espaçamento temporal podem ser interessantes em diversas situações.
Primeiros Passos com o Amazon SQS
Pré-requisitos
- Acesso ao Console de Gerenciamento da AWS.
Passo 1: Criar uma Fila
Usando o Console AWS
Acessar o Console de Gerenciamento da AWS.
Buscar pelo SQS.
Na página do Amazon SQS, clique em Criar fila.
Em Nome da fila, insira um nome para a sua fila, por exemplo, MyTestQueue.
Escolha o tipo de fila:
Standard: Para throughput alto e ordem de mensagens melhor esforço.
FIFO: Para ordem estrita e processamento exatamente uma vez. Os nomes de filas FIFO devem terminar com .fifo.
Para este exemplo, selecione Standard.
Opcionalmente, escolha algumas das Configurações de fila padrão ou Avançadas, como tempo de visibilidade, tempo de retenção de mensagens, tamanho máximo de mensagem e políticas de acesso.
Clique em Criar fila e deve aparecer o seguinte resultado.
Passo 2: Enviar Mensagens para a Fila
Na lista de filas, clique no nome da fila que você criou (MyTestQueue).
Clique na guia Enviar e receber mensagens.
Em Enviar uma mensagem, insira o conteúdo da mensagem no campo Mensagem.
- Você pode inserir texto simples ou JSON.
Opcionalmente, configure atributos de mensagem ou atraso de envio.
Clique em Enviar mensagem.
→ Nesse tutorial, vamos continuar o que começamos a desenvolver no texto da nossa função Lambda. O texto pode ser visto no seguinte link: https://marceloamorim.hashnode.dev/introduction-to-aws-lambda.
- Inicialmente, vamos alterar o código existente na função Lambda para:
python import json import os import boto3 from botocore.exceptions import ClientError
Initialize SQS client
sqs_client = boto3.client('sqs')
def lambda_handler(event, context):
Retrieve the queue URL from environment variables
queue_url = os.getenv('SQS_QUEUE_URL')
Hardcoded message
message = "Testing lambda function integration with SQS"
Log the event for debugging
print(f"Event received: {json.dumps(event)}") print(f"Sending message to queue: {queue_url}")
try:
Send the message to the SQS queue
response = sqs_client.send_message( QueueUrl=queue_url, MessageBody=message ) print(f"Message sent successfully: {response['MessageId']}")
return { 'statusCode': 200, 'body': json.dumps({ 'message': message, 'sqsMessageId': response['MessageId'] }) } except ClientError as e: print(f"Error sending message to SQS: {e}") return { 'statusCode': 500, 'body': json.dumps({ 'error': str(e) }) }
Lembre-se de adicionar a variável de ambiente SQS_QUEUE_URL com a url da sua fila.
Para que tudo funcione normalmente, devemos associar uma IAM Role a essa função que a permite publicar mensagens na fila:
→ Ao final, receberemos esse resultado e isso indicará que a mensagem está na nossa fila:
Passo 3: Receber e Excluir Mensagens
→ Após a publicação de mensagem na fila, temos uma mensagem disponível:
Ainda na guia Enviar e receber mensagens, role até a seção Receber mensagens.
Clique em Iniciar polling (poll for messages) para que o console comece a pesquisar mensagens na fila.
As mensagens disponíveis serão listadas abaixo. Você pode visualizar o conteúdo clicando na mensagem.
Para simular o processamento, selecione uma mensagem e clique em Excluir para removê-la da fila após o processamento.
Confirme a exclusão quando solicitado.
Passo 4: Configurar um Consumidor
Para aplicativos reais, você configuraria um consumidor para processar mensagens programaticamente.
Exemplo usando AWS Lambda
Navegue até o serviço AWS Lambda no console.
Crie uma nova função Lambda com a linguagem de sua preferência (por exemplo, Python).
No Designer, clique em Adicionar gatilho.
Selecione SQS como a fonte do gatilho.
Selecione a fila MyTestQueue.
Clique em Adicionar.
Na função Lambda, escreva o código para processar as mensagens recebidas.
Exemplo de código em Python:
python import json
def lambda_handler(event, context): for record in event['Records']: mensagem = record['body'] print(f"Processando mensagem: {mensagem}") return 'Sucesso'
→ Logo temos nossa função:
→ A qual receberá nesse modelo:
→ Buscando os logs no CloudWatch, verificamos que a mensagem foi recebida com sucesso:
→ Recapitulando, onde estamos?
Inicialmente criamos uma função Lambda que publica uma mensagem na nossa fila e essa mensagem é recebida por outra função Lambda.
→ Para onde vamos?
Adicionaremos um tópico SNS antes da fila e trabalharemos com o conceito de fan-out (espalhamento):
Mais conceitos
a) Configurações Avançadas de Fila
Tempo de Retenção de Mensagem: Período que a mensagem permanece na fila se não for processada (1 minuto a 14 dias).
Tempo de Visibilidade: Tempo em que a mensagem fica invisível após ser recebida por um consumidor (0 a 12 horas).
Entrega de Mensagens com Atraso: Permite atrasar a disponibilidade de novas mensagens na fila (0 a 15 minutos).
b) Dead-Letter Queues (DLQ)
- Filas de Mensagens Mortas: São filas destinadas a armazenar mensagens que não puderam ser processadas com sucesso após um número definido de tentativas. Isso ajuda a isolar e analisar mensagens com erro.
c) Controle de Acesso e Segurança
Use políticas do IAM para controlar quem pode interagir com suas filas.
Habilite criptografia em repouso integrando o SQS com o AWS KMS para proteger o conteúdo das mensagens. Lembrando que o KMS em si não é o agente que criptografa e descriptografar a mensagem, ele apenas faz o gerenciamento das chaves de criptografia. Para mais informações, ver https://docs.aws.amazon.com/pt_br/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html
Considerações Finais
O Amazon SQS é uma ferramenta poderosa para construir sistemas distribuídos e escaláveis. Compreender os conceitos de filas, mensagens, consumidores e os contextos arquiteturais em que o SQS se encaixa é fundamental para aproveitar ao máximo suas capacidades. Usando o Console de Gerenciamento da AWS, você pode configurar rapidamente filas e começar a desenvolver aplicações mais resilientes e desacopladas. Espero que esse texto tenha ajudado no aprendizado e até o próximo! :)
Recursos Adicionais
Subscribe to my newsletter
Read articles from Marcelo Amorim directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
![Marcelo Amorim](https://cdn.hashnode.com/res/hashnode/image/upload/v1729350466582/d596116a-d766-4c6a-bfdb-abc438726371.jpeg?w=500&h=500&fit=crop&crop=entropy&auto=compress,format&format=webp)
Marcelo Amorim
Marcelo Amorim
Senior Software Engineer - Java, Spring and AWS