Scala con più database

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Il modo migliore per ottimizzare le prestazioni e ridimensionare i tuoi dati in Firebase Realtime Database è dividere i tuoi dati in più istanze di Realtime Database, noto anche come partizionamento del database. Lo sharding offre la flessibilità di scalare oltre i limiti applicabili alle singole istanze di database, oltre al bilanciamento del carico e all'ottimizzazione delle prestazioni.

Quando dividere i tuoi dati

Potresti voler ripartire i tuoi dati su più database se stai utilizzando Realtime Database e rientri in uno dei seguenti scenari:

  • Vuoi scalare oltre il limite di 200.000 connessioni simultanee, 1.000 operazioni di scrittura al secondo o uno qualsiasi degli altri limiti per una singola istanza di database.
  • Hai più set di dati discreti 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 sovraccarico di una singola istanza di database.

Come frammentare i tuoi dati

Per eseguire lo shard dei tuoi dati, segui questi passaggi (descritti più dettagliatamente di seguito):

  1. Mappa i tuoi dati su più database in base alle esigenze specifiche della tua app.
  2. Crea più istanze di database.
  3. Configura la tua app in modo che si connetta all'istanza di Realtime Database necessaria per ogni set di dati.

Mappa i tuoi dati

Quando stai mappando i tuoi dati su più database, prova a soddisfare le seguenti condizioni:

  • Ogni query viene eseguita solo su una singola istanza di database. Il database in tempo reale non supporta le query tra le istanze del database.
  • Nessuna condivisione o duplicazione di dati tra istanze di database (o condivisione o duplicazione minima).
  • Ogni istanza dell'app si connette solo a un database in un dato momento.

Mentre stai mappando i tuoi dati, considera l'applicazione delle seguenti strategie:

Crea un "frammento principale"

Archivia una mappa di come i tuoi dati vengono archiviati nelle istanze del database. In questo modo, puoi cercare a livello di codice quale istanza di database corrisponde al client di connessione. 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 secchio per categorie o per cliente

Archivia i dati in istanze di database in silos, 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 ciascuna organizzazione e archiviare tutti i dati di 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 solo query su una singola istanza di database. Inoltre, gli utenti di ogni organizzazione si connettono al database della propria organizzazione solo quando usano 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 esegue il mapping al database in tempo reale A.

Il modo in cui esegui la mappatura dei 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 database in tempo reale

Se utilizzi il piano tariffario Blaze , puoi creare più istanze di database nello stesso progetto Firebase.

crea un database nella console Firebase con il menu contestuale nella sezione database

  1. Nella console Firebase, vai alla scheda Dati nella sezione Sviluppo > Database .
  2. Seleziona Crea nuovo database dal menu nella sezione Database in tempo reale .
  3. Personalizza il riferimento al database e le regole di sicurezza , quindi fai clic su OK .

Ripetere il processo per creare tutte le istanze di database necessarie. Ogni istanza del database ha il proprio set di regole del database Firebase Realtime, così puoi ottimizzare l'accesso ai tuoi dati.

Puoi creare e gestire le istanze del database nella console Firebase o utilizzando l' API REST di gestione del database in tempo reale .

Modifica e distribuisci le regole del database in tempo reale per ogni istanza

Assicurati che le regole 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 l' interfaccia a riga di comando di Firebase per distribuire i target .

  • Per modificare e distribuire le regole dalla console Firebase, procedi nel seguente modo:

    1. Vai alla scheda Regole nella sezione Sviluppo > Database .
    2. Seleziona il database che desideri modificare, quindi modifica le regole.
  • Per modificare e distribuire le regole dall'interfaccia a riga di comando di Firebase, attenersi alla seguente procedura:

    1. Modifica le regole nei file delle regole per le istanze del database (ad esempio foo.rules.json ).
    2. 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
    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"}
        ]
      }
      
    4. Eseguire il comando deploy:

      firebase deploy

Assicurati di modificare e distribuire le regole in modo coerente dalla stessa posizione. La distribuzione delle regole dall'interfaccia a riga di comando di Firebase ha la precedenza su tutte le modifiche apportate nella console Firebase e la modifica delle regole direttamente nella console di Firebase ha la precedenza su tutte le modifiche recenti che hai implementato tramite la CLI di Firebase.

Connetti la tua app a più istanze di database

Utilizzare 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 version 9

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 version 8

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
Nota: questo prodotto Firebase non è disponibile nella destinazione App Clip.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Ottieni un'istanza database secondaria per URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Obiettivo-C
Nota: questo prodotto Firebase non è disponibile nella destinazione App Clip.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Ottieni un'istanza di database secondaria tramite URL @property (forte, non atomico) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] riferimento];

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();

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

Specificare un'istanza quando si utilizza l'interfaccia a riga di comando di Firebase

Utilizzare l' opzione --instance per specificare a quale database Firebase Realtime si desidera applicare un comando CLI Firebase. Ad esempio, utilizzare il comando seguente 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 ciascuna istanza di database connettendoti a ciascuna istanza di database solo per il tempo necessario.

Ottieni più consigli

Se hai bisogno di ulteriore aiuto per lo sharding dei tuoi dati su più istanze di database, contatta gli esperti di Firebase sul nostro canale Slack o su Stack Overflow .