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
Se recomienda 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 estás en el plan de precios Blaze, puedes crear varias instancias de bases de datos en el mismo proyecto de Firebase.
- En Firebase console, ve a la pestaña Datos de 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 reglas de seguridad de Firebase Realtime Database para que puedas 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 las reglas de seguridad de Realtime Database para cada instancia
Asegúrate de haber configurado las reglas de seguridad de Realtime Database para otorgar el acceso correspondiente 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 mediante Firebase CLI para implementar objetivos.
Para editar e 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. Si implementas reglas desde Firebase CLI, se anulan todos los cambios que hayas hecho en Firebase console. Si editas reglas directamente en Firebase console, se anulan todos los cambios recientes que hayas implementado mediante 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 de una instancia específica de base de datos por URL o app. Si no especificas una URL, obtendrás la referencia de la instancia predeterminada de la base de datos de la app.
API modular 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);
API con espacio de nombres 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()
Objective-C
// Get the default database instance for an app@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] 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é instancia de Firebase Realtime Database quieres aplicar un comando de Firebase CLI. Por ejemplo, usa el siguiente comando a fin de 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.