O blog da AWS

Apresentando uma escalabilidade mais rápida de busca contínua (pooling) para funções do AWS Lambda configuradas com o Amazon SQS

Por Anton Aleksandrov, arquiteto principal de soluções e Tarun Rai Madan, gerente de produto sênior

 

Hoje, a AWS anuncia que o AWS Lambda oferece suporte a uma taxa de escalonamento de busca contínua (pooling) até cinco vezes mais rápida para cargas de trabalho (workloads) do Lambda com picos de carga configurados com o Amazon Simple Queue Service (Amazon SQS) como fonte de eventos.

Esse recurso permite que os clientes criem aplicativos orientados por eventos usando Lambda e SQS para obter uma escalabilidade mais responsiva durante uma explosão repentina (burst) de mensagens em suas filas SQS e reduz a necessidade de duplicar funções Lambda ou filas SQS para obter um processamento mais rápido de mensagens.

Visão geral

Clientes que criam aplicativos modernos de mensagens e orientados por eventos com o AWS Lambda usam o Amazon SQS como uma base fundamental para criar arquiteturas desacopladas. O Amazon SQS é um serviço de fila de mensagens totalmente gerenciado para atender microsserviços, sistemas distribuídos e aplicativos Serverless. Quando uma função do Lambda se inscreve em uma fila do SQS como fonte de eventos, o Lambda pesquisa a fila, recupera as mensagens e envia as mensagens recuperadas em lotes para o manipulador (handler) da função para processamento. Para consumir mensagens de forma eficiente, o Lambda detecta o aumento no número de mensagens e aumenta o número de processos de pesquisa para processar as mensagens em fila.

Até hoje, o Lambda estava adicionando até 60 execuções simultâneas por minuto para funções do Lambda inscritas nas filas do SQS, aumentando até um máximo de 1.250 execuções simultâneas em aproximadamente 20 minutos. No entanto, os clientes nos dizem que alguns dos aplicativos modernos orientados a eventos que eles criam usando o Lambda e o SQS são sensíveis a picos repentinos nas mensagens, o que pode causar um atraso perceptível no processamento das mensagens para os usuários finais. Para aproveitar o poder do Lambda para aplicativos que experimentam uma explosão de mensagens nas filas do SQS, esses clientes precisavam da pesquisa de mensagens do Lambda para aumentar a escala mais rapidamente.

Com o anúncio de hoje, as funções do Lambda que se inscrevem em uma fila do SQS podem ser escaladas até cinco vezes mais rápido para filas que apresentam um aumento no acúmulo de mensagens, somando até 300 execuções simultâneas por minuto e aumentando até um máximo de 1.250 execuções simultâneas. Essa melhoria de escalabilidade ajuda a usar a simplicidade da integração entre Lambda e SQS para criar aplicativos orientados por eventos que escalam mais rapidamente durante um aumento de mensagens recebidas, especialmente para sistemas em tempo real. Ele também oferece aos clientes o benefício de um processamento mais rápido durante picos de mensagens nas filas do SQS, ao mesmo tempo em que continua oferecendo a flexibilidade de limitar o máximo de invocações simultâneas do Lambda por fonte de eventos do SQS.

Controlando o máximo de invocações simultâneas do Lambda pelo SQS

As novas taxas de escalabilidade aprimoradas são aplicadas automaticamente a todas as contas da AWS usando o Lambda e o SQS como fonte de eventos. Não há nenhuma ação explícita que você deva realizar e não há custo adicional. Essa melhoria de escalabilidade ajuda os clientes a criar aplicativos Lambda com mais desempenho, onde precisam de um aumento mais rápido da escala de sondagem do SQS. Para evitar a possível sobrecarga das dependências posteriores, o Lambda fornece aos clientes o controle para definir o número máximo de execuções simultâneas em um nível de função com concorrência reservada e nível de fonte de eventos com simultaneidade máxima.

O diagrama a seguir ilustra as configurações que você pode usar para controlar a taxa de fluxo de uma fonte de eventos do SQS. Você usa a concorrência reservada para controlar o escalonamento em nível de função e a simultaneidade máxima para controlar o dimensionamento da fonte de eventos.

Control the flow rate of an SQS event-source

 

A concorrência reservada (ou simultaneidade reservada) é a simultaneidade máxima que você deseja alocar para uma função. Quando uma função tem a concorrência reservada alocada, nenhuma outra função pode usar essa simultaneidade.

A AWS recomenda usar a concorrência reservada quando você quiser garantir que uma função tenha simultaneidade suficiente para aumentar a escala. Quando uma fonte de eventos do SQS está tentando ampliar as invocações simultâneas do Lambda, mas a função já atingiu o limite definido pela simultaneidade reservada, o serviço Lambda acelera outras invocações de função.

Isso pode resultar na tentativa de redução da fonte de eventos do SQS, reduzindo o número de mensagens processadas simultaneamente. Dependendo da configuração da fila, as mensagens limitadas são retornadas à fila para nova tentativa, expiram com base na política de retenção ou são enviadas para uma fila de mensagens mortas (DLQ) ou para um destino em caso de falha.

A configuração máxima de simultaneidade permite que você controle a simultaneidade no nível da fonte do evento. Ele permite que você defina o número máximo de invocações simultâneas que a fonte do evento tenta enviar para a função Lambda. Para cenários em que uma única função tem várias fontes de eventos do SQS configuradas, você pode definir a simultaneidade máxima para cada fonte de evento separadamente, fornecendo um controle mais granular. Ao tentar adicionar controle de taxa às fontes de eventos do SQS, a AWS recomenda que você comece a avaliar primeiro o controle máximo de simultaneidade, pois ele oferece maior flexibilidade.

