O blog da AWS

Otimizando o processamento de mensagens com o Amazon SQS e o Amazon SNS

Esse blog foi escrito por Daniel Abib, arquiteto de soluções sênior da AWS.

No mundo das arquiteturas digitais e do desenvolvimento nativo em nuvem, otimizar seu fluxo de trabalho de processamento de mensagens pode melhorar significativamente o desempenho e a confiabilidade de seus aplicativos. No entanto, sem estratégias adequadas, o custo de integrar serviços de aplicativos usando serviços de mensagens pode se tornar excessivo. Este blog se aprofunda nas melhores práticas e estratégias para otimizar seu processamento de mensagens com o Amazon SQS e o Amazon SNS, garantindo que você aproveite ao máximo essas ferramentas poderosas.

Entendendo o Amazon SQS e o Amazon SNS

O Amazon SQS é um serviço de fila de mensagens totalmente gerenciado que ajuda a desacoplar e escalar microsserviços e sistemas distribuídos usando serviços Serverless nativos da nuvem da AWS. Ele garante armazenamento, envio e recebimento confiáveis de mensagens, mesmo se os componentes do aplicativo não estiverem disponíveis.

O Amazon SNS é um serviço de mensagens de publicação/assinatura totalmente gerenciado que facilita a dissociação e a escalabilidade de microsserviços ou processos de negócios. O Amazon SNS permite que você envie mensagens para vários assinantes, incluindo filas do Amazon SQS, funções do AWS Lambda, mensagens de texto móveis – SMS, notificações push móveis e endpoints HTTP/S.

Modelos de cobrança e preços

Ambos os serviços são Serverless, oferecendo os benefícios de não gerenciar, atualizar ou escalar servidores. As cobranças do Amazon SQS são baseadas no número de solicitações. Você paga somente por cada solicitação de API (SendMessage, ReceiveMessage, DeleteMessage, etc.) feita ao Amazon SQS. O Amazon SQS fornece um nível gratuito que inclui 1 milhão de solicitações por mês para cada cliente, tornando-o acessível para aplicativos de pequena escala ou fases iniciais de testes.

Os preços do Amazon SNS são baseados no número de solicitações e no tipo de endpoint que recebe as mensagens. Você paga por cada solicitação de publicação, cada tentativa de entrega de notificação e cada assinatura. O custo varia dependendo se você está enviando mensagens para endpoints HTTP/S, endereços de e-mail, filas do Amazon SQS ou funções do AWS Lambda. Assim como o Amazon SQS, o Amazon SNS também oferece um nível gratuito com 1 milhão de solicitações por mês, facilitando o uso inicial e os testes econômicos.

Aproveitando o AWS Well-Architected Framework para otimização de custos

A AWS fornece o Well-Architected Framework para ajudar os clientes a criarem uma infraestrutura segura, de alto desempenho, resiliente e eficiente para seus aplicativos. Um dos principais pilares dessa estrutura é a otimização de custos, que envolve estratégias para evitar custos desnecessários e garantir que você esteja usando os serviços da AWS com eficiência.

A AWS apoia os clientes na adoção da estrutura Well-Architected por meio de vários recursos, incluindo a ferramenta AWS Well-Architected, que oferece uma análise de suas cargas de trabalho com base nas melhores práticas. Essa ferramenta ajuda a identificar áreas em que você pode otimizar os custos, recomendando mudanças como o dimensionamento correto dos recursos, o uso de modelos de preços apropriados e a otimização da transferência de dados.

Se você não estiver familiarizado com o AWS Well-Architected Framework, aqui está o link para nossa documentação: AWS Well-Architected Framework.

Principais estratégias de otimização

Nos tópicos a seguir, analisaremos várias recomendações para otimizar seu processamento de mensagens com o Amazon SQS e o Amazon SNS. Isso envolve a implementação de estratégias importantes para melhorar o desempenho e reduzir custos.

