Optimizar el rendimiento de la base de datos

Hay algunas formas diferentes de mejorar el rendimiento de Firebase Realtime Database en su aplicación. Para descubrir qué puede hacer para optimizar el rendimiento de Realtime Database, recopile datos a través de las diferentes herramientas de monitoreo de Realtime Database y luego realice cambios en su aplicación o en el uso de Realtime Database en consecuencia.

Supervisar el rendimiento de la base de datos en tiempo real

Puede recopilar datos sobre el rendimiento de su base de datos en tiempo real a través de algunas herramientas diferentes, según el nivel de granularidad que necesite:

  • Descripción general de alto nivel: utilice la herramienta Profiler para obtener una lista de consultas no indexadas y una descripción general en tiempo real de las operaciones de lectura/escritura.
  • Estimación de uso facturado: use las métricas de uso disponibles en Firebase console para ver su uso facturado y las métricas de rendimiento de alto nivel.
  • Desglose detallado: utilice Cloud Monitoring para obtener una visión más detallada del rendimiento de su base de datos a lo largo del tiempo.

Mejorar el rendimiento por métrica

Una vez que haya recopilado datos, explore las siguientes mejores prácticas y estrategias basadas en el área de desempeño que desea mejorar.

Estrategias de mejora del rendimiento de un vistazo
Métrico Descripción Mejores prácticas
Carga/Utilización Optimice la cantidad de capacidad de su base de datos que está en uso procesando solicitudes en un momento dado (reflejado en las métricas **Load** o **io/database_load**). Optimice su estructura de datos
Fragmentar datos en bases de datos
Mejorar la eficiencia del oyente
Limite las descargas con reglas basadas en consultas
Optimizar conexiones
Conexiones activas Equilibre la cantidad de conexiones activas simultáneas a su base de datos para mantenerse por debajo del límite de 200 000 conexiones. Fragmentar datos en bases de datos
Reducir nuevas conexiones
Ancho de banda saliente Si las descargas de su base de datos parecen mayores de lo que desea, puede mejorar la eficiencia de sus operaciones de lectura y reducir la sobrecarga de cifrado. Optimizar conexiones
Optimice su estructura de datos
Limite las descargas con reglas basadas en consultas
Reutilizar sesiones SSL
Mejorar la eficiencia del oyente
Restringir el acceso a los datos
Almacenamiento Asegúrate de no almacenar datos no utilizados o equilibra tus datos almacenados en otras bases de datos y/o productos de Firebase para permanecer dentro de la cuota. Limpiar datos no utilizados
Optimice su estructura de datos
Fragmentar datos en bases de datos
Utilice el almacenamiento en la nube para Firebase

Optimizar conexiones

Las solicitudes RESTful como GET y PUT aún requieren una conexión, aunque esa conexión sea de corta duración. Estas conexiones frecuentes y de corta duración en realidad pueden generar costos de conexión, carga de base de datos y ancho de banda saliente significativamente mayores que las conexiones activas en tiempo real a su base de datos.

Siempre que sea posible, utilice los SDK nativos para la plataforma de su aplicación, en lugar de la API REST. Los SDK mantienen conexiones abiertas, lo que reduce los costos de cifrado SSL y la carga de la base de datos que puede acumularse con la API REST.

Si usa la API REST, considere usar un HTTP keep-alive para mantener una conexión abierta o usar eventos enviados por el servidor , lo que puede reducir los costos de los protocolos de enlace SSL.

Fragmentar datos en múltiples bases de datos

Dividir sus datos en varias instancias de Realtime Database, también conocido como fragmentación de bases de datos, ofrece tres beneficios:

  1. Aumente el total de conexiones activas simultáneas permitidas en su aplicación dividiéndolas en instancias de bases de datos.
  2. Equilibre la carga entre instancias de bases de datos.
  3. Si tiene grupos independientes de usuarios que solo necesitan acceso a conjuntos de datos discretos, utilice diferentes instancias de bases de datos para obtener un mayor rendimiento y una menor latencia.

Si tiene el plan de precios Blaze , puede crear varias instancias de bases de datos dentro del mismo proyecto de Firebase, aprovechando un método de autenticación de usuario común en todas las instancias de bases de datos.

Obtenga más información sobre cómo y cuándo fragmentar datos .

Construya estructuras de datos eficientes

