Quero saber por que meus Amazon DynamoDB streams demoram tanto para serem processados.
Resolução
Quando você usa o AWS Lambda para consumir DynamoDB streams, não é possível ter registros gravados em uma tabela, mas que não são processados pelo Lambda. Esses registros podem levar até horas para serem processados. Para solucionar a causa, revise a métrica IteratorAge do Lambda.
Quando o IteratorAge aumenta, isso quer dizer que o Lambda não está processando com eficiência os registros gravados no DynamoDB stream. A métrica IteratorAge pode aumentar pelos seguintes motivos.
Erros de invocação
O Lambda foi criado para processar lotes de registros em sequência e tentar novamente os erros. Se uma função retornar um erro toda vez que for invocada, a função do Lambda continuará tentando processar os registros. Ela faz isso até que os registros expirem ou ultrapassem o período máximo definido no mapeamento da origem do evento. Como os registros presentes nos fluxos não estão sendo processados, pode haver um pico na métrica IteratorAge. Verifique a métrica de erros do Lambda para ver se há picos na métrica de erros. Se preferir, revise seus logs do Lambda para obter mais informações.
Para evitar que os erros de invocação causem um pico na métrica IteratorAge, envie os registros para uma fila de mensagens não entregues (DLQ). Ao criar o mapeamento da origem do evento, insira as seguintes informações dos parâmetros específicos:
- Tentativas de repetição: esse parâmetro é o número de vezes que a função do Lambda é executada quando a função tem um erro. Atualize esse valor com base no seu caso de uso e envie os registros para a DLQ depois que a função tentar novamente um número específico de vezes.
- Erro “Dividir lote”: esse parâmetro divide um lote em dois antes que a função repita o lote. Use esse parâmetro para dividir o lote e continuar a invocação com os lotes menores. A divisão do lote pode ajudar a isolar os registros incorretos que causam o erro de invocação.
Erros de controle de utilização
Quando você usa DynamoDB streams, é uma prática recomendada ter no máximo dois consumidores por fragmento para evitar o controle de utilização. Como o Lambda processa registros sequencialmente, ele não pode continuar processando registros se uma invocação atual for limitada. Se você precisar usar mais de dois consumidores, use o Amazon Kinesis ou um padrão de fanout. Outra opção é usar um limite de simultaneidade no Lambda para evitar o controle de utilização.
Throughput do Lambda
O throughput do Lambda é o tempo gasto por uma única invocação de uma função do Lambda para processar um registro ou lote de registros. Os seguintes fatores podem afetar o throughput de uma função do Lambda:
Duração do runtime
Se o valor da métrica Duration for alto, o throughput da função será baixo e resultará no aumento da métrica IteratorAge para a função. Para diminuir a duração do runtime da função, aumente a memória alocada para a função.
Outra opção é otimizar o código de função para que seja necessário menos tempo para processar registros.
Execuções simultâneas do Lambda
A simultaneidade é o número de solicitações em andamento que sua função do Lambda está processando ao mesmo tempo. Um aumento no número de invocações simultâneas do Lambda pode melhorar o processamento dos registros de stream. Para cada solicitação simultânea, o Lambda provisiona uma instância separada do seu ambiente de execução. O número máximo de execuções simultâneas do Lambda é calculado da seguinte forma:
Execuções simultâneas = Número de fragmentos x Lotes simultâneos por fragmento (fator de paralelização)
Em um DynamoDB stream, há um mapeamento individual entre o número de partições da tabela e o número de fragmentos do stream. O número de partições é determinado pelo tamanho da tabela e o throughput. Cada partição na tabela pode atender até 3.000 unidades de solicitação de leitura ou 1.000 unidades de solicitação de gravação, ou a combinação linear de ambas. Portanto, para aumentar a simultaneidade, aumente a capacidade provisionada da tabela para aumentar o número de fragmentos. É possível configurar o número de lotes simultâneos por fragmento no mapeamento da origem do evento. O padrão é 1 e pode ser aumentado até 10. Por exemplo, se a tabela tiver 10 partições e os lotes simultâneos por fragmento estiverem definidos como 5, é possível ter até 50 execuções simultâneas.
Para processar a alteração no nível do item na ordem correta a qualquer momento, os itens com a mesma chave de partição vão para o mesmo lote. A chave de partição da tabela deve ter alta cardinalidade e o tráfego não pode gerar teclas de atalho. Por exemplo, se você definir o valor de lotes simultâneos por fragmento como 10 e o tráfego de gravação estiver direcionado a uma única chave de partição, é possível ter somente uma execução simultânea por fragmento.
Tamanho do lote e janela do lote
O comportamento de agrupamento em lotes do Lambda pode diminuir o throughput da função quando esta não está ajustada corretamente. Para otimizar o processamento dos DynamoDB streams, ajuste a janela de agrupamento em lote e o tamanho do lote com base no seu caso de uso.
Se o tamanho do lote for definido como um valor muito baixo, a função será invocada frequentemente com um pequeno número de registros. Essas invocações frequentes retardam o processamento do fluxo. Se o valor do tamanho do lote for definido muito alto, a duração da função poderá aumentar.
Se o valor da janela do lote e o número de registros nessa janela não estiverem otimizados, talvez você tenha invocações desnecessárias do mesmo fragmento, que podem retardar o processamento do fluxo. Se o valor da janela de lote for muito alto, é possível esperar mais tempo para que a função processe os fluxos. Esse tempo de processamento mais longo aumenta o IteratorAge.
Para aumentar o throughput e diminuir o IteratorAge, é uma prática recomendada testar várias combinações de janela de agrupamento em lote e tamanho do lote.
Informações relacionadas
Métricas de desempenho
Sobre scaling e throughput do Lambda
Sobre o scaling de funções do Lambda
Como usar o DynamoDB Streams Amazon Kinesis Adapter para processar registros de stream
DynamoDB Streams e gatilhos do Lambda