Scala con più database

Il modo migliore per ottimizzare le prestazioni e ridimensionare i dati in Firebase Realtime Database è suddividere i dati su più istanze di Realtime Database, noto anche come partizionamento del database. Sharding ti dà la flessibilità di scala al di là dei limiti che si applicano a singole istanze di database, oltre al bilanciamento del carico e l'ottimizzazione delle prestazioni.

Quando dividere i tuoi dati?

Potresti voler dividere i tuoi dati su più database se utilizzi Realtime Database e inserirti in uno dei seguenti scenari:

  • Si vuole scalare oltre il limite di 200.000 connessioni simultanee, 1.000 operazioni di scrittura / secondo, o uno qualsiasi degli altri limiti per una singola istanza di database.
  • Si dispone di più set di dati discreti e si desidera ottimizzare le prestazioni (ad esempio, un'app di chat che serve gruppi di utenti separati e indipendenti).
  • Si desidera bilanciare il carico su più database per migliorare i tempi di attività e ridurre il rischio di sovraccaricare una singola istanza di database.

Come dividere i tuoi dati

Per frazionare i 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 a un solo database in un dato momento.

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

Crea un "frammento principale"

Archivia una mappa del modo in cui i tuoi dati vengono archiviati tra le istanze del database. In questo modo, puoi cercare a livello di codice quale istanza del database corrisponde al client che si connette. Tieni presente che questo potrebbe avere 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, 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 e si eseguono query solo su una singola istanza di database. Inoltre, gli utenti di ogni organizzazione si connettono al database della propria organizzazione solo quando utilizzano l'app di chat.

È quindi possibile creare in anticipo diverse istanze di database e utilizzare l'ID dell'organizzazione per mappare un team alla relativa istanza di database. Ad esempio, l'organizzazione A esegue il mapping a Realtime Database A.

Il modo in cui associ 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 siete sul piano tariffario Blaze , è possibile creare più istanze di database nello stesso progetto Firebase.

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

  1. Nella console Firebase, passare alla scheda dati nel database Sviluppare> sezione.
  2. Selezionare Crea nuovo database dal menu nella sezione database in tempo reale.
  3. Personalizza il tuo riferimento database e le regole di sicurezza , quindi fare clic su capito.

Ripeti il ​​processo per creare tutte le istanze di database necessarie. Ogni istanza del database ha il proprio set di regole del database in tempo reale di Firebase, quindi puoi ottimizzare l'accesso ai tuoi dati.

È possibile creare e gestire istanze di database nella console Firebase o utilizzando il Realtime Management Database API REST .

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

Assicurati che le tue Regole del database in tempo reale consentano l'accesso appropriato a ogni istanza di database nel tuo progetto. Ogni database ha una propria serie di regole, che è possibile modificare e distribuire dalla console Firebase, o utilizzando il Firebase CLI di implementare obiettivi .

  • Per modificare e distribuire le regole dalla console Firebase, segui questi passaggi:

    1. Vai alla scheda Regole nella sezione Database Sviluppare>.
    2. Seleziona il database che desideri modificare, quindi modifica le regole.
  • Per modificare e distribuire le regole dalla CLI Firebase, segui questi passaggi:

    1. Modificare le regole nei file regole per le istanze di database (ad esempio, foo.rules.json ).
    2. Creare e applicare 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 firebase.json file di configurazione con gli obiettivi Deploy:

      {
        "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 dalla CLI di Firebase sostituisce tutte le modifiche apportate nella console Firebase e la modifica delle regole direttamente nella console di Firebase sovrascrive le modifiche recenti che hai distribuito 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 di database predefinita dell'app.

Versione web 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);

Versione web 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);
Swift
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Ottiene un'istanza di database secondario URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Obiettivo-C
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Ottenere un'istanza del database secondario URL @property (forte nonatomic,) FIRDatabaseReference * ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] riferimento];

Giava

// 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 Firebase CLI

Utilizzare l' --instance opzione per specificare quali database Firebase in tempo reale che si desidera applicare un comando Firebase CLI. Ad esempio, utilizzare il seguente comando per eseguire il profiler per un'istanza database denominato 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, è possibile ridurre il numero di connessioni simultanee a ciascuna istanza di database connettendosi a ciascuna istanza di database solo per il tempo necessario.

Ottieni più consigli

Se avete bisogno di più aiuto sharding i dati tra più istanze di database, entrare in contatto con gli esperti Firebase sul nostro canale di Slack o su Stack Overflow .