Debido a que Realtime Database recupera los datos de los nodos secundarios de una ruta, así como la ruta, tiene sentido mantener la estructura de datos lo más plana posible. De esta manera, puede recuperar selectivamente los datos que necesita, sin descargar datos innecesarios a los clientes.

En particular, considere las escrituras y eliminaciones cuando esté estructurando sus datos. Por ejemplo, eliminar caminos con miles de hojas es potencialmente costoso. Dividirlos en rutas con múltiples subárboles y menos hojas por nodo puede acelerar las eliminaciones.

Además, cada escritura puede representar el 0,1 % de la utilización total de la base de datos. Estructura tus datos de una manera que te permita realizar escrituras por lotes en una sola operación como actualizaciones de múltiples rutas a través de los métodos update() en los SDK o solicitudes RESTful PATCH .

Para optimizar su estructura de datos y mejorar el rendimiento, siga las mejores prácticas para estructuras de datos .

Evitar el acceso no autorizado

Evite operaciones no autorizadas en su base de datos con las reglas de seguridad de bases de datos en tiempo real. Por ejemplo, el uso de reglas podría evitar un escenario en el que un usuario malintencionado descargue repetidamente toda su base de datos.

Obtenga más información sobre el uso de las reglas de base de datos en tiempo real de Firebase .

Utilice reglas basadas en consultas para limitar las descargas

Las reglas de seguridad de bases de datos en tiempo real restringen el acceso a los datos de su base de datos, pero también pueden servir como límites para los datos devueltos mediante operaciones de lectura. Cuando utiliza reglas basadas en consultas, según lo definido por query. Expresiones como query.limitToFirst , las consultas solo recuperan los datos delimitados por la regla.

Por ejemplo, la siguiente regla limita el acceso de lectura solo a los primeros 1000 resultados de una consulta, ordenados por prioridad:

messages: {
  ".read": "query.orderByKey &&
            query.limitToFirst <= 1000"
}

// Example query:
db.ref("messages").limitToFirst(1000)
                  .orderByKey("value")

Obtenga más información sobre las reglas de seguridad de bases de datos en tiempo real .

Consultas de índice

La indexación de sus datos reduce el ancho de banda total que utiliza para cada consulta que ejecuta su aplicación.

Reutilizar sesiones SSL

Reduzca los costos generales de cifrado SSL en las conexiones reanudadas mediante la emisión de tickets de sesión TLS . Esto es particularmente útil si necesita conexiones frecuentes y seguras a la base de datos.

Mejorar la eficiencia del oyente

Coloque a sus oyentes lo más abajo posible en la ruta para limitar la cantidad de datos que sincronizan. Sus oyentes deben estar cerca de los datos que desea que obtengan. No escuche en la raíz de la base de datos, ya que eso resultará en descargas de toda su base de datos.

Agregue consultas para limitar los datos que devuelven sus operaciones de escucha y utilice escuchas que solo descarguen actualizaciones de datos (por ejemplo, on() en lugar de once() . Reserve .once() para acciones que realmente no requieren actualizaciones de datos. Además, ordene sus consultas utilizando orderByKey() , siempre que sea posible, para obtener el mejor rendimiento. Ordenar con orderByChild() puede ser de 6 a 8 veces más lento, y ordenar con orderByValue() puede ser muy lento para conjuntos de datos grandes, ya que requiere una lectura de la ubicación completa desde la capa de persistencia.

Asegúrese de agregar también oyentes dinámicamente y elimínelos cuando ya no sean necesarios.

Limpiar datos no utilizados

Elimine periódicamente cualquier dato no utilizado o duplicado en su base de datos. Puede ejecutar copias de seguridad para inspeccionar manualmente sus datos o realizar una copia de seguridad periódica en un depósito de Google Cloud Storage. Considere también alojar los datos almacenados a través de Cloud Storage para Firebase .

Envío de código escalable que puedes actualizar

Las aplicaciones integradas en dispositivos IoT deben incluir código escalable que pueda actualizar fácilmente. Asegúrese de probar los casos de uso minuciosamente, tener en cuenta escenarios en los que podría hacer crecer su base de usuarios de manera exponencial y desarrollar la capacidad de implementar actualizaciones en su código. Considere cuidadosamente los cambios importantes que podría necesitar realizar en el futuro, si, por ejemplo, decide fragmentar sus datos.