Ao configurar as filas adequadamente, utilizar os métodos corretos de desduplicação e monitorar o desempenho do sistema de forma eficaz, você pode garantir que seu aplicativo opere de forma eficiente e confiável. O aproveitamento dessas técnicas de otimização não apenas melhora a produtividade e a escalabilidade, mas também minimiza as despesas, evitando o uso excessivo de recursos e gerenciando as variações de carga de forma dinâmica.

Exploraremos estratégias específicas de otimização, como escolher o tipo certo de fila, pooling eficiente, filtragem de mensagens e integração de fluxos de trabalho escaláveis. Cada estratégia foi projetada para abordar diferentes aspectos do processamento de mensagens, fornecendo uma abordagem abrangente para otimizar seu uso do Amazon SQS e do Amazon SNS.

Recomendações para o Amazon SQS

A otimização do tamanho do lote de mensagens pode reduzir significativamente os custos

O Amazon SQS permite que você envie, receba ou exclua mensagens em lotes de até 10 mensagens ou 256 KB. O agrupamento de mensagens em lote pode reduzir o número de chamadas de API e melhorar a taxa de transferência. No entanto, o processamento em lotes pode apresentar desafios, pois o Amazon SQS tem um limite para que cada tamanho de mensagem seja inferior a 256 KB, e qualquer coisa além disso gera uma exceção. Se o tamanho da mensagem exceder 64 KB, cada bloco de 64 KB será tratado como uma mensagem separada para cobrança.

Para lidar com cargas grandes que excedam o limite de tamanho de mensagem do Amazon SQS, considere transferir essas cargas para o Amazon S3. Ao armazenar grandes mensagens no Amazon S3, você pode enviar uma referência ao objeto Amazon S3 em sua mensagem do Amazon SQS, mantendo assim suas mensagens do Amazon SQS leves e dentro das restrições de tamanho. Essa abordagem não apenas contorna o limite de tamanho de mensagem de 256 KB, mas também reduz o número de partes que o Amazon SQS precisa processar, resultando em economia de custos. Além disso, transferir grandes cargas para o Amazon S3 pode melhorar a taxa de transferência de mensagens e reduzir a latência introduzida pelo agrupamento de mensagens grandes em lote, garantindo que seu processamento de mensagens permaneça eficiente e escalável.

Existem bibliotecas para ajudar os desenvolvedores de Java e Python a usar a estratégia de descarga do Amazon S3, e você pode encontrar a documentação apropriada aqui: Gerenciando mensagens grandes com o Amazon SQS.

Uma estratégia eficaz para reduzir custos quando o AWS Lambda consome mensagens em lote do Amazon SNS é usar uma fila intermediária do Amazon SQS. Ao rotear mensagens do Amazon SNS para uma fila do Amazon SQS antes que elas cheguem ao Lambda, você pode agrupar várias mensagens em lote. Isso permite que o AWS Lambda processe várias mensagens em uma única invocação, reduzindo o número total de invocações. Menos invocações se traduzem diretamente em economia de custos, já que a AWS cobra por cada invocação do Lambda. Além disso, configurar o Lambda para pesquisar a fila do Amazon SQS e processar mensagens em lotes maiores pode otimizar ainda mais os custos, equilibrando a compensação entre a latência de processamento e o número de invocações.

A sondagem longa (“long pooling”) é provavelmente seu melhor amigo em quase todos os cenários de negócios, se o processamento em real-time não for um requisito.

Como você paga por cada solicitação de API para as filas do Amazon SQS, use a estratégia de sondagem longa, talvez seja uma abordagem econômica para recuperar mensagens da sua fila, pois reduz o número de solicitações de recebimento vazias em comparação com a sondagem curta e, portanto, reduz os custos. Defina o parâmetro ReceiveMessageWaitTimeSeconds para ativar a sondagem longa. Ao aumentar esse parâmetro, você pode diminuir a frequência de respostas vazias e melhorar a eficiência do seu processo de recuperação de mensagens, resultando em economia de custos.

