Optimiser les performances de la base de données

Il existe différentes façons d'améliorer les performances de votre application Firebase Realtime Database. Pour savoir comment optimiser les performances de votre Realtime Database, collectez des données à l'aide des différents outils de surveillance Realtime Database, puis apportez les modifications nécessaires à votre application ou utilisez Realtime Database en conséquence.

Surveiller les performances de Realtime Database

Vous pouvez collecter des données sur les performances de votre Realtime Database à l'aide de différents outils, en fonction du niveau de précision dont vous avez besoin :

  • Aperçu général : utilisez l'outil de profilage pour obtenir la liste des requêtes non indexées et un aperçu en temps réel des opérations de lecture/écriture.
  • Estimation de l'utilisation facturée : utilisez les métriques d'utilisation disponibles dans la console Firebase pour consulter votre utilisation facturée et vos métriques de performances générales.
  • Analyse détaillée : utilisez Cloud Monitoring pour examiner plus en détail les performances de votre base de données au fil du temps.

Améliorer les performances par métrique

Une fois que vous avez collecté des données, explorez les bonnes pratiques et stratégies suivantes en fonction du domaine de performances que vous souhaitez améliorer.

Stratégies d'amélioration des performances en un coup d'œil
Métrique Description Bonnes pratiques
Charge/Utilisation Optimisez la capacité de votre base de données utilisée pour traiter les requêtes à tout moment (reflétée dans les métriques **Charge** ou **io/database_load**). Optimiser la structure de vos données
Répartir les données dans plusieurs bases de données
Améliorer l'efficacité des écouteurs
Limiter les téléchargements avec des règles basées sur des requêtes
Optimiser les connexions
Connexions actives Équilibrez le nombre de connexions actives et simultanées à votre base de données pour ne pas dépasser la limite de 200 000 connexions. Répartir les données dans plusieurs bases de données
Réduire les nouvelles connexions
Bande passante sortante Si le nombre de téléchargements à partir de votre base de données vous semble trop élevé, vous pouvez améliorer l'efficacité de vos opérations de lecture et réduire la surcharge de chiffrement. Optimiser les connexions
Optimiser la structure de vos données
Limiter les téléchargements avec des règles basées sur des requêtes
Réutiliser les sessions SSL
Améliorer l'efficacité des écouteurs
Restreindre l'accès aux données
Stockage Assurez-vous de ne pas stocker de données inutilisées ou répartissez vos données stockées dans d'autres bases de données et/ou produits Firebase pour rester sous le quota. Nettoyer les données inutilisées
Optimiser la structure de vos données
Répartir les données dans plusieurs bases de données
Utiliser Cloud Storage for Firebase

Optimiser les connexions

Les requêtes RESTful telles que GET et PUT nécessitent toujours une connexion, même si celle-ci est de courte durée. Ces connexions fréquentes et de courte durée peuvent en réalité entraîner des coûts de connexion, une charge de base de données et une bande passante sortante beaucoup plus importants que les connexions actives en temps réel à votre base de données.

Dans la mesure du possible, utilisez les SDK natifs pour la plate-forme de votre application au lieu de l'API REST. Les SDK maintiennent des connexions ouvertes, ce qui réduit les coûts de chiffrement SSL et la charge de la base de données qui peuvent s'accumuler avec l'API REST.

Si vous utilisez l'API REST, envisagez d'utiliser un keep-alive HTTP pour maintenir une connexion ouverte ou d'utiliser les événements envoyés par le serveur, qui peuvent réduire les coûts liés aux négociations SSL.

Répartir les données dans plusieurs bases de données

La répartition de vos données sur plusieurs instances Realtime Database, également appelée sharding de base de données, présente trois avantages :

  1. Augmentez le nombre total de connexions actives et simultanées autorisées sur votre application en les répartissant sur plusieurs instances de base de données.
  2. Équilibrez la charge entre les instances de base de données.
  3. Si vous disposez de groupes d'utilisateurs indépendants qui n'ont besoin d'accéder qu'à des ensembles de données distincts, utilisez différentes instances de base de données pour obtenir un débit plus élevé et une latence plus faible.

Si vous avez souscrit le forfait Blaze, vous pouvez créer plusieurs instances de base de données dans le même projet Firebase, en utilisant une méthode d'authentification utilisateur commune à toutes les instances de base de données.

Découvrez comment et quand fragmenter les données.

Créer des structures de données efficaces

