Il modo migliore per ottimizzare le prestazioni e scalare i tuoi dati in Firebase Realtime Database è suddividere i tuoi dati su più istanze di Realtime Database, noto anche come sharding del database. Lo sharding ti offre la flessibilità di scalare oltre i limiti che si applicano alle singole istanze del database, oltre al bilanciamento del carico e all'ottimizzazione delle prestazioni.
Quando partizionare i tuoi dati
Potresti voler suddividere i tuoi dati su più database se utilizzi Realtime Database e ti adatti a uno dei seguenti scenari:
- Desideri scalare oltre il limite di 200.000 connessioni simultanee, 1.000 operazioni di scrittura al secondo o qualsiasi altro limite per una singola istanza di database.
- Disponi di più set di dati distinti e desideri ottimizzare le prestazioni (ad esempio, un'app di chat che serve gruppi di utenti separati e indipendenti).
- Desideri bilanciare il carico su più database per migliorare i tempi di attività e ridurre il rischio di sovraccaricare una singola istanza del database.
Come suddividere i tuoi dati
Per partizionare i tuoi dati, segui questi passaggi (descritti più dettagliatamente di seguito):
- Mappa i tuoi dati su più database in base alle esigenze specifiche della tua app.
- Crea più istanze di database.
- Configura la tua app in modo che si connetta all'istanza di Realtime Database necessaria per ciascun set di dati.
Mappa i tuoi dati
Quando mappi i tuoi dati su più database, prova a soddisfare le seguenti condizioni:
- Ogni query viene eseguita solo su una singola istanza del database. Realtime Database non supporta query tra istanze di database.
- Nessuna condivisione o duplicazione dei dati tra le istanze del database (o condivisione o duplicazione minima).
- Ogni istanza dell'app si connette a un solo database in un dato momento.
Durante la mappatura dei dati, valuta la possibilità di applicare le seguenti strategie:
Crea un "frammento principale"
Archivia una mappa di come i tuoi dati vengono archiviati tra le istanze del database. In questo modo è possibile cercare a livello di codice quale istanza del database corrisponde al client che si connette. Tieni presente che ciò potrebbe comportare un sovraccarico maggiore rispetto alla connessione diretta alla particolare istanza del database di cui hai bisogno, quando ne hai bisogno.
Dati del bucket per categorie o per cliente
Archivia i dati in istanze di database in silos, raggruppati 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 ciascuna organizzazione e archiviare tutti i dati della chat in istanze di database univoche.
In questo caso, l'organizzazione A e l'organizzazione B non condividono i dati, non sono presenti dati duplicati nei database ed esegui query solo su una singola istanza del database. Inoltre, gli utenti di ciascuna organizzazione si connettono al database della propria organizzazione solo quando utilizzano l'app di chat.
È quindi possibile creare diverse istanze di database in anticipo e utilizzare l'ID dell'organizzazione per mappare un team alla relativa istanza di database. Ad esempio, l'organizzazione A è mappata al Realtime Database A.
Il modo in cui mappi i dati per la tua app dipende dal tuo caso d'uso particolare, ma le condizioni e le strategie descritte sopra possono aiutarti a definire cosa funziona per i tuoi dati.
Crea più istanze di Realtime Database
Se disponi del piano tariffario Blaze , puoi creare fino a 1.000 istanze di database nello stesso progetto Firebase.
- Nella console Firebase, vai alla scheda Dati nella sezione Sviluppo > Database .
- Selezionare Crea nuovo database dal menu nella sezione Database in tempo reale .
- Personalizza il riferimento al database e le 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 set di regole di sicurezza del database Firebase Realtime, così puoi ottimizzare l'accesso ai tuoi dati.
Puoi creare e gestire istanze di database nella console Firebase o utilizzando l' API REST di Realtime Database Management .
Modifica e distribuisci le regole di sicurezza del database in tempo reale per ogni istanza
Assicurati che le regole di sicurezza del database in tempo reale consentano l'accesso appropriato a ciascuna istanza del database nel tuo progetto. Ogni database ha il proprio set di regole, che puoi modificare e distribuire dalla console Firebase o utilizzando la CLI Firebase per distribuire le destinazioni .
Per modificare e distribuire le regole dalla console Firebase, procedi nel seguente modo:
- Vai alla scheda Regole nella sezione Sviluppo > Database .
- Seleziona il database che desideri modificare, quindi modifica le regole.
Per modificare e distribuire le regole dalla CLI Firebase, procedi nel seguente modo:
- Modifica le regole nei file delle regole per le istanze del tuo database (ad esempio,
foo.rules.json
). - Crea e applica destinazioni di distribuzione per associare 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 tuo file di configurazione
firebase.json
con le destinazioni di distribuzione:{ "database": [ {"target": "main", "rules": "foo.rules.json"}, {"target": "other", "rules": "bar.rules.json"} ] }
Esegui il comando di distribuzione:
firebase deploy
- Modifica le regole nei file delle regole per le istanze del tuo database (ad esempio,
Assicurati di modificare e distribuire costantemente le regole dallo stesso posto. La distribuzione delle regole dalla CLI Firebase sovrascrive qualsiasi modifica apportata nella console Firebase e la modifica delle regole direttamente nella console Firebase sovrascrive qualsiasi modifica recente distribuita tramite la CLI Firebase.
Connetti la tua app a più istanze di database
Utilizza il riferimento al database per accedere ai dati archiviati nelle istanze del database secondario. Puoi ottenere il riferimento per un'istanza di database specifica tramite URL o app. Se non specifichi un URL, otterrai il riferimento per l'istanza del database predefinita dell'app.
Web modular API
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 namespaced API
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);
Veloce
// Get the default database instance for an appvar ref: DatabaseReference! ref = Database.database().reference()// Ottieni un'istanza del database secondario tramite URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").riferimento()
Obiettivo-C
// Get the default database instance for an app@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];// Ottieni un'istanza del database secondario tramite URL @property (forte, non atomico) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] riferimento];
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 la CLI Firebase
Utilizza l' opzione --instance
per specificare a quale Firebase Realtime Database desideri applicare un comando CLI Firebase. Ad esempio, utilizza il comando seguente per eseguire il profiler per un'istanza del database denominata my-example-shard.firebaseio.com
:
firebase database:profile --instance "my-example-shard"
Ottimizza le connessioni su ciascun database
Se ciascun client deve connettersi a più database durante una sessione, è possibile ridurre il numero di connessioni simultanee a ciascuna istanza del database connettendosi a ciascuna istanza del database solo per il tempo necessario.
Ottieni ulteriori consigli
Se hai bisogno di ulteriore aiuto per condividere i tuoi dati su più istanze di database, contatta gli esperti Firebase sul nostro canale Slack o su Stack Overflow .