Embora a sondagem curta ofereça respostas instantâneas, tornando-a ideal para aplicativos que precisam de feedback rápido ou processamento quase em tempo real, a sondagem longa é mais adequada para cenários em que a eficiência é mais importante do que o feedback imediato. Ao reduzir o número de chamadas de API e minimizar o tráfego de rede, a sondagem longa melhora a utilização de recursos e pode resultar em economias de custo significativas.

Excluindo mensagens: responsabilidade do consumidor

Embora seja um conhecimento fundamental, é crucial garantir explicitamente que os consumidores excluam as mensagens após o processamento para evitar custos adicionais de armazenamento.

As mensagens que não forem excluídas serão devolvidas à fila e processadas novamente, resultando em processamento redundante e aumento de custos. Portanto, é essencial que os consumidores lidem com a exclusão de mensagens de forma explicita para manter a economia e evitar reprocessamento desnecessário. Certifique-se de que seu aplicativo consumidor/cliente exclua com êxito a mensagem após o processamento bem-sucedido.

Escolher o tipo certo de fila é crucial para a otimização de custos

O Amazon SQS oferece dois tipos de filas: Standard (padrão) e FIFO (First-In-First-Out). As filas padrão oferecem produtividade máxima, pedidos com o melhor esforço e entrega pelo menos uma vez. As filas FIFO garantem que as mensagens sejam processadas exatamente uma vez, na ordem exata em que foram enviadas. As filas FIFO tem maiores custos do que as filas padrão, portanto, se seu aplicativo puder tolerar duplicatas ocasionais, opte por filas padrão para cortar custos.

Para obter mais informações sobre preços, visite a página de preços do Amazon SQS e considere usar o Amazon SQS Standard sempre que possível para reduzir custos.

Buscando constantemente mensagens invisíveis – use filas DLQs

Quando uma aplicação de processamento de mensagens não consegue exclui-la de uma fila do Amazon SQS, a mensagem reaparece após o término do período de tempo limite de visibilidade. Isso pode fazer com que a mensagem seja continuamente recuperada e processada, levando a ineficiências e possíveis erros.

As filas de mensagens mortas (DLQ) são essenciais para lidar com mensagens que não podem ser processadas com sucesso após várias tentativas. Ao rotear mensagens inconsistentes para uma DLQ, você evita que essas mensagens consumam recursos repetidamente em sua fila principal. Isso garante que somente mensagens válidas ocupem a fila principal, reduzindo o número de tentativas de processamento desnecessárias e os custos associados.

A recomendação geral é configurar alarmes para notificá-lo sobre padrões incomuns ou altas taxas de falha ao processar mensagens nas filas do Amazon SQS. A análise dessas métricas pode ajudá-lo a identificar as principais causas das falhas e fazer ajustes informados nas configurações da fila, no tempo limite de visibilidade e nas estratégias de repetição.

Filtragem de eventos com o AWS Lambda

Embora não seja diretamente uma recomendação do Amazon SQS, o AWS Lambda oferece suporte à filtragem de eventos como parte do processo de invocação. Ao aproveitar essa estratégia, os clientes podem reduzir o número de solicitações posteriores, garantindo que somente eventos relevantes acionem as funções do Lambda. Isso não apenas otimiza o uso de recursos, mas também ajuda a reduzir os custos gerais de processamento.

Recomendações para o Amazon SNS

Tópicos do Amazon SNS: governança de assinantes

Analise e gerencie regularmente seus assinantes para garantir que somente os endpoints necessários estejam ativos, o que reduz as notificações desnecessárias e os custos associados. Isso envolve a auditoria periódica de sua lista de assinantes para identificar e remover endpoints que não estão mais em uso ou que não contribuem para nenhum resultado comercial ou operacional.

Ao fazer isso, você pode evitar o envio de mensagens para aplicativos ou canais inativos, garantindo que sua estratégia de mensagens seja econômica e eficiente. Além disso, a implementação de ferramentas automatizadas para gerenciamento de assinantes pode agilizar esse processo, fornecendo otimização contínua e reduzindo ainda mais os custos.

