Perché la metrica Lambda IteratorAge è in aumento per i miei flussi Amazon DynamoDB?

Ultimo aggiornamento: 12-09-2022

Quando si consumano record dal mio flusso Amazon DynamoDB, posso osservare un picco nella metrica AWS Lambda IteratorAge. Perché l'età dell'iteratore della mia funzione sta aumentando e cosa posso fare a riguardo?

Breve descrizione

La metrica Lambda IteratorAge misura la latenza tra quando un record viene aggiunto a un flusso DynamoDB e quando la funzione elabora tale record. Quando la metrica IteratorAge aumenta, significa che Lambda non elabora in modo efficiente i record scritti nel flusso DynamoDB.

I motivi principali per cui IteratorAge aumenta sono i seguenti:

  • Errori di richiamo
  • Casi di limitazione
  • Velocità di trasmissione effettiva di Lambda ridotta

Risoluzione

Errori di richiamo

Lambda è progettato per elaborare batch di record in sequenza e per riprovare in caso di errore. Quindi, se una funzione restituisce un errore ogni volta che viene richiamata, Lambda continua a riprovare. Questa operazione viene eseguita finché i record non scadono o superano l'età massima configurata nella mappatura dell'origine dell'evento. Il periodo di conservazione del flusso DynamoDB è pari a 24. Lambda continua a riprovare per un massimo di un giorno, fino alla scadenza del record, quindi passa al batch di record successivo.

Controlla la metrica degli errori di Lambda per verificare se la causa principale del picco di IteratorAge è da attribuire a un errore di richiamo. In tal caso, controllare i registri di Lambda per eseguire il debug dell'errore, quindi modificare il codice. Quando gestisci l'errore, assicurati di includere un'istruzione try-catch nel tuo codice.

Nella configurazione della mappatura dell'origine degli eventi ci sono tre parametri che possono aiutarti a prevenire i picchi di IteratorAge:

  • Numero di nuovi tentativi: il numero massimo di nuovi tentativi di Lambda quando la funzione restituisce un errore.
  • Età massima del record: l'età massima di un record che Lambda invia alla tua funzione. Questo ti aiuta a scartare i record troppo vecchi.
  • Suddivisione del batch in caso di errore: quando la funzione restituisce un errore, il batch viene suddiviso in due prima di riprovare. I nuovi tentativi con batch più piccoli isolano i record danneggiati e risolvono i problemi di timeout. Nota: la suddivisione di un batch non viene conteggiata ai fini della quota di nuovi tentativi.

Per mantenere gli eventi eliminati, configura la mappatura dell'origine degli eventi affinché invii i dettagli sui batch non riusciti alla coda di un Servizio di coda semplice Amazon (Amazon SQS). In alternativa, configura la mappatura dell'origine degli eventi affinché invii i dettagli a un argomento del Servizio di notifica semplice Amazon (Amazon SNS). A tale scopo, utilizza il parametro di destinazione in caso di errore.

Casi di limitazione

Poiché i record degli eventi vengono letti in sequenza, le funzioni Lambda non possono passare al record successivo se il richiamo attuale viene limitato.

Quando si utilizzano flussi DynamoDB, non configurare più di due consumatori sulla stessa partizione di flusso. Se hai più di due lettori per ciascuna partizione, questo può causare una limitazione (della larghezza di banda della rete). Se hai bisogno di più di due lettori su una singola partizione di flusso, usa un modello di fan-out. Configura la funzione Lambda affinché utilizzi i record dal flusso, per poi inoltrarli ad altre funzioni Lambda downstream o a flussi Amazon Kinesis.

Sul lato Lambda, usa un limite di concorrenza per evitare una limitazione (della larghezza di banda della rete).

Velocità di trasmissione effettiva di Lambda

Durata del runtime

Se il parametro durata di una funzione Lambda è elevato, questo diminuisce la velocità di trasmissione effettiva della funzione e aumenta IteratorAge.

Per ridurre la durata di runtime della tua funzione, utilizza uno dei seguenti metodi o anche entrambi:

1.    Aumenta la quantità di memoria allocata alla funzione.

2.    Ottimizza il codice della funzione in modo che sia necessario meno tempo per elaborare i record.

Esecuzioni Lambda simultanee

Il numero massimo di esecuzioni Lambda simultanee viene calcolato come segue:

Esecuzioni simultanee = numero di partizioni x lotti simultanei per partizione (fattore di parallelizzazione)

  • Numero di partizioni - In un flusso DynamoDB, è presente una mappatura 1<>1 tra il numero di partizioni della tabella e il numero di partizioni del flusso. Il numero di partizioni è determinato dalla dimensione della tabella e dalla sua velocità di trasmissione effettiva. Ogni partizione nella tabella può servire fino a 3.000 unità di richiesta di lettura o 1.000 unità di richiesta di scrittura, o la combinazione lineare di entrambe. Quindi, per aumentare la concorrenza, aumenta il numero di partizioni aumentando la capacità fornita presente nella tabella.
  • Batch simultanei per partizione (fattore di parallelizzazione): nella mappatura dell'origine dell'evento è possibile configurare il numero di batch simultanei per partizione. Il valore predefinito è 1 e può essere aumentato fino a 10.

Ad esempio, se la tabella ha 10 partizioni e i Batch simultanei per partizione sono impostati su 5, è possibile avere fino a 50 esecuzioni simultanee.

Nota: per elaborare la modifica a livello di elemento nell'ordine corretto in un momento qualsiasi, gli elementi con la stessa chiave di partizione vanno nello stesso batch. Quindi, assicurati che la chiave di partizione della tabella abbia un'alta cardinalità e che il tuo traffico non generi tasti di scelta rapida. Ad esempio, se si imposta il valore Batch simultanei per partizione su 10 e il traffico di scrittura è destinato a una singola chiave di partizione, è possibile avere solo una esecuzione simultanea per partizione.

Dimensione del batch

L'ottimizzazione del valore della dimensione del batch consente di aumentare la velocità di trasmissione effettiva di Lambda. Se elabori un basso numero di record per batch, questo rallenta l'elaborazione del flusso.

D'altra parte, se disponi di un numero elevato di record per batch, ciò potrebbe aumentare la durata dell'esecuzione della funzione. Quindi, esegui il test con valori diversi per trovare quello migliore per il tuo caso d'uso.

Se la durata di runtime della funzione è indipendente dal numero di record in un evento, l'aumento della dimensione del batch della funzione riduce l'età dell'iteratore della funzione.