hermes-server
Explications sur le fonctionnement ou la structure de certains composants clés d’hermes-server.
Explications sur le fonctionnement ou la structure de certains composants clés d’hermes-server.
hermes-server
commit_one
du modèle de données le cas échéantcommit_all
du modèle de données le cas échéantupdateInterval
et recommence à partir de l’étape 3.
si l’application n’a pas été invitée à s’arrêterSi une exception est levée à l’étape 2.
, cette étape est recommencée jusqu’à ce qu’elle réussisse.
Si une exception est levée aux étapes 3.
à 7.
, le cache est enregistré sur le disque et le serveur recommence à partir de l’étape 3.
.
Hermes-server peut gérer plusieurs types de données, avec des liens (clés étrangères) entre eux, et peut leur appliquer des contraintes d’intégrité.
Illustrons cela avec un cas d’utilisation typique d’utilisateurs / groupes / membres de groupes.
classDiagram direction BT GroupsMembers <-- Users GroupsMembers <-- Groups class Users{ user_id ... } class Groups{ group_id ... } class GroupsMembers{ user_id group_id integrity() _SELF.user_id in Users_pkeys and _SELF.group_id in Groups_pkeys }
Dans ce scénario, les entrées dans GroupsMembers
qui ont un user_id
qui n’existe pas dans Users
, ou un group_id
qui n’existe pas dans Groups
seront ignorées silencieusement.
Pour plus de détails, veuillez consulter integrity_constraints dans la configuration d’hermes-server.
Dans un scénario multi-sources, Hermes peut aggréger les entrées provenant de plusieurs sources comme si elles provenaient d’une seule, et éventuellement appliquer des contraintes d’agrégation pour garantir la cohérence des données.
Prenons un cas d’utilisation, avec un ensemble de données universitaires utilisées par Hermes pour gérer les comptes utilisateurs. Les données du personnel et des étudiants sont stockées sur deux sources de données distinctes. Hermes pourra fusionner les deux sources de données dans un seul type Users
virtuel, tout en s’assurant qu’il n’y ait pas de collision entre les clés primaires.
Ici, nous avons deux sources de données distinctes pour un même type de données.
classDiagram direction BT Users <|-- Users_employee Users <|-- Users_students class Users{ user_id login mail merge_constraints() s.user_id mustNotExist in e.user_id } class Users_students{ s.user_id s.login s.mail } class Users_employee{ e.user_id e.login e.mail }
Dans ce scénario, les entrées dans Users_students
qui ont un user_id
qui existe dans Users_employee
seront ignorées silencieusement.
Mais les entrées dans Users_employee
qui ont un user_id
qui existe dans Users_students
seront toujours traitées.
Pour plus de détails, veuillez consulter pkey_merge_constraint et merge_constraints dans la configuration d’hermes-server.
Dans un scénario multi-sources, Hermes peut recomposer des entrées provenant de plusieurs sources en fusionnant leurs données et en définissant éventuellement des contraintes de fusion pour assurer la cohérence des données.
Prenons un cas d’utilisation, où Hermes gère des comptes utilisateurs. Les données principales et le nom du profil wifi sont stockés sur deux sources de données distinctes. Hermes pourra agréger les deux sources de données dans un seul objet Users
virtuel, tout en s’assurant que les clés primaires de la seconde source existent dans la première.
Ici, nous avons deux sources de données distinctes pour une même entrée.
classDiagram direction BT Users <|-- Users_main Users <|-- Users_auxiliary class Users{ user_id login mail wifi_profile merge_constraints() a.user_id mustAlreadyExist in m.user_id } class Users_auxiliary{ a.user_id a.wifi_profile } class Users_main{ m.user_id m.login m.mail }
Dans ce scénario, les entrées dans Users_auxiliary
qui ont un user_id
qui n’existe pas dans Users_main
seront ignorées silencieusement.
Mais les entrées dans Users_main
qui ont un user_id
qui n’existe pas dans Users_auxiliary
seront traitées, et donc l’entrée Users
résultante n’aura pas de valeur wifi_profile
.
Pour plus de détails, veuillez consulter pkey_merge_constraint et merge_constraints dans la configuration d’hermes-server.
Un événement appartient toujours à l’une de ces catégories :
base
: événement standard, peut être de type :
dataschema
: propage le nouveau schéma de données aux clients, après une mise à jour du modèle de données du serveuradded
: une nouvelle entrée a été ajoutée au type de données spécifié, avec des attributs et des valeurs spécifiésremoved
: l’entrée de la clé primaire spécifiée a été supprimée du type de données spécifiémodified
: l’entrée de la clé primaire spécifiée a été modifiée. Contient uniquement les attributs ajoutés, modifiés et supprimés avec leurs nouvelles valeursinitsync
: indique que l’événement fait partie d’une séquence initsync, peut être de type :
init-start
: début d’une séquence initsync, contient également le schéma de données actueladded
: une nouvelle entrée a été ajoutée au type de données spécifié, avec les attributs et les valeurs spécifiés. Lorsque le serveur envoie le contenu de son cache pour initialiser les clients, les entrées ne peuvent qu’être ajoutéesinit-stop
: fin d’une séquence initsyncContient l’état du serveur :
lastUpdate: datetime.datetime | None
Date et heure de la dernière mise à jour.
errors: dict[str, dict[str, dict[str, Any]]]
Dictionnaire contenant les erreurs actuelles, pour pouvoir notifier de tout changement.
exception: str | None
Chaîne contenant la dernière trace d’exception.
Contient le schéma de données, construit depuis le modèle de données. Ce fichier cache permet au serveur de traiter l’étape 2.
de Workflow.
Un fichier par type de données déclaré dans Datamodel, contenant le cache des données de ce type de données, sous forme de liste de dictionnaires. Chaque dictionnaire de la liste représente une entrée.