Il existe plusieurs façons d'améliorer les performances des Firebase Realtime Database dans votre application. Pour savoir ce que vous pouvez faire pour optimiser les performances de vos Realtime Database, collectez des données à l'aide des différents outils de surveillance des Realtime Database, puis apportez des modifications à votre application ou à votre utilisation des 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 plusieurs outils, en fonction du niveau de précision dont vous avez besoin:
- Présentation générale:utilisez l'outil Profiler pour obtenir la liste des requêtes non indexées et une présentation 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 afficher votre utilisation facturée et les métriques de performances globales.
- Analyse détaillée:utilisez Cloud Monitoring pour obtenir un aperçu plus détaillé des 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 les stratégies suivantes en fonction du domaine de performances que vous souhaitez améliorer.
Stratégies d'amélioration des performances en bref | ||
---|---|---|
Métrique | Description | Bonnes pratiques |
Charge/Utilisation | Optimisez la quantité de capacité de votre base de données utilisée pour traiter les requêtes à un moment donné (reflétée dans les métriques **Load** ou **io/database_load**). |
Optimisez la structure de vos données Segmentez les données entre les bases de données Améliorez l'efficacité des écouteurs Limitez les téléchargements à l'aide de règles basées sur les requêtes Optimisez les connexions |
Connexions actives | Équilibrez le nombre de connexions actives simultanées à votre base de données pour rester en dessous de la limite de 200 000 connexions. |
Diviser les données entre plusieurs bases de données Réduire le nombre de nouvelles connexions |
Bande passante sortante | Si les téléchargements à partir de votre base de données semblent plus élevés que vous le souhaitez, vous pouvez améliorer l'efficacité de vos opérations de lecture et réduire les coûts liés au chiffrement. |
Optimisez les connexions Optimisez la structure de vos données Limitez les téléchargements à l'aide de règles basées sur les requêtes Réutiliser les sessions SSL Améliorer l'efficacité des écouteurs Limiter 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 sur d'autres bases de données et/ou produits Firebase pour rester sous le quota. |
Éliminer les données inutilisées Optimiser la structure de vos données Segmenter les données entre les 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 bien plus élevés que les connexions actives en temps réel à votre base de données.
Dans la mesure du possible, utilisez les SDK natifs de la plate-forme de votre application plutôt que l'API REST. Les SDK maintiennent les 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 des événements envoyés par le serveur, ce qui peut réduire les coûts liés aux poignées de main SSL.
Divisez les données sur plusieurs bases de données.
Le fractionnement de vos données sur plusieurs instances Realtime Database, également appelé "fractionnement de base de données", présente trois avantages:
- Augmentez le nombre total de connexions actives simultanées autorisées dans votre application en les répartissant sur des instances de base de données.
- Équilibrez la charge entre les instances de base de données.
- 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 augmenter le débit et réduire la latence.
Si vous utilisez 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 pour toutes les instances de base de données.
Découvrez comment et quand partitionner des 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 ainsi que du chemin, il est judicieux de maintenir votre 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 auprès des clients.
En particulier, tenez compte des écritures et des suppressions lorsque vous structurez vos données. Par exemple, la suppression de chemins contenant des milliers de feuilles peut être coûteuse. Les diviser en chemins avec plusieurs sous-arbres et moins de feuilles par nœud peut accélérer les suppressions.
De plus, chaque écriture peut occuper 0,1% de l'utilisation totale de votre base de données.
Structurez vos données de manière à pouvoir effectuer des écritures par lot dans une seule opération en tant que mises à jour multicanaux via les méthodes update()
des SDK ou les requêtes PATCH
RESTful.
Pour optimiser votre structure de données et améliorer les 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 qu'un utilisateur malveillant ne télécharge à plusieurs reprises l'intégralité de votre base de données.
Découvrez comment utiliser les règles Firebase Realtime Database.
Utiliser des règles basées sur des requêtes pour limiter les téléchargements
Les Realtime Database Security Rules limitent l'accès aux données de votre base de données, mais peuvent également servir de limites aux données renvoyées via des opérations de lecture. Lorsque vous utilisez des règles basées sur des requêtes, telles que définies par des expressions query.
telles que 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.
Requêtes indexées
L'indexation de vos données réduit la bande passante totale utilisée pour chaque requête exécutée par votre application.
Réutiliser les sessions SSL
Réduisez les coûts indirects du chiffrement SSL sur les connexions reprises en émettant des billets de session TLS. Cela est particulièrement utile si vous avez besoin de connexions fréquentes et sécurisées à la base de données.
Améliorer l'efficacité des auditeurs
Placez vos écouteurs aussi loin que possible dans le chemin d'accès 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înerait le téléchargement de l'intégralité de celle-ci.
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()
pour les actions qui ne nécessitent vraiment pas de mises à jour de données.
De plus, triez vos requêtes à l'aide de orderByKey()
, dans la mesure du possible, 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 ensembles de données volumineux, 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.
Éliminer 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. Envisagez également d'héberger les données stockées via Cloud Storage for Firebase.
Expédiez du code évolutif que vous pouvez mettre à jour
Les applications intégrées aux appareils IoT doivent inclure du code évolutif que vous pouvez facilement mettre à jour. Veillez à tester de manière approfondie les cas d'utilisation, à tenir compte des scénarios dans lesquels votre base d'utilisateurs est susceptible de croître de manière exponentielle et à permettre le déploiement de mises à jour de votre code. Réfléchissez attentivement aux modifications majeures que vous devrez peut-être apporter à l'avenir, par exemple si vous décidez de partitionner vos données.