Perché la mia scansione DynamoDB è così veloce con solo 1 unità di capacità di lettura assegnata?

Aug 19 2020

Ho creato una tabella con 1346 elementi, ogni elemento di dimensioni inferiori a 4 KB. Ho eseguito il provisioning di 1 unità di capacità di lettura, quindi mi aspetto in media 1 articolo letto al secondo. Tuttavia, una semplice scansione di tutti i 1346 elementi ritorna quasi immediatamente.

Cosa mi manca qui?

Risposte

4 ChrisWilliams Aug 19 2020 at 14:24

Questo è probabilmente dovuto alla capacità di burst in cui si ottiene la capacità in un periodo di 300 secondi da utilizzare per azioni espandibili (come la scansione di un'intera tabella).

Ciò significherebbe che se utilizzassi tutti questi crediti, altre interazioni ne risentirebbero poiché non dispongono di capacità sufficiente.

Puoi visualizzare la quantità di WCU/RCU consumati tramite i parametri CloudWatch o all'interno dell'interfaccia DynamoDB stessa (tramite la scheda Parametri).

2 Charles Aug 19 2020 at 22:43

Non dai una dimensione per le tue voci se non per dire "ogni elemento è inferiore a 4KB". Quanto meno?

1 RCU supporterà 2 letture consistenti finali al secondo di elementi fino a 4 KB.

Per dirla in un altro modo, con 1 RCU e letture coerenti alla fine, puoi leggere 8 KB di dati al secondo.

Se i tuoi record sono 4KB, ottieni 2 record/sec
1KB, 8/sec
512B, 16/sec
256B, 32/sec

Quindi la capacità "burst" già menzionata ti ha permesso di utilizzare 55 RCU. Ma la piccola dimensione dei tuoi record ha permesso a quel 55 RCU di restituire i dati "quasi immediatamente"

1 NadavHar'El Aug 20 2020 at 18:01

Ci sono due cose che funzionano a tuo favore qui: una è che Scanun'operazione richiede un numero significativamente inferiore di RCU rispetto a quanto pensavi per piccoli oggetti. L'altra cosa è la "capacità di scoppio". Cercherò di spiegare entrambi:

La pagina dei prezzi di DynamoDB afferma che "Per elementi di dimensioni fino a 4 KB, un RCU può eseguire due richieste di lettura coerenti al secondo". Ciò suggerisce che anche se l'elemento ha una dimensione di 10 byte, leggerlo con coerenza finale costa mezzo RCU. Tuttavia, sebbene non lo indichino da nessuna parte, questo costo è vero soloGetItem per un'operazione per recuperare un singolo articolo. In a Scano Query, risulta che non paghi separatamente per ogni singolo articolo. Invece, queste operazioni eseguono la scansione sequenziale dei dati archiviati su disco e si paga per la quantità di dati così letti. Se hai 1000 piccoli elementi e la dimensione totale che DynamoDB doveva leggere dal disco era di 80KB, pagherai 80KB/4KB/2, o 10 RCU, non 500 RCU.

Questo spiega perché hai letto 1346 articoli e misurato solo 55 RCU, non 1346/2 = 673.

La seconda cosa che funziona a tuo favore è che DynamoDB ha la capacità di "capacità di burst", descritta qui :

DynamoDB conserva attualmente fino a 5 minuti (300 secondi) di capacità di lettura e scrittura inutilizzata. Durante un burst occasionale di attività di lettura o scrittura, queste unità di capacità extra possono essere consumate rapidamente, anche più velocemente della capacità di throughput assegnata al secondo che hai definito per la tua tabella.

Quindi, se il tuo database esisteva da 5 minuti prima della tua richiesta, DynamoDB ti ha salvato 300 RCU, che puoi utilizzare molto rapidamente. Dato che 300 RCU sono molto più di quelli necessari per la tua scansione (55), la tua scansione è avvenuta molto rapidamente, senza throttling.

1 SudhirJonathan Aug 24 2020 at 13:45

Quando esegui una query, il conteggio RCU si applica alla quantità di dati letti senza considerare il numero di elementi letti. Quindi, se i tuoi elementi sono piccoli, diciamo pochi byte ciascuno, possono essere facilmente interrogati all'interno di un singolo RCU da 4 KB.

Ciò è particolarmente utile anche durante la lettura di molti elementi da DynamoDB. Non è immediatamente ovvio che l'interrogazione di molti piccoli elementi sia molto più economica ed efficiente rispetto a BatchGetting.