Por que a métrica Lambda IteratorAge está aumentando no meu DynamoDB stream?
Quando o AWS Lambda consome registros do Amazon DynamoDB Streams, vejo um aumento na métrica Lambda IteratorAge.
Breve descrição
A métrica Lambda IteratorAge mede a latência entre o momento em que um registro é adicionado a um DynamoDB stream e o momento em que a função processa o registro. Um aumento no IteratorAge significa que o Lambda não está processando com eficiência os registros gravados no DynamoDB stream.
O IteratorAge pode aumentar pelos seguintes motivos:
- Erros de invocação
- Ocorrência do controle
- Baixo throughput do Lambda
Resolução
Erros de invocação
O Lambda foi criado para processar lotes de registros em sequência e, em seguida, tentar novamente os erros. Se uma função retornar um erro toda vez que for invocada, o Lambda continuará tentando até que os registros expirem, ou continua tentando até exceder a idade máxima definida no mapeamento da origem do evento. Além disso, o período de retenção do DynamoDB stream é de 24 horas. O Lambda continua tentando por até um dia. Depois disso, ele passa para o próximo lote de registros.
Para confirmar se um erro de invocação é a causa raiz do pico de IteratorAge, verifique a métrica de erros do Lambda. Se um erro de invocação for a causa, verifique os registros do Lambda para depurar o erro e, em seguida, altere o código. Ao lidar com o erro, não deixe de incluir uma instrução try-catch em seu código.
A configuração do mapeamento da origem do evento tem três parâmetros que podem ajudar a evitar picos de IteratorAge:
- Tentativas de repetição: este parâmetro define o número máximo de tentativas do Lambda quando a função retorna um erro.
- Idade máxima do registro: este parâmetro define a idade máxima de um registro que o Lambda envia para sua função. Use esse parâmetro para ajudar a descartar registros muito antigos.
- Erro "Dividir lote": este parâmetro ajuda a tentar novamente com lotes menores para isolar registros incorretos e contornar problemas de tempo limite. Quando a função retornar um erro, divida o lote antes de tentar novamente.
Observação: A divisão de um lote não vale para a cota de novas tentativas.
Para reter eventos descartados, configure o mapeamento da origem do evento para enviar detalhes sobre lotes com falha para uma fila do Amazon Simple Queue Service (Amazon SQS). Se preferir, configure o mapeamento de origem do evento para enviar detalhes para um tópico do Amazon Simple Notification Service (Amazon SNS). Para isso, use o parâmetro de Destino em caso de falha.
Ocorrências do controle
Como os registros de eventos são lidos sequencialmente, se a invocação atual for limitada, as funções do Lambda não conseguirão avançar para o próximo registro.
Ao usar DynamoDB streams, não configure mais de dois consumidores no mesmo fragmento do stream. Se houver mais de dois leitores em um fragmento, sua função poderá estar limitada. Para mais informações, consulte Como ler e processar um stream.
Se precisar de mais de dois leitores em um único fragmento de stream, use um padrão fan-out. Configure a função do Lambda para consumir registros do stream e, em seguida, encaminhe-os para outras funções downstream do Lambda ou streams do Amazon Kinesis. Para o Lambda, use um limite de simultaneidade para evitar o controle de utilização.
Throughput do Lambda
Duração do runtime
Se a métrica de Duration de uma função do Lambda for alta, o throughput da função diminuirá e o IteratorAge aumentará.
Para diminuir a duração do runtime da função, siga um destes métodos ou ambos:
- Aumente a quantidade de memória alocada para a função.
- Otimize seu código de função para que seja necessário menos tempo para processar registros.
Execuções simultâneas do Lambda
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)
- Número de fragmentos: 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 tamanho e o throughput da tabela determinam o número de partições. 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. Para aumentar a simultaneidade, aumente a capacidade provisionada da tabela para aumentar o número de fragmentos.
- Lotes simultâneos por fragmento (fator de paralelização): é 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, você poderá ter até 50 execuções simultâneas.
**Observação:**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. Verifique se a chave de partição da tabela tem alta cardinalidade e o tráfego não gera 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, você poderá ter somente uma execução simultânea por fragmento.
Tamanho do lote
Para aumentar o throughput do Lambda, ajuste o valor do tamanho do lote. Se você processar um número baixo de registros por lote, o fluxo será processado mais lentamente. Se você tiver um número alto de registros por lote, a duração da execução da função poderá aumentar. Para encontrar o valor ideal para o seu caso, o recomendado é testar o tamanho do lote com vários valores.
Se a duração do runtime da sua função for independente do número de registros em um evento, aumentar o tamanho do lote da função diminuirá a idade do iterador da função.
Informações relacionadas
Conteúdo relevante
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 3 anos
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 2 anos