Il modo migliore per ottimizzare il rendimento e scalare i dati nel Firebase Realtime Database consiste nel suddividere i dati tra più istanze Realtime Database, note anche come lo sharding del database. Lo sharding ti offre la flessibilità di scalare oltre limiti applicabili ai singoli database di Compute Engine, oltre al bilanciamento del carico e all'ottimizzazione delle prestazioni.
Quando eseguire il partitioning dei dati
Potresti voler eseguire lo sharding dei dati su più database se utilizzi Realtime Database e rientra in uno dei seguenti scenari:
- Vuoi scalare oltre il limite di 200.000 connessioni simultanee, 1000 operazioni di scrittura al secondo o qualsiasi altra limiti per una singola istanza di database.
- Disponi di più set di dati discreti e vuoi ottimizzare le prestazioni ad esempio un'app di chat che gestisce gruppi di utenti separati e indipendenti.
- Vuoi bilanciare il carico tra più database per migliorare l'uptime ridurre il rischio di sovraccaricare una singola istanza di database.
Come eseguire lo sharding dei dati
Per eseguire lo sharding dei dati, segui questi passaggi (descritti più dettagliatamente di seguito):
- Mappa i dati a più database in base alle esigenze specifiche della tua app.
- Creare più istanze di database.
- Configura la tua app in modo che si connetta all'istanza Realtime Database necessaria per ogni set di dati.
Mappa i dati
Quando esegui la mappatura dei dati a più database, cerca di soddisfare le seguenti condizioni:
- Ogni query viene eseguita solo su una singola istanza di database. Realtime Database non supporta le query tra le istanze del database.
- Nessuna condivisione o duplicazione dei dati tra le istanze di database (o una condivisione o duplicazione minima).
- Ogni istanza di app si connette a un solo database in un determinato momento.
Durante la mappatura dei dati, ti consigliamo di applicare le seguenti strategie:
Crea uno " shard master"
Archivia una mappa di come vengono archiviati i tuoi dati delle istanze di database. In questo modo, puoi cercare in modo programmatico il database corrisponde al client che stabilisce la connessione. Tieni presente che potrebbe essere hanno un overhead maggiore rispetto al collegamento diretto al database specifico all'istanza necessaria, quando ne hai bisogno.
Suddividi i dati dei bucket per categoria o per cliente
Archivia i dati in istanze di database isolati, raggruppate per utente o tipo di dati. Ad esempio, se crei un'applicazione di chat che serve più organizzazioni, puoi creare un'istanza di database per ogni organizzazione e archiviare tutte le chat in istanze di database univoche.
In questo caso, l'organizzazione A e l'organizzazione B non condividono dati, non dati duplicati nei tuoi database ed esegui query solo su un con una singola istanza di database. Inoltre, solo gli utenti di ogni organizzazione si connettono al database dell'organizzazione quando usano l'app di chat.
Puoi quindi creare diverse istanze di database in anticipo e utilizzare ID dell'organizzazione per mappare un team alla rispettiva istanza di database. Ad esempio: dell'organizzazione A è mappata a Realtime Database A.
Il modo in cui mappe i dati per la tua app dipende dal caso d'uso specifico, ma le condizioni e le strategie illustrate sopra possono aiutarti a definire ciò che funziona e i dati di Google Cloud.
Crea più istanze di Realtime Database
Se hai sottoscritto il piano tariffario Blaze, puoi creare fino a 1000 di istanze di database nello stesso progetto Firebase.
Console Firebase con il menu contestuale nella sezione dei database" />
- Nella console Firebase, vai alla scheda Dati nella Sviluppo > Database .
- Seleziona Crea nuovo database dal menu nella sezione Realtime Database.
- Personalizza il Riferimento del database Regole di sicurezza, quindi fai clic su Ok .
Ripeti il processo per creare tutte le istanze di database di cui hai bisogno. Ogni istanza del database ha il proprio insieme di Firebase Realtime Database Security Rules, in modo da poter perfezionare l'accesso ai dati.
Puoi creare e gestire le istanze di database nella console Firebase o utilizzando l'API REST Realtime Database Management.
Modifica ed esegui il deployment di Realtime Database Security Rules per ogni istanza
Assicurati che Realtime Database Security Rules consenta l'accesso appropriato a ogni nel tuo progetto. Ogni database ha il proprio insieme di regole, che puoi modificare ed eseguire il deployment dalla console Firebase oppure utilizzando Firebase interfaccia a riga di comando per il deployment delle destinazioni.
Per modificare ed eseguire il deployment delle regole dalla console Firebase, segui questi passaggi:
- Vai alla sezione Scheda Regole nella sezione Sviluppo > Database.
- Seleziona il database da modificare, quindi modifica le regole.
Per modificare ed eseguire il deployment delle regole dall'interfaccia a riga di comando Firebase:
- Modifica le regole nei file delle regole per le istanze di database (ad esempio
foo.rules.json
). - Crea e applica target di deployment per associare i database che utilizzano lo stesso file di regole. Ad esempio:
firebase target:apply database main my-db-1 my-db-2
firebase target:apply database other my-other-db-3
Aggiorna il file di configurazione di
firebase.json
con le destinazioni di deployment:{ "database": [ {"target": "main", "rules": "foo.rules.json"}, {"target": "other", "rules": "bar.rules.json"} ] }
Esegui il comando di deployment:
firebase deploy
- Modifica le regole nei file delle regole per le istanze di database (ad esempio
Assicurati di modificare ed eseguire il deployment delle regole in modo coerente dalla stessa posizione. Deployment in corso dell'interfaccia a riga di comando Firebase eseguono l'override di qualsiasi modifica apportata nell'interfaccia a riga di comando. Console Firebase e la modifica delle regole direttamente nella console Firebase esegue l'override di eventuali modifiche recenti di cui hai eseguito il deployment tramite l'interfaccia a riga di comando Firebase.
Connetti la tua app a più istanze di database
Utilizza il riferimento del database per accedere ai dati archiviati nelle istanze di database secondarie. Puoi ottenere il riferimento per un'istanza di database specifica in base all'URL o all'app. Se non specifichi un URL, riceverai il riferimento per il predefinita del database.
Web
import { initializeApp } from "firebase/app"; import { getDatabase } from "firebase/database"; const app1 = initializeApp({ databaseURL: "https://testapp-1234-1.firebaseio.com" }); const app2 = initializeApp({ databaseURL: "https://testapp-1234-2.firebaseio.com" }, 'app2'); // Get the default database instance for an app1 const database1 = getDatabase(app1); // Get a database instance for app2 const database2 = getDatabase(app2);
Web
const app1 = firebase.initializeApp({ databaseURL: "https://testapp-1234-1.firebaseio.com" }); const app2 = firebase.initializeApp({ databaseURL: "https://testapp-1234-2.firebaseio.com" }, 'app2'); // Get the default database instance for an app1 var database1 = firebase.database(); // Get a database instance for app2 var database2 = firebase.database(app2);
Swift
// Get the default database instance for an appvar ref: DatabaseReference! ref = Database.database().reference()
Objective-C
// Get the default database instance for an app@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];
Kotlin+KTX
// Get the default database instance for an app val primary = Firebase.database.reference // Get a secondary database instance by URL val secondary = Firebase.database("https://testapp-1234.firebaseio.com").reference
Java
// Get the default database instance for an app DatabaseReference primary = FirebaseDatabase.getInstance() .getReference(); // Get a secondary database instance by URL DatabaseReference secondary = FirebaseDatabase.getInstance("https://testapp-1234.firebaseio.com") .getReference();
Specifica un'istanza quando utilizzi l'interfaccia a riga di comando di Firebase
Utilizza l'opzione --instance
per specificare quale Firebase Realtime Database vuoi
e applicare un comando dell'interfaccia a riga di comando di Firebase. Ad esempio, utilizza il seguente comando per eseguire il profiler per un'istanza di database denominata my-example-shard.firebaseio.com
:
firebase database:profile --instance "my-example-shard"
Ottimizza le connessioni su ogni database
Se ogni client deve connettersi a più database durante una sessione, puoi ridurre il numero di connessioni simultanee a ogni istanza di database e connessione a ciascuna istanza di database solo per il tempo necessario.
Ricevi altri consigli
Se hai bisogno di ulteriore assistenza per lo sharding dei dati su più istanze di database, contatta gli esperti di Firebase nel nostro Canale Slack o su Stack Overflow.