Le cache se constitue de trois composants :
Pour des informations plus approfondies sur le fonctionnement du cache, voir Fonctionnement du cache - Météo
Le data hub est un composant du module webui-module-service-weather qui a pour rôle de stocker les données des objets Weathers dans un espace mémoire partagé /dev/shm pour aider le cache à accéder rapidement au données à jour en cas de besoin.
Les données stockées par ce composant sont mises à jour grâce au composant Weather Updater
Au démarrage, le data hub va initialiser une liste de Weathers qu'il va stocker et mettre à disposition.
Lors de l'initialisation du composant, il va vérifier que le dossier dans lequel il va enregistrer les données des Weathers au format JSON.
Si le dossier n'existe pas, il va nous informer et le créer :
[YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ INIT ] The data hub folder FOLDER_PATH does not exists. Will create it |
Nous sommes informés du début de l'initialisation avec ce log :
[YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ INIT ] Starting check NB_WEATHERS Weathers |
Lors de l'initialisation d'un Data Hub, on vérifie si les données de chacun des éléments connus ne sont pas corrompues :
[YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ INIT ] Weather with uuid [ WEATHER_UUID ] successfully check |
Nous sommes informés de la fin de l'initialisation et du temps prit avec ce log :
[YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ INIT ] Check data in hub ended in [ ELAPSED_TIME ] seconds |
Le data hub fourni des Weahters qu'il garde à jour grâce à leur ID à condition qu'elles soient enregistrées.
La récupération d'une Weather nous est remontée dans les logs avec l'UUID de la Weather récupérée et le temps écoulé lors de la collecte dans le Data Hub :
[YYYY-MM-DD HH:MM:SS] DEBUG : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ GET ] Weather with uuid [ WEATHER_UUID ] retrieved in [ ELAPSED_TIME ] seconds |
Quand on demande une Weather alors que le Data Hub n'est pas initialisé, ce log est retourné. La demande a été effectuée trop tôt, il faut alors attendre un peu avant de réessayer.
[YYYY-MM-DD HH:MM:SS] ERROR : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ GET ] Cannot get the Weather with uuid [ WEATHER_UUID ] because the Data Hub is not initialized, please retry later |
Dans le cas où l'on demande une Weather qui n'est pas dans le Data Hub, cela signifie qu'il y a probablement une erreur dans l'URL utilisée pour l'affichée :
[YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ GET ] The Weather with uuid [ WEATHER_UUID ] was not found in the Data Hub |
Si on n'arrive pas à lire le fichier contenant les données de la Weather pour un soucis de format ( si par exemple le fichier est corrompu ) un log nous averti du problème et le Data Hub va tenter de réécrire le fichier avec des données saines
[YYYY-MM-DD HH:MM:SS] ERROR : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ GET ] [ SHARED MEMORY ] The Weather with uuid [ WEATHER_UUID ] could not be retrieved because its data is corrupted |
Il est possible d'enregistrer une nouvelle Weather ou une nouvelle version d'une Weather pour le garder à jour dans le data hub
Lors de l'enregistrement d'une Weather avec succès, un logs nous préviens du temps que ça a pris :
[YYYY-MM-DD HH:MM:SS] DEBUG : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ SAVE ] Weather with uuid [ WEATHER_UUID ] saved in [ ELAPSED_TIME ] seconds |
Si on essaye d'enregistrer une Weather alors que le Data Hub n'est pas initialisé, ce cas signifie que la requête a été effectuée trop tôt et il faut alors attendre un peu puis réessayer :
[YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ SAVE ] Cannot save the Weather with uuid [ WEATHER_UUID ] because the Data Hub is not initialized yet, please retry later |
Il est possible de demander au Data Hub la date de dernière modification d'une Weather, certaines erreurs peuvent apparaître lors de cette récupération
Si le Data Hub n'est pas initialisé, alors ce log apparait :
[YYYY-MM-DD HH:MM:SS] ERROR : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ GET LAST MODIF ] Cannot get the last modification time of Weather with uuid [ WEATHER_UUID ] because the data hub is not initialized, please retry later |
Si la Weather n'est pas enregistrée dans le Data Hub, alors ce log est lancé :
[YYYY-MM-DD HH:MM:SS] ERROR : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ GET LAST MODIF ] The Weather with uuid [ WEATHER_UUID ] was not found in the Data Hub |
La Weather dont on demande la suppression a été correctement retirée du Data Hub :
[YYYY-MM-DD HH:MM:SS] DEBUG : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ REMOVE ] The Weather with uuid [ WEATHER_UUID ] has been removed |
Si lors de la suppression de la Weather le Data Hub n'est pas encore initialisé, alors on a le log suivant :
[YYYY-MM-DD HH:MM:SS] ERROR : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ REMOVE ] Cannot remove the Weather with uuid [ WEATHER_UUID ] because the Data Hub is not initialized yet, please retry later |
Régulièrement, le data hub va effectuer une rétention des données qu'il garde.
[YYYY-MM-DD HH:MM:SS] WARNING: [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ RETENTION ] Retention done in [ ELAPSED_TIME ] seconds for NB_WEATHER_SAVED Weathers |
Ces logs peuvent survenir dans de nombreux cas différents. (chaque sauvegarde, sauvegarde de rétention, récupération de Weather, etc)
[YYYY-MM-DD HH:MM:SS] DEBUG : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ RETENTION ] [ INIT ] The path does not exist [ FILE_PATH ] was it move ? |
Ceci n'est pas considéré comme une erreur, car le fait que le fichier n'existe pas n'empêche pas le module de fonctionner, celui-ci le créera par la suite. |
Pour chaque sauvegarde, sauvegarde de rétention, récupération de Weather et récupération de date de modification d'une Weather, le Data Hub va interagir avec le système de fichiers, ce qui peut amener les erreurs suivantes :
[YYYY-MM-DD HH:MM:SS] ERROR : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ RETENTION ] [ READ ] No read access [ FILE_PATH ] |
[YYYY-MM-DD HH:MM:SS] ERROR : [ WEBUI_NAME ] [ webui-module-service-weather ] [ DATA HUB : ID_DATAHUB ] [ RETENTION ] [ READ ] No write access [ FILE_PATH ] |
Le Weather Updater est un composant qui va est chargé de deux choses :
Chaque Webui possède un unique Weather Writer qui va être chargé de maintenir à jour une liste des Weathers qui sont distribuées équitablement entre les Webui pour équilibrer la charge entre elles.
La tâche de distribution des Weathers ( ou élection des WebUI ) est faite par un autre copmosant, le Weather Controller ( voir Weather Controller ).
Les Writers vont ensuite régulièrement ( toutes les minutes ) tenir à jour les informations des Data Hub des weathers qui leur sont attribuées.
Une fois toutes ces étapes terminées, il ne reste plus qu'à lancer un Thread qui va tourner régulièrement pour maintenir à jour dans le Data Hub les Weathers qui lui sont attribuées.
[YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ WEATHER UPDATER : GROUP_NAME] [ INIT ] Starting to refresh [ WEATHER_COUNT ] Weathers each [ REFRESH_RATE ] seconds |
Au lancement du rafraichissement, un log nous informe des Weathers dont on va recalculer les données pour les enregistrer dans le Data Hub :
[YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ WEATHER UPDATER : GROUP_NAME ] [ REFRESH ] Refresh done : updated [ NB_WEATHERS ] Weathers in [ ELAPSED_TIME ] seconds |
Le WEATHER UPDATER peut aussi avoir la nécessitée de créer des Weathers si elles n'existent pas pour pouvoir les enregistrer en même temps dans le base de données et dans le data hub.
Dans le cas où la Weather n'existe pas, le Writer va initialiser l'objet pour l'enregistrer dans la base de données et dans le data hub :
[YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ WEATHER UPDATER : GROUP_NAME ] [ SAVE ] New Weather [ WEATHER_UUID ] added in Data Hub and Database |
Le Weather Controller est un composant utilisé par les WEATHER UPDATERs obtenir la liste des Weathers qu'il doit maintenir à jour
Ce composant se repose sur un fichier partagé entre les WebUI où l'on trouve les informations suivantes :
Ces informations permettent de répartir équitablement les Weathers entre les différentes WebUI, et de savoir quand une WebUI n'a pas écrit depuis trop longtemps. Dans ce cas, il peut être décidé de sortir la WebUI du fichier et de redistribuer ses Weathers si elle en a.
La redistribution ( ou élection ) est faite de sorte qu’il n'y ait pas de Weathers sans WebUI, et qu'elles soient réparties entre chaque WebUI équitablement pour redistribuer la charge de calcul du rafraichissement des données des Weathers. Il peut donc y avoir des WebUI sans Weathers ( s'il y a plus de Weathers que de WebUI ) mais pas l'inverse.
Afin de ne pas se retrouver avec des Weathers sans WebUI, une élection est demandée à chaque changement du nombre de WebUI inscrites :
Au démarrage de la WebUI, on va aller l'enregistrer :
[YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ WEATHER UPDATER : GROUP_NAME ] [ WEATHER CONTROLLER ] Registering the WebUI [ WEBUI_NAME ] |
Si la WebUI n'est pas déjà enregistrer, et qu'il n'y a pas d'autre WebUI déjà présentes, alors pas besoin de lancer d'élection pour le moment, on attribue toutes les Weathers existantes à cette première arrivante :
[YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ WEATHER UPDATER : GROUP_NAME ] [ WEATHER CONTROLLER ] The Webui [ WEBUI_NAME ] will now keep up to date these Weathers: WEATHER_ID1, WEATHER_ID2 ... |
Au besoin, une réélection peut être demandée. Les cas possibles sont les suivants :
[YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ WEATHER UPDATER : GROUP_NAME ] [ WEATHER CONTROLLER ] A WebUI reelection has been requested. Will equally redistribute all Weathers between these WebUI: WEBUI_00, WEBUI_01 ... |
Une fois la réélection terminée, un log nous informe du temps que ça a pris ainsi que des résultats, c’est-à-dire quelle WebUI va gérer telles Weathers :
[YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ WEATHER UPDATER : GROUP_NAME ] [ WEATHER CONTROLLER ] WebUI reelection done in [ ELAPSED_TIME ] seconds [YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ WEATHER UPDATER : GROUP_NAME ] [ WEATHER CONTROLLER ] The WebUI [ WEBUI_01 ] will now periodically refresh the following Weathers: WEATHER_01 [YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ WEATHER UPDATER : GROUP_NAME ] [ WEATHER CONTROLLER ] The WebUI [ WEBUI_02 ] will now periodically refresh the following Weathers: WEATHER_02 [YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ WEATHER UPDATER : GROUP_NAME ] [ WEATHER CONTROLLER ] The WebUI [ WEBUI_03 ] does not have to manage any Weather |
Lors de leur rafraichissement régulier des Weathers, les Writers vont demander la recherche des WebUI inactives ( si elles n'ont pas modifié leur Weathers depuis plus de 5 minutes ), si elles les trouvent elles vont être retirées du Weather Controller, et si elles ont des Weathers attribuées, une réélection va être demandée.
Si une WebUI inactive est trouvée, nous sommes au courant de pourquoi elle va être retirée.
[YYYY-MM-DD HH:MM:SS] WARNING: [ WEBUI_NAME ] [ webui-module-service-weather ] [ WEATHER UPDATER : GROUP_NAME ] [ WEATHER CONTROLLER ] The WebUI [ WEBUI_NAME ] was inactive for 5 minutes. It will be remove Weather Updaters pool |
Quand la recherche est terminée, nous sommes prévenus de sa fin et du temps écoulé, et un court résumé est affiché :
[YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ WEATHER UPDATER : GROUP_NAME ] [ WEATHER CONTROLLER ] Synchronization file cleaning finished in [ ELAPSED_TIME ] seconds [YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ WEATHER UPDATER : GROUP_NAME ] [ WEATHER CONTROLLER ] We found and removed X WebUI inactive for more than Y minutes |
Lorsque la WebUI modifie une donnée dans le Data Hub, elle demande de mettre à jour la date de dernière modification par le Weather Controller :
[YYYY-MM-DD HH:MM:SS] INFO : [ WEBUI_NAME ] [ webui-module-service-weather ] [ WEATHER UPDATER : GROUP_NAME ] [ WEATHER CONTROLLER ] Refreshing WebUI [ WEBUI_NAME ] last update date |
Si la WebUI n'est plus dans le Weather Controller à ce moment ( si par exemple elle a été jugée inactive par une autre WebUI ) elle va se réinscrire et demander une réélection
[YYYY-MM-DD HH:MM:SS] WARNING: [ WEBUI_NAME ] [ webui-module-service-weather ] [ WEATHER UPDATER : GROUP_NAME ] [ WEATHER CONTROLLER ] My WebUI has been removed, re-registering it and asking for a reelection |
S'il est impossible de charger le fichier lors de l'initialisation parce qu'il semble corrompu ( impossible de charger le JSON ), le fichier est réinitialisé
[YYYY-MM-DD HH:MM:SS] WARNING: [ WEBUI_NAME ] [ webui-module-service-weather ] [ WEATHER UPDATER : GROUP_NAME ] [ WEATHER CONTROLLER ] Cannot load data because its corrupted. Reinitializing it |