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

Marcelo AmorimMarcelo Amorim
9 min read

O Amazon Simple Queue Service (SQS) é um serviço de filas de mensagens totalmente gerenciado que permite o desacoplamento e escalonamento de 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 aplicações altamente escaláveis e resilientes.

Principais Características do Amazon SQS

  • Desacoplamento de Sistemas: Permite que diferentes partes de um aplicativo se comuniquem sem depender da disponibilidade imediata uma da outra.

  • Escalabilidade Automática: Projetado para lidar com qualquer volume de mensagens, escalando automaticamente para atender às demandas de tráfego.

  • 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) para atender a diferentes requisitos de aplicação.

  • 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 melhor esforço.

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

Primeiros Passos com o Amazon SQS

Pré-requisitos

  • Acesso ao Console de Gerenciamento da AWS.

  • Conhecimento básico de navegação na web.

Passo 1: Criar uma Fila

Usando o Console AWS

  1. Faça login no Console de Gerenciamento da AWS.

  2. No topo da página, utilize a barra de pesquisa para encontrar SQS e selecione Simple Queue Service nos resultados.

  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, minha-fila-exemplo.

  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, configure as 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 (minha-fila-exemplo).

  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.

  6. Repita o processo para enviar mais mensagens, se desejar.

→ Nesse tutorial, vamos continuar o que começamos a desenvolver no texto da nossa função Lambda.

  • Inicialmente, vamos alterar o código existente na função Lambda para:

      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 minha-fila-exemplo.

  6. Configure as opções de batch, se necessário, e clique em Adicionar.

  7. Na função Lambda, escreva o código para processar as mensagens recebidas.

Exemplo de código em 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):

Conceitos Adicionais

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 problemáticas.

c) Controle de Acesso e Segurança

  • Use políticas do IAM para controlar quem pode interagir com suas filas.

  • Habilite criptografia em repouso com o AWS KMS para proteger o conteúdo das mensagens.

  • Utilize VPC endpoints com o AWS PrivateLink para acessar o SQS de forma segura dentro da sua VPC.

Contextos Arquiteturais Importantes para o Amazon SQS

O Amazon SQS é uma ferramenta fundamental em diversos padrões arquiteturais para construir sistemas distribuídos, escaláveis e resilientes. A seguir, destacamos alguns dos contextos arquiteturais mais importantes em que o SQS desempenha um papel essencial:

a) Desacoplamento de Sistemas

O SQS permite que diferentes componentes de um sistema se comuniquem de forma assíncrona, desacoplando produtores e consumidores de mensagens. Isso aumenta a flexibilidade e escalabilidade dos sistemas.

Exemplo de Uso:

  • Um aplicativo web recebe solicitações do usuário e coloca tarefas em uma fila SQS para processamento posterior por um serviço de back-end, evitando bloquear o usuário enquanto a tarefa é processada.

b) Balanceamento de Carga e Escalonamento

Com o SQS, você pode balancear a carga entre diferentes consumidores e escalar horizontalmente o processamento de mensagens adicionando mais consumidores conforme necessário.

Exemplo de Uso:

  • Um sistema de processamento de imagens coloca tarefas na fila. Múltiplas instâncias de processamento consomem mensagens da fila, permitindo escalonamento automático baseado no volume de mensagens.

c) Tolerância a Falhas e Resiliência

O SQS ajuda a construir sistemas mais resilientes, permitindo que mensagens sejam armazenadas com segurança até serem processadas, mesmo que partes do sistema estejam temporariamente indisponíveis.

Exemplo de Uso:

  • Se um serviço downstream estiver indisponível, as mensagens permanecem na fila até que o serviço esteja operacional novamente, evitando perda de dados.

d) Processamento Assíncrono e Bufferização

O SQS atua como um buffer entre produtores e consumidores, suavizando picos de carga e garantindo que os sistemas possam lidar com variações no tráfego.

Exemplo de Uso:

  • Durante eventos de alto tráfego, como promoções ou vendas relâmpago, as solicitações dos usuários são colocadas em uma fila e processadas sequencialmente para evitar sobrecarregar os sistemas de back-end.

e) Integração com Serviços AWS

O SQS integra-se facilmente com outros serviços AWS, permitindo orquestrar fluxos de trabalho complexos.

Exemplo de Uso:

  • Um evento no Amazon S3 (como upload de um arquivo) dispara uma função Lambda que coloca uma mensagem na fila SQS para processamento posterior por instâncias EC2.

f) Implementação de Padrões de Design Message-Driven

O SQS é fundamental para a implementação de arquiteturas orientadas a mensagens, onde a comunicação é baseada em troca de mensagens entre componentes independentes.

Exemplo de Uso:

  • Microserviços comunicam-se através de mensagens na fila SQS, permitindo escalabilidade independente e reduzindo o acoplamento.

g) Prioridade e Ordenação de Mensagens

Com filas FIFO e suporte a grupos de mensagens, o SQS permite manter a ordem e prioridade no processamento de mensagens.

Exemplo de Uso:

  • Um sistema financeiro que requer processamento na ordem exata das transações utiliza filas FIFO para garantir consistência.

h) Processamento Batch

O SQS permite que os consumidores processem mensagens em lotes, melhorando a eficiência e reduzindo chamadas de API.

Exemplo de Uso:

  • Um serviço consome mensagens em lotes de 10 para inserir registros em um banco de dados de forma mais eficiente.

i) Dead-Letter Queues para Tratamento de Erros

O uso de Dead-Letter Queues (DLQ) permite isolar e analisar mensagens que não puderam ser processadas após várias tentativas, melhorando a manutenibilidade do sistema.

Exemplo de Uso:

  • Mensagens que falharam no processamento são movidas para uma DLQ, onde podem ser revisadas e reprocessadas manualmente ou analisadas para identificar problemas no sistema.

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.

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