A concorrência reservada e a simultaneidade máxima são recursos complementares e podem ser usados juntos. A máxima simultaneidade pode ajudar a evitar a sobrecarga de sistemas posteriores e invocações limitadas. A concorrência reservada ajuda a garantir a simultaneidade disponível para a função.

Exemplo de cenário

Considere que sua empresa deve processar grandes volumes de documentos a partir do armazenamento. Uma vez a cada poucas horas, seus parceiros de negócios carregam grandes volumes de documentos nos buckets do S3 em sua conta.

Para maior resiliência, você projetou seu aplicativo para enviar uma mensagem para uma fila do SQS para cada um dos documentos carregados, para que você possa processá-los com eficiência sem pular nenhum documento acidentalmente. Os documentos são processados usando uma função Lambda, que leva cerca de dois segundos para processar um único documento.

O processamento desses documentos é uma operação que exige muita CPU, então você decide processar um único documento por invocação. Você quer usar o poder do Lambda para distribuir o processamento paralelo para o maior número possível de ambientes de execução simultânea. Você quer que a função Lambda aumente rapidamente para processar esses documentos em paralelo o mais rápido possível e reduza para zero quando todos os documentos forem processados para economizar custos.

Quando um parceiro comercial carrega 200.000 documentos, 200.000 mensagens são enviadas para a fila do SQS. A função Lambda é configurada com uma fonte de eventos do SQS e começa a consumir as mensagens da fila.

Esse diagrama mostra os resultados da execução do cenário de teste antes das melhorias na escalabilidade da fonte de eventos do SQS. Como esperado, você pode ver que as execuções simultâneas crescem em 60 por minuto. São necessários aproximadamente 16 minutos para escalar gradualmente até 900 execuções simultâneas e processar todas as mensagens na fila.

Results of running the test scenario before the SQS event source scaling improvements

O diagrama a seguir mostra os resultados da execução do mesmo cenário de teste após as melhorias na escalabilidade da fonte de eventos do SQS. O período de tempo usado para os dois gráficos é o mesmo, mas o desempenho no segundo gráfico é melhor. As execuções simultâneas aumentam em 300 por minuto. São necessários apenas 4 minutos para escalar até 1.250 execuções simultâneas, e todas as mensagens na fila são processadas em aproximadamente 8 minutos.

The results of running the same test scenario after the SQS event source scaling improvements

Implantando este exemplo

Use o projeto de exemplo para replicar esse teste de desempenho em sua própria conta da AWS. Siga as instruções em README.md para provisionar o projeto de amostra em suas contas da AWS usando o AWS Cloud Development Kit (CDK).

Este projeto de exemplo está configurado para demonstrar uma carga de trabalho em grande escala que processa 200.000 mensagens. A execução desse projeto de amostra em sua conta pode gerar cobranças. Veja os preços do AWS Lambda e os preços do Amazon SQS.

Depois de implantado, use o aplicativo no diretório “sqs-cannon” para enviar 200.000 mensagens para a fila SQS (ou reconfigurar para qualquer outro número). São necessários vários minutos para preencher a fila do SQS com mensagens. Depois que todas as mensagens forem enviadas, habilite a fonte de eventos do SQS, conforme descrito no README.md, e monitore os gráficos no painel provisionado do CloudWatch.

A cota de simultaneidade padrão para novas contas da AWS é 1000. Se você não solicitou um aumento nessa cota, o número de execuções simultâneas é limitado a esse número. Use as cotas de serviço ou entre em contato com a equipe da sua conta para solicitar um aumento de simultaneidade.

Práticas recomendadas de segurança

Sempre use as permissões de menor privilegio ao conceder às suas funções do Lambda acesso às filas do SQS. Isso reduz a superfície de ataque potencial, garantindo que somente funções específicas tenham permissões para realizar ações específicas em filas específicas. Por exemplo, caso sua função faça apenas pesquisas da fila, conceda a ela permissão para ler mensagens, mas não para enviar novas mensagens. Uma função de execução de função define quais ações sua função pode realizar em outros recursos. Uma política de acesso à fila define os principais que podem acessar essa fila e as ações que são permitidas.

Use a criptografia do lado do servidor (SSE) para armazenar dados confidenciais em filas SQS criptografadas. Com o SSE, suas mensagens são sempre armazenadas em formato criptografado, e o SQS apenas as descriptografa para envio a um consumidor autorizado. A SSE protege o conteúdo das mensagens em filas usando chaves de criptografia gerenciadas pelo SQS (SSE-SQS) ou chaves gerenciadas no AWS Key Management Service (SSE-KMS).

Conclusão

O recurso aprimorado de escalonamento de pesquisa de fontes de eventos do Lambda SQS permite um desempenho de escalabilidade até cinco vezes mais rápido para cargas de trabalho intensificadas orientadas por eventos usando filas SQS, sem custo adicional. Essa melhoria oferece aos clientes o benefício de um processamento mais rápido durante picos de mensagens nas filas do SQS, ao mesmo tempo em que continua oferecendo a flexibilidade de limitar o máximo de invocações simultâneas pelo SQS como fonte de eventos.

Para obter mais recursos de aprendizado Serverless, visite Serverless Land.

Este artigo foi traduzido do Blog da AWS em Inglês.

 


Sobre o autor

Anton Aleksandrov é arquiteto principal de soluções

 

 

 

 

Tarun Rai Madan é gerente de produto senior

 

 

 

 

Tradutor

Daniel Abib é Enterprise Solution Architect 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/