Stockage des données dans ThingWorx
ThingWorx fournit des entités et des méthodes pour le stockage de données. Il est ainsi possible de stocker des données dans des tables de données, des propriétés d'objet, des flux, des flux de valeurs et des tables de configuration.
Lorsque vous développez votre solution, vous devez prendre en considération la façon dont ThingWorx gère le stockage des données. Choisir le mode de stockage approprié est essentiel, car il impacte le résultat du projet, son évolutivité, sa fiabilité, ainsi que l'expérience de l'utilisateur.
La section suivante décrit les options de stockage du modèle ThingWorx :
Tables de données
Utilisez une table de données si le nombre de lignes de données est inférieur à 100 000.
Utilisez-la pour les jeux de données et les tables de recherche statiques. Pour les jeux de données hautement dynamiques et volumineux, utilisez une base de données relationnelle connectée via un modèle d'objet Database.
* 
Utilisez une base de données relationnelle pour les requêtes et les jointures complexes.
Utilisez une table de données pour les requêtes et le stockage basés sur des clés, et pour faciliter les mises à jour et suppressions en fonction de la clé primaire.
Par exemple : vous pouvez stocker les informations d'inventaire d'un distributeur automatique connecté intelligent, où chaque élément de l'inventaire est une clé primaire. Vous pouvez également utiliser des tables de données pour stocker des informations concernant les programmes d'irrigation disponibles pour un appareil de gestion des cultures, où chaque programme d'irrigation est une ligne avec une clé primaire.
Pour manipuler ou interroger les données ligne par ligne, utilisez des tables de données.
Utilisez des index lorsque vous vous servez de tables de données.
Propriété d'objet
Utilisez les propriétés d'objet pour stocker les données relatives à un objet dans ThingWorx. Les propriétés offrent les options de stockage de données suivantes :
Lecture seule : utilisez l'option de lecture seule pour les valeurs statiques qui ne doivent pas être modifiées à l'exécution. Toutefois, si vous le souhaitez, vous pouvez modifier la valeur par défaut.
Persistance : utilisez l'option de persistance si vous souhaitez que la valeur de la propriété soit enregistrée même après un redémarrage du serveur ThingWorx, et si la valeur de la propriété peut être modifiée à l'exécution.
Journalisation : utilisez l'option de journalisation pour les propriétés dont les valeurs sont constamment mises à jour. Il s'agit de données de séries temporelles qui peuvent être stockées dans des flux de valeurs.
* 
N'utilisez pas de propriétés explicites pour stocker les données historiques. Utilisez plutôt des flux ou des flux de valeurs.
Flux
Utilisez des flux pour consigner les événements de processus ponctuels ou les activités de vos appareils.
Par exemple, créez un flux pour consigner les problèmes relatifs aux activités de votre appareil, ou pour enregistrer le moment où votre appareil se déconnecte de ThingWorx Platform et s'y reconnecte. Les flux sont optimisés pour l'écriture à grande vitesse et ils disposent d'un système de cache configurable.
Flux de valeurs
Utilisez les flux de valeurs pour stocker les données de séries temporelles obtenues auprès des propriétés d'un objet.
Avec les flux, des tables de données sont créées. Les flux de valeurs évitent la création de tables de données contenant peu de données.
Cet accès (centré sur les objets) aux données dans un flux de valeurs fournit une prise en charge intégrée pour une architecture mutualisée.
Si vous utilisez un système de gestion de base de données relationnelle (PostgreSQL, MSSQL), tous les enregistrements sont écrits dans la même table de la base de données, même s'ils proviennent de flux de valeurs différents pour des objets différents.
Si vous utilisez PostgreSQL, chaque ligne contient l'enregistrement d'une seule propriété dans la table de ValueStream de la base de données PostgreSQL. Cela signifie que le flux de valeurs effectue un suivi du changement de valeur de chaque propriété, de façon indépendante. Après avoir utilisé le service QueryPropertyHistory, il vérifie le flux de données de chaque propriété de l'objet et collecte toutes les mises à jour les plus récentes (chacune avec une heure de mise à jour différente) dans un seul résultat de table d'informations.
La table suivante détaille les principales différences entre les flux et les flux de valeurs. Consultez-les pour déterminer le type d'entité à utiliser pour stocker les données de séries temporelles dans votre solution :
Flux
Flux de valeurs
Les flux peuvent stocker n'importe quel type de données de séries temporelles.
Les flux de valeurs peuvent stocker les données de séries temporelles provenant de la propriété d'un objet.
Les flux de valeurs sont liés aux propriétés d'un objet.
Vous pouvez directement interroger les données de flux en utilisant leurs propres services. Le résultat de la requête renvoie la totalité de la ligne de données.
Vous ne pouvez pas directement interroger les données des flux de valeurs. Utilisez à la place les services définis sur l'objet pour interroger les données du flux de valeurs. Par exemple : QueryPropertyHistory
Pour ajouter une ligne de données à un flux, utilisez le service WritePropertiesToStream.
Pour ajouter des données à un flux de valeurs, cochez la case Journalisé pour une propriété.
Les flux peuvent stocker des données contextuelles. Par exemple, chaque fois qu'un événement spécifique est déclenché, vous pouvez ajouter les valeurs des autres propriétés. Cela facilite l'analyse des données.
Les flux de valeurs ne peuvent pas stocker de données contextuelles.
Quand utiliser des flux ou des flux de valeurs ?
Utilisez des flux et des flux de valeurs pour stocker et récupérer des données de séries temporelles. En fonction de la quantité de données à stocker, sélectionnez l'option de stockage de données appropriée.
Utilisez des flux lorsque vous souhaitez interroger des données uniquement sur des courtes périodes.
Divisez les objets entre plusieurs flux de valeurs pour améliorer les performances d'index.
Table de configuration
Utilisez des tables de configuration pour créer des solutions personnalisables qui peuvent être mises à niveau en toute sécurité sur ThingWorx Platform.
Vous pouvez ajouter une table de configuration sur une entité d'application composite basée sur une forme de données prédéfinie. Cela simplifie le processus de création d'applications composites d'extension personnalisables, tout en prenant toujours en charge les mises à niveau sur place, les valeurs de la table de configuration étant reportées lors des mises à niveau d'extension.
Récupération après une interruption de la base de données pour les fournisseurs de données
En cas de redémarrage ou d'interruption de la base de données, si les données ingérées n'ont pas pu persister chez les fournisseurs de données, vous pouvez configurer le système pour qu'il retente ces opérations afin d'éviter toute perte de données en définissant les propriétés configurables ci-après pour la persistance requise côté fournisseur dans platform-settings.json :
acquireRetryAttempts : définit le nombre maximal de tentatives de ThingWorx pour acquérir une nouvelle connexion à partir de la base de données.
acquireRetryDelay : délai (en millisecondes) attendu par ThingWorx entre chaque tentative.
En conséquence, ThingWorx effectuera jusqu'à acquireRetryAttempts tentatives espacées de acquireRetryDelay, en fonction des paramètres configurés (par exemple, si ThingWorx doit attendre 5 secondes que la base de données soit à nouveau en ligne, définissez acquireRetryAttempts=5 et acquireRetryDelay=1000).
Si toutes les tentatives échouent, le message d'erreur suivant est consigné dans ApplicationLog pour indiquer que les entrées n'ont pas pu persister : Failed to connect to persistence provider after retrying 5 times in 10 seconds.
* 
Il n'est pas recommandé de définir une valeur acquireRetryAttempts inférieure ou égale à zéro, car l'application retentera indéfiniment de rendre persistantes les entrées, ce qui risquerait de bloquer la plateforme en cas d'interruption prolongée de la base de données.
Lors de l'utilisation d'InfluxDB en tant que fournisseur de persistance facultatif, vous devez configurer DatabaseWriteRetryAttempts pour qu'il retente les opérations de base de données le nombre de fois configuré.
* 
Pour les propriétés persistantes et consignées, une perte de données très mineure est inévitable en raison du traitement par lots. Dans ce type de scénario, les messages suivants seront consignés dans ApplicationLog :
Pour la propriété persistante : BatchUpdateException error occurred executing batch update of persistent properties.
Pour les propriétés consignées ou l'ingestion ValueStream : Error executing batch.
* 
La taille de la file d'attente doit être configurée de manière appropriée pour conserver les données en fonction de la vitesse d'ingestion.
Lors de l'utilisation d'InfluxDB en tant que fournisseur de persistance facultatif, vous devez configurer DatabaseWriteRetryAttempts pour qu'il retente les opérations de base de données le nombre de fois configuré.
* 
Pour les propriétés persistantes et consignées, une perte de données très mineure est inévitable en raison du traitement par lots. Dans ce type de scénario, les messages suivants seront consignés dans ApplicationLog :
Pour la propriété persistante : BatchUpdateException error occurred executing batch update of persistent properties.
Pour les propriétés consignées ou l'ingestion ValueStream : Error executing batch.
* 
La taille de la file d'attente doit être configurée de manière appropriée pour conserver les données en fonction de la vitesse d'ingestion.
Pour plus d'informations sur les performances, consultez la rubrique Rapport de performances.
Bonnes pratiques en matière de gestion de la modélisation centrée sur les données
Utilisez les bonnes pratiques générales suivantes pour gérer la modélisation centrée sur les données dans ThingWorx :
Si vous avez des données qui restent inchangés, ou qui seront remplacées la prochaine fois qu'elles seront modifiées/chargées, et qu'elles sont associées à un objet, créez une propriété de table d'informations pour cet objet et affectez-lui la forme de données appropriée. Ainsi, vous pouvez accéder aux données par l'intermédiaire de l'objet. Vous pouvez également utiliser des tables de configuration ou, en cas de quantités importantes de données, une table de données.
Utilisez autant que possible la mise en cache des données.
Par exemple, au lieu d'interroger la base de données pour chaque événement DataChange, implémentez un cache, en tant que table d'informations, qui est actualisé à des intervalles définis.
Archivez les données dont vous n'avez plus besoin.
Lors de la conception de votre solution, vous devez déterminer les données fréquemment utilisées. Vous pouvez stocker ces données dans la base de données de solution. Déplacez dès que possible les anciennes données vers un serveur externe, tel qu'une instance fédérée ThingWorx ou un serveur de base de données.
Indiquez les dates de début et de fin dans les méthodes de requête afin de limiter la quantité de données récupérées par la requête. Cela permet de réduire le temps de traitement et d'améliorer les performances.
Pour les cas d'ingestion de volumes élevés de données (supérieurs aux taux d'ingestion décrits dans le manuel anglais ThingWorx Platform Sizing Guide (Guide de dimensionnement de ThingWorx Platform)), envisagez de créer plusieurs fournisseurs de persistance qui se connectent à des instances de base de données distinctes. Cela permet de s'assurer que les données sont placées dans différentes tables de la base de données. Si vous ajoutez plusieurs bases de données, les fournisseurs de persistance peuvent pointer vers des bases de données spécifiques. Dans ce cas, une migration des données est nécessaire.
Assurez-vous que vos tables de données comportent moins de 100 000 lignes.
L'interrogation des données de tables de données et de flux ne doit prendre que quelques secondes. Si ces tables de données et ces flux comportent plus de 100 000 lignes, les requêtes prendront du temps.
Assurez-vous de planifier la façon dont vous souhaitez purger vos anciennes données. La purge des données est importante, car elle contribue à améliorer les performances d'une solution.
Est-ce que cela a été utile ?