La mejor manera de optimizar el rendimiento y escalar tus datos en Firebase Realtime Database es dividirlos en varias instancias de Realtime Database. Este proceso también se conoce como fragmentación de bases de datos. La fragmentación te da la flexibilidad de escalar más allá de los límites que se aplican a instancias de base de datos individuales, además del balanceo de cargas y la optimización de rendimiento.
Cuándo fragmentar tus datos
Podría ser conveniente fragmentar tus datos en varias bases de datos si usas Realtime Database en cualquiera de los siguientes contextos:
- Si quieres ajustar la escala más allá del límite de 200,000 conexiones simultáneas, 1,000 operaciones de escritura por segundo o cualquiera de los demás límites de una única instancia de base de datos.
- Si dispones de varios conjuntos de datos discretos y deseas optimizar el rendimiento (por ejemplo, una app de chat que usan grupos de usuarios independientes y separados).
- Si deseas balancear la carga en varias bases de datos para mejorar el tiempo de actividad y reducir el riesgo de sobrecargar una sola instancia de base de datos.
Cómo fragmentar tus datos
Para fragmentar tus datos, sigue estos pasos (que se describen en más detalle a continuación):
- Asigna tus datos a varias bases de datos según las necesidades específicas de tu app.
- Crea varias instancias de bases de datos.
- Configura tu app para que se conecte a la instancia de Realtime Database necesaria para cada conjunto de datos.
Asigna tus datos
Cuando estés asignando tus datos a varias bases de datos, intenta reunir las siguientes condiciones:
- Cada consulta solo se ejecuta en una única instancia de base de datos. Realtime Database no admite consultas en varias instancias de base de datos.
- Los datos no se comparten ni duplican entre las instancias de base de datos (ni siquiera mínimamente).
- Cada instancia de app solo se conecta a una base de datos en un momento específico.
Cuando estés asignando tus datos, considera aplicar las siguientes estrategias:
Crear un “fragmento principal”
Guarda un mapa de la forma en que se almacena tu información en las instancias de base de datos. Así, puedes buscar de manera programática qué instancia de base de datos corresponde al cliente que se está conectando. Recuerda que esto podría generar más gastos que conectarte directamente a la base de datos específica que necesitas, en el momento en que la necesitas.
Crear buckets de datos por categorías o por cliente
Almacena información en instancias de bases de datos aisladas, agrupadas por usuario o tipo de datos. Por ejemplo, si creas una aplicación de chat que usan varias organizaciones, puedes crear una instancia de base de datos para cada organización y almacenar todos los datos de 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 tus bases de datos y solo realizas 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 app de chat.
Luego, puedes crear varias instancias de base de datos con antelación 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 A de Realtime Database.
La forma de asignar datos para tu app depende de tu caso de uso específico, pero las condiciones y estrategias descritas anteriormente pueden ayudarte a definir qué puede funcionar para tus datos.
Crea varias instancias de Realtime Database
Si tienes el plan de precios Blaze, puedes crear hasta 1,000 instancias de bases de datos en el mismo proyecto de Firebase.
Firebase console con el menú contextual en la sección de bases de datos" />
- En Firebase console, ve a la pestaña Datos en la sección Desarrollo > Base de datos.
- Selecciona Crear nueva base de datos en el menú de la sección Realtime Database.
- Personaliza la Referencia de la base de datos y las Reglas de seguridad. Finalmente, haz clic en Entendido.
Repite el proceso para crear todas las instancias de base de datos que necesites. Cada instancia de base de datos tiene su propio conjunto de Firebase Realtime Database Security Rules, por lo que puedes optimizar el acceso a tus datos.
Puedes crear y administrar instancias de bases de datos en Firebase console o con la API de REST de Administración de Realtime Database.
Edita y, luego, implementa Realtime Database Security Rules para cada instancia
Asegúrate de que las Realtime Database Security Rules permitan el acceso adecuado a cada instancia de base de datos de tu proyecto. Cada base de datos tiene su propio conjunto de reglas, las cuales puedes editar y también implementar desde Firebase console o Firebase CLI para implementar objetivos.
Para editar y también implementar reglas desde Firebase console, sigue estos pasos:
- Ve a la pestaña Reglas de la sección Desarrollo > Base de datos.
- Selecciona la base de datos que deseas editar y modifica las reglas.
Para editar y también implementar reglas desde Firebase CLI, sigue estos pasos:
- Modifica las reglas en los archivos correspondientes para tus instancias de base de datos (por ejemplo,
foo.rules.json
). - Crea y aplica objetivos de implementación para asociar las bases de datos que usen 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
. Actualiza tu archivo de configuración
firebase.json
con los destinos de implementación:{ "database": [ {"target": "main", "rules": "foo.rules.json"}, {"target": "other", "rules": "bar.rules.json"} ] }
Ejecuta el comando de implementación:
firebase deploy
- Modifica las reglas en los archivos correspondientes para tus instancias de base de datos (por ejemplo,
Asegúrate de editar e implementar reglas con coherencia desde un mismo lugar. Con la implementación de reglas desde Firebase CLI, se anulan todos los cambios que hayas hecho en Firebase console y, con la edición directa de las reglas en Firebase console, se anulan todos los cambios recientes que hayas implementado a través de Firebase CLI.
Conecta tu app a varias instancias de base de datos
Usa la referencia de la base de datos para acceder a los datos almacenados en instancias de bases de datos secundarias. Puedes obtener la referencia para una instancia específica de base de datos por URL o app. Si no especificas una URL, obtendrás la referencia para la instancia predeterminada de base de datos de la app.
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()// Obtén una instancia de base de datos secundaria por URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
// Get the default database instance for an app@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];// Obtén una instancia de base de datos secundaria por URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] 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();
Especifica una instancia cuando uses Firebase CLI
Usa la opción --instance
para especificar a qué Firebase Realtime Database quieres
aplicar un comando de Firebase CLI. Por ejemplo, usa el siguiente comando para ejecutar
el generador de perfiles para una instancia de base de datos llamada my-example-shard.firebaseio.com
:
firebase database:profile --instance "my-example-shard"
Optimiza las conexiones en cada base de datos
Si cada cliente necesita conectarse a varias bases de datos durante una sesión, puedes reducir la cantidad de conexiones simultáneas a cada instancia de base de datos si te conectas a cada instancia de base de datos solo durante el tiempo necesario.
Obtén más consejos
Si necesitas más ayuda para fragmentar tus datos en varias instancias de base de datos, comunícate con los expertos de Firebase en nuestro canal de Slack o en Stack Overflow.