Gerenciando assinaturas de aplicativos móveis

Para manter um sistema de notificação eficiente e reduzir custos, é fundamental cancelar a assinatura de aplicativos móveis que optam por não receber notificações push. Essa prática ajuda a evitar mensagens não entregues e garante que seus esforços de notificação sejam direcionados somente a usuários ativos e engajados.

Práticas recomendadas para gerenciar assinaturas de aplicativos móveis:

  • Auditorias regulares: realize auditorias regulares de suas listas de assinantes para identificar e remover usuários que optaram por não receber notificações push.
  • Cancelamento automático de assinatura: implemente processos automatizados para cancelar a inscrição de usuários que optam por não participar, garantindo que seu sistema permaneça atualizado sem intervenção manual.
  • Monitore relatórios de entrega: use relatórios de entrega para rastrear mensagens não entregues e cancelar imediatamente a assinatura de endpoints inativos ou inacessíveis.
  • Feedback do usuário: forneça aos usuários opções fáceis para gerenciar suas preferências de notificação e respeite suas escolhas imediatamente para manter a confiança e o engajamento.

Filtragem de mensagens

A filtragem e a otimização de mensagens são fundamentais para reduzir o tempo e os custos de processamento. Use os atributos de mensagem do Amazon SNS para filtrar mensagens com base em seu conteúdo ou cabeçalho. Isso garante que somente mensagens relevantes sejam entregues a cada assinante.

Os filtros podem ser usados para agrupar mensagens por tipo, prioridade ou fonte, permitindo um processamento mais direcionado. Projete sua arquitetura de mensagens para incluir filtragem baseada em conteúdo, na qual as mensagens são encaminhadas para diferentes filas ou assinantes com base em seu conteúdo. Isso pode ajudar a otimizar o fluxo geral de mensagens e reduzir o processamento desnecessário.

Recentemente, a AWS lançou a capacidade de filtrar mensagens do Amazon SNS por conteúdo dentro da carga útil. Você pode encontrar mais detalhes sobre esse recurso no blog da AWS.

Garantindo o processamento exclusivo de mensagens nas filas FIFO

Nada reduz melhor os custos do que evitar a duplicação. Garantir o processamento exclusivo de mensagens nas filas FIFO é vital para evitar mensagens duplicadas, que podem causar inconsistências de dados, interromper o comportamento do aplicativo e aumentar os custos. O ID de desduplicação de mensagens serve como um token exclusivo para identificar mensagens. Se uma mensagem com uma ID de desduplicação específica for enviada com sucesso, todas as mensagens subsequentes com a mesma ID enviadas dentro de uma janela de 5 minutos serão confirmadas, mas não entregues.

Forneça IDs de desduplicação exclusivos quando:

  • Envio de mensagens com conteúdo idêntico que deve ser exclusivo
  • Enviar mensagens com o mesmo conteúdo, mas com atributos diferentes que devem ser exclusivos
  • Envio de mensagens com conteúdo variado (por exemplo, contagens de repetições) que devem ser duplicadas

Para sistemas de produtor/consumidor único, habilite a desduplicação baseada em conteúdo se cada mensagem tiver um corpo (conteúdo) exclusivo. As IDs de desduplicação fornecidas manualmente substituirão as IDs baseadas em conteúdo se ambas forem usadas. Embora não seja obrigatório, é recomendável fornecer um ID de tentativa de solicitação de recebimento para cada solicitação para sequências mais rápidas de tentativas de falha. A repetição de solicitações não afeta a ordenação das mensagens da fila FIFO.

Projete seu aplicativo para lidar com interrupções de forma eficaz. Os produtores devem estar cientes da janela de desduplicação de 5 minutos para evitar duplicações ao tentar novamente as mensagens após a restauração da conectividade. Os consumidores devem usar os tempos limite de visibilidade para evitar várias instâncias de processamento. Configure uma fila de mensagens mortas para gerenciar mensagens que não podem ser processadas dentro do tempo limite de visibilidade.