Étant donné que Realtime Database récupère les données des nœuds enfants d'un chemin d'accès ainsi que le chemin d'accès lui-même, il est judicieux de conserver une structure de données aussi plate que possible. Vous pouvez ainsi récupérer de manière sélective les données dont vous avez besoin, sans télécharger de données inutiles sur les clients.

En particulier, tenez compte des écritures et des suppressions lorsque vous structurez vos données. Par exemple, les chemins comportant des milliers de feuilles peuvent être coûteux à supprimer. Les fractionner en chemins avec plusieurs sous-arbres et moins de feuilles par nœud peut accélérer les suppressions.

De plus, chaque écriture peut représenter jusqu'à 0,1 % de l'utilisation totale de votre base de données. Structurez vos données de manière à pouvoir regrouper les écritures dans une seule opération en tant que mises à jour multipath via les méthodes update() dans les SDK ou les requêtes RESTful PATCH.

Pour optimiser la structure de vos données et améliorer vos performances, suivez les bonnes pratiques concernant les structures de données.

Empêcher les accès non autorisés

Empêchez les opérations non autorisées sur votre base de données avec Realtime Database Security Rules. Par exemple, l'utilisation de règles peut éviter un scénario dans lequel un utilisateur malveillant télécharge à plusieurs reprises l'intégralité de votre base de données.

En savoir plus sur l'utilisation des règles Firebase Realtime Database

Utiliser des règles basées sur des requêtes pour limiter les téléchargements

Realtime Database Security Rules permettent de restreindre l'accès aux données de votre base de données, mais peuvent également servir de limites pour les données renvoyées par les opérations de lecture. Lorsque vous utilisez des règles basées sur des requêtes, telles que définies par des expressions query. comme query.limitToFirst, les requêtes ne récupèrent que les données limitées par la règle.

Par exemple, la règle suivante limite l'accès en lecture aux 1 000 premiers résultats d'une requête, classés par priorité :

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

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

En savoir plus sur Realtime Database Security Rules.

Index des requêtes

L'indexation de vos données réduit la bande passante totale que vous utilisez pour chaque requête exécutée par votre application.

Réutiliser les sessions SSL

Réduisez les frais généraux de chiffrement SSL sur les connexions reprises en émettant des tickets de session TLS. Cela est particulièrement utile si vous avez besoin de connexions sécurisées fréquentes à la base de données.

Améliorer l'efficacité des auditeurs

Placez vos auditeurs le plus loin possible dans le parcours pour limiter la quantité de données qu'ils synchronisent. Vos auditeurs doivent être proches des données que vous souhaitez qu'ils obtiennent. N'écoutez pas à la racine de la base de données, car cela entraîne le téléchargement de l'intégralité de votre base de données.

Ajoutez des requêtes pour limiter les données renvoyées par vos opérations d'écoute et utilisez des écouteurs qui ne téléchargent que les mises à jour des données (par exemple, on() au lieu de once()). Réservez .once() aux actions qui ne nécessitent vraiment pas de mise à jour des données. De plus, dans la mesure du possible, triez vos requêtes à l'aide de orderByKey() pour obtenir les meilleures performances. Le tri avec orderByChild() peut être 6 à 8 fois plus lent, et le tri avec orderByValue() peut être très lent pour les grands ensembles de données, car il nécessite une lecture de l'intégralité de l'emplacement à partir de la couche de persistance.

Veillez également à ajouter des écouteurs de manière dynamique et à les supprimer lorsqu'ils ne sont plus nécessaires.

Nettoyer les données inutilisées

Supprimez régulièrement les données inutilisées ou en double de votre base de données. Vous pouvez exécuter des sauvegardes pour inspecter manuellement vos données ou les sauvegarder régulièrement dans un bucket Google Cloud Storage. Vous pouvez également envisager d'héberger les données stockées via Cloud Storage for Firebase.

Expédier du code évolutif que vous pouvez mettre à jour

Les applications intégrées aux appareils IoT doivent inclure un code évolutif que vous pouvez mettre à jour facilement. Veillez à tester minutieusement les cas d'utilisation, à tenir compte des scénarios dans lesquels votre base d'utilisateurs pourrait croître de manière exponentielle et à intégrer la possibilité de déployer des mises à jour de votre code. Réfléchissez bien aux changements majeurs que vous pourriez avoir à apporter par la suite, par exemple si vous décidez de partitionner vos données.