Salta al contenuto

Perché ci vuole così tanto tempo per elaborare i miei flussi DynamoDB?

6 minuti di lettura
0

Desidero sapere perché l'elaborazione dei miei flussi Amazon DynamoDB richiede così tanto tempo.

Risoluzione

Quando usi AWS Lamdba per consumare flussi DynamoDB, potresti avere record scritti su una tabella ma non elaborati da Lambda. L'elaborazione di questi record potrebbe richiedere anche diverse ore. Per risolvere la causa, consulta la metrica Lambda Iteratorage.

Quando IteratorAge aumenta, Lambda non elabora in modo efficiente i record scritti nel flusso DynamoDB. La metrica IteratorAge può aumentare per i seguenti motivi.

Errori di invocazione

La funzione Lambda è progettata per elaborare batch di record in sequenza e riprovare in caso di errori. Se una funzione restituisce un errore ogni volta che viene invocata, la funzione Lambda continua a provare a elaborare i record. La funzione continua a provare a elaborare i record fino alla scadenza dei record o al superamento dell'età massima configurata nello strumento di mappatura dell'origine degli eventi. Poiché i record presenti nei flussi non vengono elaborati, potrebbe esserci un picco nella metrica IteratorAge. Puoi controllare la metrica degli errori Lambda per individuare eventuali picchi nella metrica degli errori. Oppure consulta i tuoi log Lambda per ulteriori informazioni.

Per evitare che gli errori di invocazione causino un picco nella metrica Iteratorage, invia i record a una coda DLQ. Quando crei lo strumento di mappatura dell'origine degli eventi, inserisci le seguenti informazioni per i parametri specifici:

  • Nuovi tentativi: questo parametro indica il numero di volte in cui la funzione Lambda viene eseguita quando la funzione presenta un errore. Aggiorna questo valore in base al tuo caso d'uso e invia i record alla coda DLQ dopo che la funzione riprova un numero specifico di volte.
  • Dividi il batch in caso di errore: questo parametro divide un batch in due batch prima che la funzione riprovi il batch. Utilizza questo parametro per suddividere il batch e continuare l'invocazione con i batch più piccoli. La divisione del batch può aiutare a isolare i record errati che causano l'errore di invocazione.

Errori di limitazione (della larghezza di banda della rete)

Quando utilizzi i flussi DynamoDB, è consigliabile non avere più di due consumer per shard per evitare la limitazione (della larghezza di banda della rete). Poiché Lambda elabora i record in sequenza, Lambda non può continuare a elaborare i record se un'invocazione corrente viene limitata. Se devi utilizzare più di due consumer, utilizza Amazon Kinesis o un modello fanout. Oppure utilizza un limite di concorrenza in Lambda per evitare limitazioni (della larghezza di banda della rete).

Throughput Lambda

Il throughput Lambda è la quantità di tempo impiegata da una singola invocazione di una funzione Lambda per elaborare un record o un batch di record. I seguenti fattori possono influire sul throughput di una funzione Lambda:

Durata del runtime

Se il valore della metrica Duration è elevato, il throughput della funzione è basso e determina l'aumento della metrica IteratorAge per la funzione. Per ridurre la durata del runtime della funzione, aumenta la memoria allocata a una funzione.

Puoi anche ottimizzare il codice della funzione in modo che sia necessario meno tempo per elaborare i record.

Esecuzioni Lambda concomitanti

La concomitanza è il numero di richieste in transito che la funzione Lambda gestisce simultaneamente. Un aumento del numero di invocazioni Lambda concomitanti può migliorare l'elaborazione dei record dei flussi. Per ogni richiesta concomitante, Lambda fornisce un'istanza separata del tuo ambiente di esecuzione. Il numero massimo di esecuzioni Lambda concomitanti viene calcolato come segue:
Esecuzioni concomitanti = numero di shard x batch concomitanti per shard (fattore di parallelizzazione)

In un flusso DynamoDB, c'è una mappatura 1 a 1 tra il numero di partizioni della tabella e il numero di shard dei flussi. Il numero di partizioni è determinato dalla dimensione della tabella e dal suo throughput. Ogni partizione della tabella può soddisfare fino a 3.000 unità di richiesta di lettura o 1.000 unità di richiesta di scrittura oppure la combinazione lineare di entrambe. Pertanto, per aumentare la concomitanza, aumenta la capacità allocata della tabella per aumentare il numero di shard. Puoi configurare il numero di batch concomitanti per shard nello strumento di mappatura dell'origine degli eventi. Il valore predefinito è 1 e può essere aumentato fino a 10. Ad esempio, se la tabella ha 10 partizioni e i batch concomitanti per shard sono impostati su 5, è possibile avere fino a 50 esecuzioni concomitanti.

Per elaborare la modifica a livello di elemento nell'ordine corretto in un dato momento, gli elementi con la stessa chiave di partizione vengono inseriti nello stesso batch. La chiave di partizione della tabella deve avere una cardinalità elevata e il traffico non può generare chiavi sovrautilizzate. Ad esempio, se imposti il valore Concurrent batches per shard value (Batch concomitanti per valore di shard) su 10 e la destinazione del traffico di scrittura è una singola chiave di partizione, potrai avere una sola esecuzione concomitante per shard.

Dimensione del batch e finestra di batch

Il comportamento di elaborazione in batch Lambda può ridurre il throughput della funzione se non è regolato correttamente. Per ottimizzare l'elaborazione dei flussi DynamoDB, regola la finestra di elaborazione in batch e la dimensione del batch in base al tuo caso d'uso.

Se la dimensione del batch è impostata su un valore troppo basso, la funzione viene invocata frequentemente con un numero limitato di record. Queste invocazioni frequenti rallentano l'elaborazione del flusso. Se il valore della dimensione del batch è impostato su un valore troppo alto, la durata della funzione potrebbe aumentare.

Se il valore della finestra di batch e il numero di record in quella finestra non sono ottimizzati, potresti avere invocazioni non necessarie dello stesso shard. Le invocazioni non necessarie possono rallentare l'elaborazione del flusso. Se il valore della finestra di batch è troppo alto, potresti attendere più a lungo affinché la funzione elabori i flussi. Il tempo di elaborazione più lungo aumenta IteratorAge.

Per aumentare il throughput e ridurre IteratorAge, è consigliabile testare più combinazioni di finestra di batch e dimensione del batch.

Informazioni correlate

Performance metrics (Metriche delle prestazioni)

Understanding AWS Lambda scaling and throughput (Informazioni su dimensionamento e throughput Lambda)

Informazioni sulla scalabilità della funzione Lambda

Utilizzo dell'adattatore DynamoDB Streams Kinesis per elaborare i record di flusso

Flussi DynamoDB e trigger Lambda

AWS UFFICIALEAggiornata 2 anni fa