Otimize os protocolos de entrega

Escolha os protocolos de entrega mais econômicos com base em seu caso de uso específico para reduzir custos. Por exemplo, use HTTP/HTTPS para enviar mensagens para aplicativos ou serviços da Web, pois esses protocolos geralmente são mais econômicos em comparação ao SMS, que gera cobranças mais altas por mensagem.

Além disso, considere usar notificações push por e-mail ou celular para notificações de usuários, pois elas também podem ser mais econômicas. Ao selecionar e otimizar cuidadosamente os protocolos de entrega, você pode garantir que suas mensagens sejam entregues de forma eficaz e, ao mesmo tempo, minimizar os custos.

Recomendações para Amazon SQS e Amazon SNS

Você não paga pelo número de filas do Amazon SQS ou tópicos do Amazon SNS.

A combinação de diferentes tipos de mensagens em uma única fila pode levar a atrasos no processamento, maior complexidade e desafios no gerenciamento e na escalabilidade do sistema. Para aumentar a eficiência, considere usar filas separadas para prioridades ou tipos de mensagens distintos.

Ao segregar as mensagens em várias filas, você pode alocar os recursos apropriados, priorizar o processamento de forma eficaz e otimizar a taxa de transferência do sistema com base nas características e requisitos específicos de cada tipo de mensagem. Essa estratégia permite um controle mais preciso sobre o fluxo de trabalho de processamento, garantindo que seu aplicativo funcione sem problemas e com eficiência.

Monitore e realize ações

O monitoramento e a escalabilidade são essenciais para manter o desempenho e gerenciar custos de forma eficaz ao usar o Amazon SQS e o Amazon SNS. Ao implementar práticas estratégicas de monitoramento e escalonamento, você pode otimizar o uso de recursos e reduzir despesas desnecessárias.

Utilize o Amazon CloudWatch: monitore suas filas do Amazon SQS e do Amazon SNS com o Amazon CloudWatch para obter informações sobre métricas importantes, como tamanho da fila, número de mensagens enviadas/recebidas/excluídas e idade das mensagens. A revisão regular dessas métricas ajuda você a entender o desempenho e a utilização do seu sistema de mensagens.

Configurar alarmes: configure os alarmes do Amazon CloudWatch para notificá-lo quando limites específicos forem violados. Por exemplo, defina alarmes para filas altas ou para a idade da mensagem. Essa abordagem proativa permite que você resolva possíveis problemas antes que eles aumentem, garantindo uma operação tranquila e evitando custos inesperados devido a gargalos do sistema.

Implemente políticas de escalonamento automático: desenvolva políticas de escalonamento automático para seus aplicativos de consumo para gerenciar cargas variáveis com eficiência. O AWS Lambda, em particular, pode escalar automaticamente com base no número de mensagens na fila. Esse escalonamento dinâmico garante que seu aplicativo possa lidar com picos de carga sem provisionar recursos em excesso durante períodos de baixa demanda, economizando custos.

Ao acompanhar de perto seus gastos, você pode identificar áreas em que mais otimizações podem ser feitas e também pode manter o alto desempenho e a confiabilidade de seus aplicativos e, ao mesmo tempo, gerenciar e reduzir custos de forma eficaz. O monitoramento proativo, combinado com políticas de escalabilidade inteligentes, garante que você use somente os recursos necessários, otimizando assim suas despesas gerais com a AWS.

Padrões de arquitetura para otimização de custos

