Come funziona il routing delle richieste DynamoDB
Ogni lettura o scrittura che invii colpisce prima una flotta di router di richiesta stateless. Un router esegue l'hashing del tuo , mappa l'hash sul nodo di archiviazione che lo possiede i dati di quella chiave e inoltra lì la richiesta. Questo salto è il motivo per cui una ricerca chiave costa lo stesso sia che la tabella contenga mille elementi o un miliardo.
Come funziona l'instradamento delle richieste DynamoDB?
DynamoDB instrada ogni richiesta attraverso un parco router di richiesta stateless che esegue l'hashing del tuo , mappa l'hash sul singolo nodo di storage proprietario di quella partizione e inoltra lì la lettura o la scrittura. Il routing è una pura funzione dell'hash della chiave, quindi una ricerca costa lo stesso indipendentemente dal fatto che la tabella contenga mille elementi o un miliardo.
- Il router di richiesta è la porta d'ingresso. È una flotta apolide che prende il tuo richiesta, esegue l'hashing della chiave di partizione e la instrada al nodo di archiviazione che la contiene partizione: nessuna scansione, nessuna conoscenza della tabella completa necessaria.
- La chiave di partizione decide tutto. Il routing è una pura funzione di
hash della chiave di partizione: la stessa chiave viene sempre indirizzata alla partizione che la possiede, quindi
GetItemè O(1), non O(dimensione tabella). - Un primario, due secondari. Una scrittura arriva al nodo primario della partizione, che riconosce una volta che il quorum (due delle tre repliche) lo ha mantenuto.
- Tasti scadenti mettono in discussione il design. Funnel dei tasti a bassa cardinalità o traffico verso un nodo: il routing va bene, il problema è la tua chiave.
Inizia con il problema risolto dal routing
Venendo da SQL, immagini un pianificatore di query: legge le statistiche, seleziona un indice, magari scansioni. Il costo varia in base alla quantità di dati che tocca. Quel modello non va bene un archivio di valori-chiave che deve rispondere in millisecondi a una cifra a qualsiasi dimensione.
La risposta di DynamoDB è rendere la ricerca di un singolo elemento un indirizzo diretto, non un ricerca. La chiave di partizione è l'input di una funzione hash che calcola dove i dati vivono fisicamente - non una colonna su cui filtri. Nessuna statistica, nessun pianificatore.
Questo è il mestiere che accetti quando abbandoni il pensiero relazionale: ti arrendi flessibilità delle query ad hoc e ottieni in cambio un indirizzamento a tempo costante.
Incontra il router della richiesta
Quando arriva una richiesta, non va direttamente in archiviazione. Raggiunge una richiesta router: una flotta senza stato, su scala orizzontale, che gestisce l'intero servizio. (Il documento USENIX ATC '22 DynamoDB descrive questa flotta di router di richiesta.)
Il router fa tre cose e non conserva dati propri:
- Autentica e autorizza la richiesta contro IAM.
- Esegue l'hashing della chiave di partizione per trovare la partizione che la possiede.
- Inoltra la richiesta al nodo di archiviazione per quella partizione.
Poiché i router sono stateless, il servizio ne aggiunge altri sotto carico. Nessuno di loro rappresentano un collo di bottiglia e nessuno rappresenta un singolo punto di errore: la stessa proprietà di the Documento Amazon Dynamo 2007 attorno al quale è stato costruito il sistema originale.
Segui una lettura attraverso il router
Prendi una tabella di telemetria per una flotta di droni. Gli Item sono codificati da DroneId (partition
key) e ReadingTs (chiave di ordinamento), con attributi come BatteryPct e AltitudeM.
Chiedi le letture di un drone dal 23 giugno:
PK = "DRONE#A19F"
SK begins_with "2026-06-23"
Il diagramma seguente traccia la richiesta dall'alto verso il basso: leggilo come un flusso verso il basso.
Il router esegue l'hashing di DRONE#A19F, lo mappa sulla partizione che possiede quella chiave e
inoltra la lettura al nodo di archiviazione primario di quella partizione, che restituisce l'elemento.
L'hash punta a una partizione tra tutte le tabelle ha. Il router non controlla mai le altre partizioni, quindi aggiungi droni e partizioni
- non rallenta questa ricerca.
Sapere cos'è realmente una partizione
Una partizione è un'unità di archiviazione e velocità effettiva. Ognuno è limitato (approssimativamente
10 GB e una porzione fissa di capacità read/write) e DynamoDB divide una partizione
quando supera uno dei due limiti. Ogni elemento con una determinata chiave di partizione inizia con uno
partizione; split-for-heat può successivamente ritagliare quella raccolta in base all'intervallo di chiavi di ordinamento (a meno che
un LSI o un tasto di ordinamento monotono lo blocca), che è ciò che rende ancora un Query superiore
una chiave di partizione economica.
Ogni partizione viene replicata su tre nodi di archiviazione distribuiti su Disponibilità Zone: una primaria e due secondarie.
| Ruolo del nodo | Maniglie | La coerenza può servire |
|---|---|---|
| Primario | Tutto scrive; letture fortemente coerenti | Forte (vede la sua ultima scrittura) |
| Secondaria | Letture finalmente coerenti; failover | Eventuale (potrebbe ritardare le primarie) |
Una scrittura va al primario, che riconosce la scrittura una volta raggiunto il quorum (due dei tre repliche) lo ha reso persistente. Una lettura viene instradata al primario quindi riflette l'ultima scrittura. Potrebbe essere servita una lettura da un secondario che non ha ancora raggiunto il livello: metà del costo, forse stantio.
Assegna un nome alla pistola: una chiave di partizione attiva
Il routing è valido quanto la chiave di partizione. L'hash distribuisce le chiavi in modo uniforme, quindi if le tue chiavi hanno alta cardinalità e anche il traffico, il carico si distribuisce su tutti nodi. Rompi una delle due proprietà e otterrai una partizione attiva.
Supponiamo che tu abbia digitato la telemetria tramite Region anziché DroneId. Adesso arrivano tutti i droni
us-east-1 condivide una chiave di partizione, quindi l'hash di lettura e scrittura sullo stesso
slot nello spazio delle chiavi e impilarli in una raccolta di oggetti. Il router sta facendo il suo lavoro
perfettamente; hai appena incanalato l'intera flotta alla capacità di una singola partizione.
Non puoi guardare il router scegliere un nodo, ma puoi progettare chiavi che instradano bene.
Quando crei una condizione chiave nel file
Generatore di espressioni, la chiave di partizione inserita
a sinistra di PK = … c'è il valore esatto che il router effettuerà l'hashing, mantenendolo
il valore ad alta cardinalità è ciò che mantiene le letture su nodi separati.
Come questo si ricollega ai tuoi modelli di accesso
L'instradamento delle richieste è il meccanismo che rende il design a tabella singola
regole non negoziabili: si modella attorno alla chiave di partizione perché la chiave di partizione
è l'indirizzo. È anche il motivo per cui un Query batte un Scan —
un Query colpisce una partizione attraverso il router, mentre un Scan percorre ogni
partizione in sequenza.
Gli indici secondari hanno le proprie partizioni e il proprio routing: a GSI viene instradato dalla propria chiave di partizione, indipendentemente da base del tavolo, motivo per cui un GSI può essere caldo anche quando il tavolo non lo è.
Passaggi successivi
Progetta chiavi che instradano verso molti nodi, non uno. Disegna la condizione PK = … nel file
Generatore di espressioni per vedere esattamente quale valore
viene sottoposto ad hashing, quindi scarica DynoTable per eseguire tali query sul tuo
proprie tabelle e vedere esattamente cosa restituisce ciascuna condizione chiave.