Introdução ao Amazon Simple Queue Service (SQS)

Marcelo AmorimMarcelo Amorim
7 min read

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

  1. Acessar o Console de Gerenciamento da AWS.

  2. Buscar pelo SQS.

  3. Na página do Amazon SQS, clique em Criar fila.

  4. Em Nome da fila, insira um nome para a sua fila, por exemplo, MyTestQueue.

  5. 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.

  6. Para este exemplo, selecione Standard.

  7. 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.

  8. Clique em Criar fila e deve aparecer o seguinte resultado.

Passo 2: Enviar Mensagens para a Fila

  1. Na lista de filas, clique no nome da fila que você criou (MyTestQueue).

  2. Clique na guia Enviar e receber mensagens.

  3. Em Enviar uma mensagem, insira o conteúdo da mensagem no campo Mensagem.

    • Você pode inserir texto simples ou JSON.
  4. Opcionalmente, configure atributos de mensagem ou atraso de envio.

  5. 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:

  1. Ainda na guia Enviar e receber mensagens, role até a seção Receber mensagens.

  2. Clique em Iniciar polling (poll for messages) para que o console comece a pesquisar mensagens na fila.

  3. As mensagens disponíveis serão listadas abaixo. Você pode visualizar o conteúdo clicando na mensagem.

  4. Para simular o processamento, selecione uma mensagem e clique em Excluir para removê-la da fila após o processamento.

  5. 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

  1. Navegue até o serviço AWS Lambda no console.

  2. Crie uma nova função Lambda com a linguagem de sua preferência (por exemplo, Python).

  3. No Designer, clique em Adicionar gatilho.

  4. Selecione SQS como a fonte do gatilho.

  5. Selecione a fila MyTestQueue.

  6. Clique em Adicionar.

  7. 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

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

  • Documentação do Amazon SQS: Link

  • Tutoriais do Amazon SQS: Link

  • AWS CLI Command Reference for SQS: Link

  • Integração do SQS com AWS Lambda: Link

  • Práticas Recomendadas de Segurança para SQS: Link

0
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
Marcelo Amorim

Senior Software Engineer - Java, Spring and AWS