Otimizar sua arquitetura para eficiência de custos envolve o uso de serviços da AWS, como AWS Lambda, AWS Step Functions e outros, para implementar padrões robustos. Aqui estão alguns padrões-chave a serem considerados:

  • Otimizar sua arquitetura para eficiência de custos envolve o uso de serviços da AWS, como Lambda, Step Functions e outros, para implementar padrões robustos. O padrão Circuit Breaker é uma abordagem arquitetônica projetada para lidar com cenários de falha com elegância, evitando falhas em cascata e reduzindo o impacto geral no desempenho e no custo do sistema. Esse padrão é particularmente útil em sistemas distribuídos em que as chamadas de serviço remoto podem falhar devido a vários motivos, como problemas de rede, tempo de inatividade do serviço ou picos de carga inesperados. Ele pode ser implementado usando o AWS Lambda e o Step Functions para lidar com cenários de falha sem problemas, evitando custos adicionais e dando tempo para a recuperação. Saiba mais
  • O exponencial backoff é outro padrão importante. Implemente o atraso exponencial para repetir a lógica em seus aplicativos. Os SDKs da AWS fornecem suporte integrado para atrasos exponenciais, o que pode reduzir custos evitando ciclos rápidos de repetição e sobrecarregando seus serviços. Use o AWS Lambda para lidar com novas tentativas com atraso exponencial ao processar mensagens do Amazon SQS. Isso ajuda a distribuir as tentativas de repetição, reduzir a carga no sistema e gerenciar os custos de forma eficaz. Se você precisar de uma arquitetura de referência ou implementação de como usar o exponential backoff, dê uma olhada no repositório público do AWS GitHub.
  • Throtelling e limitação de taxa (rate limits): Se seu aplicativo estiver usando o Amazon SQS ou o Amazon SNS para interagir com o contexto de domínio externo ou até mesmo com o aplicativo externo, você poderá usar o Amazon API Gateway e/ou o AWS Lambda para controlar as taxas de solicitação de API e evitar o acesso aos serviços de mensagens se seu aplicativo downstream não estiver suportando a demanda. O Step Functions também pode gerenciar fluxos de trabalho complexos com tratamento de erros, novas tentativas e aceleração incorporados. Leia mais
  • Fluxos de trabalho escaláveis: use o padrão fan-out publicando mensagens em várias filas do SQS, filtrando ou alterando os dados da carga útil para evitar custos de processamento de mensagens. Essa abordagem garante que cada serviço receba os dados necessários sem tratamento redundante, reduzindo as chamadas de API e o tempo de processamento, aumentando a resiliência e a escalabilidade. Saiba mais sobre a filtragem do Amazon SNS e os padrões ServerlessLand gerenciados pela equipe do AWS Developer Advocate.

Conclusão

O tamanho e o custo corretos são cruciais para manter a saúde da sua empresa. Otimizar sua integração de aplicativos usando serviços de mensagens como Amazon SQS e Amazon SNS envolve configurar filas adequadamente, otimizar o tamanho das mensagens, integrar serviços de forma eficiente, implementar uma filtragem eficaz de mensagens e monitorar o desempenho.

Ao aproveitar padrões de arquitetura como circuit breaker, atraso exponencial e throttling, você pode criar aplicativos escaláveis, confiáveis e eficientes que minimizem os custos e maximizem o desempenho. Comece a otimizar hoje e experimente a diferença no desempenho e na confiabilidade do seu aplicativo!

Daniel Abib é arquiteto de soluções senior na AWS, com mais de 25 anos trabalhando com gerenciamento de projetos, arquiteturas de soluções escaláveis, desenvolvimento de sistemas e CI/CD, microsserviços, arquitetura Serverless & Containers e segurança. Ele trabalha apoiando clientes corporativos, ajudando-os em sua jornada para a nuvem.

https://www.linkedin.com/in/danielabib/

Biografia das Revisoras

Bianca Mota é arquiteta de soluções para o segmento de startups e iniciou sua jornada na AWS em 2019 ajudando clientes em suas jornadas na nuvem. Além disso, Bianca é parte da comunidade Serverless na AWS e já apresentou sobre o assunto em diversos eventos, como o AWS Summit São Paulo e o AWS re:Invent.
Letícia Dornelas tem mais de 10 anos de atuação na área de tecnologia. Atualmente, ela desempenha o cargo de Arquiteta de Soluções na AWS, onde apoia clientes do setor de saúde. Formada pelo IFSP, tem interesse especial por temas como Machine Learning, Arquitetura Orientada a Eventos e Serverless.