Escale con múltiples bases de datos

La mejor manera de optimizar el rendimiento y escalar sus datos en Firebase Realtime Database es dividir sus datos en múltiples instancias de Realtime Database, lo que también se conoce como fragmentación de bases de datos. La fragmentación le brinda la flexibilidad de escalar más allá de los límites que se aplican a instancias de bases de datos individuales, además del equilibrio de carga y la optimización del rendimiento.

Cuándo fragmentar tus datos

Es posible que desees fragmentar tus datos en varias bases de datos si estás utilizando Realtime Database y encajas en cualquiera de los siguientes escenarios:

  • Quiere escalar más allá del límite de 200 000 conexiones simultáneas, 1000 operaciones de escritura por segundo o cualquiera de los otros límites para una única instancia de base de datos.
  • Tiene múltiples conjuntos de datos discretos y desea optimizar el rendimiento (por ejemplo, una aplicación de chat que atiende a grupos de usuarios separados e independientes).
  • Quiere equilibrar la carga entre varias bases de datos para mejorar el tiempo de actividad y reducir el riesgo de sobrecargar una única instancia de base de datos.

Cómo fragmentar tus datos

Para fragmentar sus datos, siga estos pasos (descritos con mayor detalle a continuación):

  1. Asigne sus datos a múltiples bases de datos según las necesidades específicas de su aplicación.
  2. Cree múltiples instancias de bases de datos.
  3. Configure su aplicación para que se conecte a la instancia de Realtime Database necesaria para cada conjunto de datos.

Mapea tus datos

Cuando asigne sus datos a varias bases de datos, intente satisfacer las siguientes condiciones:

  • Cada consulta solo se ejecuta en una única instancia de base de datos. Realtime Database no admite consultas entre instancias de bases de datos.
  • No se permite compartir ni duplicar datos entre instancias de bases de datos (o compartir o duplicar un mínimo).
  • Cada instancia de aplicación solo se conecta a una base de datos en un momento dado.

Mientras mapea sus datos, considere aplicar las siguientes estrategias:

Crea un "fragmento maestro"

Almacene un mapa de cómo se almacenan sus datos en las instancias de bases de datos. De esta manera, puede buscar mediante programación qué instancia de base de datos corresponde al cliente que se conecta. Tenga en cuenta que esto podría tener más gastos generales que conectarse directamente a la instancia de base de datos particular que necesita, cuando la necesita.

Clasificar datos por categorías o por cliente

Almacene datos en instancias de bases de datos aisladas, agrupadas por usuario o tipo de datos. Por ejemplo, si crea una aplicación de chat que sirve a varias organizaciones, puede crear una instancia de base de datos para cada organización y almacenar todos los datos del chat en instancias de base de datos únicas.

En este caso, la organización A y la organización B no comparten datos, no hay datos duplicados en sus bases de datos y solo realiza consultas en una única instancia de base de datos. Además, los usuarios de cada organización solo se conectan a la base de datos de su organización cuando usan la aplicación de chat.

Luego puede crear varias instancias de base de datos por adelantado y usar el ID de la organización para asignar un equipo a su instancia de base de datos. Por ejemplo, la organización A se asigna a la base de datos en tiempo real A.

La forma en que asigna datos para su aplicación depende de su caso de uso particular, pero las condiciones y estrategias descritas anteriormente pueden ayudarlo a definir qué funciona para sus datos.

Cree múltiples instancias de bases de datos en tiempo real

Si tiene el plan de precios Blaze , puede crear hasta 1000 instancias de base de datos en el mismo proyecto de Firebase.

cree una base de datos en Firebase console con el menú contextual en la sección de bases de datos

  1. En Firebase console, vaya a la pestaña Datos en la sección Desarrollar > Base de datos .
  2. Seleccione Crear nueva base de datos en el menú de la sección Base de datos en tiempo real .
  3. Personalice la referencia de su base de datos y las reglas de seguridad y luego haga clic en Entendido .

Repita el proceso para crear tantas instancias de base de datos como necesite. Cada instancia de base de datos tiene su propio conjunto de reglas de seguridad de bases de datos en tiempo real de Firebase, para que puedas ajustar el acceso a tus datos.

Puede crear y administrar instancias de bases de datos en Firebase console o utilizando la API REST de administración de bases de datos en tiempo real .

Edite e implemente reglas de seguridad de bases de datos en tiempo real para cada instancia

Asegúrese de que sus reglas de seguridad de bases de datos en tiempo real permitan el acceso adecuado a cada instancia de base de datos en su proyecto. Cada base de datos tiene su propio conjunto de reglas, que puedes editar e implementar desde Firebase console o usar Firebase CLI para implementar objetivos .

  • Para editar e implementar reglas desde Firebase console, sigue estos pasos:

    1. Vaya a la pestaña Reglas en la sección Desarrollar > Base de datos .
    2. Seleccione la base de datos que desea editar y luego modifique las reglas.
  • Para editar e implementar reglas desde Firebase CLI, siga estos pasos:

    1. Modifique las reglas en los archivos de reglas para las instancias de su base de datos (por ejemplo, foo.rules.json ).
    2. Cree y aplique objetivos de implementación para asociar bases de datos que utilicen el mismo archivo de reglas. Por ejemplo:
      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3
    3. Actualice su archivo de configuración firebase.json con los objetivos de implementación:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. Ejecute el comando de implementación:

      firebase deploy

Asegúrese de editar e implementar reglas constantemente desde el mismo lugar. La implementación de reglas desde Firebase CLI anula cualquier edición que hayas realizado en Firebase console, y la edición de reglas directamente en Firebase console anula cualquier cambio reciente que hayas implementado a través de Firebase CLI.

Conecte su aplicación a múltiples instancias de bases de datos

Utilice la referencia de la base de datos para acceder a los datos almacenados en instancias de bases de datos secundarias. Puede obtener la referencia de una instancia de base de datos específica mediante URL o aplicación. Si no especifica una URL, obtendrá la referencia de la instancia de base de datos predeterminada de la aplicación.

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);
Rápido
Nota: Este producto de Firebase no está disponible en el destino del clip de aplicación.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Obtenga una instancia de base de datos secundaria mediante URL var ref: DatabaseReference! ref = Base de datos.base de datos("https://testapp-1234.firebaseio.com").referencia()
C objetivo
Nota: Este producto de Firebase no está disponible en el destino del clip de aplicación.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Obtener una instancia de base de datos secundaria mediante URL @property (fuerte, no atómica) FIRDatabaseReference *ref; self.ref = [[FIRDatabase base de datos conURL:@"https://testapp-1234.firebaseio.com"] referencia];

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

Especificar una instancia al usar Firebase CLI

Utilice la opción --instance para especificar a qué Firebase Realtime Database desea aplicar un comando de Firebase CLI. Por ejemplo, use el siguiente comando para ejecutar el generador de perfiles para una instancia de base de datos denominada my-example-shard.firebaseio.com :

firebase database:profile --instance "my-example-shard"

Optimizar las conexiones en cada base de datos.

Si cada cliente necesita conectarse a varias bases de datos durante una sesión, puede reducir la cantidad de conexiones simultáneas a cada instancia de base de datos conectándose a cada instancia de base de datos solo durante el tiempo que sea necesario.

Obtenga más consejos

Si necesita más ayuda para dividir sus datos en varias instancias de bases de datos, comuníquese con los expertos de Firebase en nuestro canal de Slack o en Stack Overflow .