Projet

Général

Profil

Development #82379

toulouse-maélis: ré-introduire du cache sur le catalogue général

Ajouté par Nicolas Roche il y a 6 mois. Mis à jour il y a 6 mois.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
16 octobre 2023
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

Description

Il a été désactivé :

L'idée serait de réintroduire le cache du catalogue général,
puis qu'au début de la démarche d'inscription, la capacité restante soit contrôlée sur le catalogue personnalisé.


Demandes liées

Lié à Passerelle - Development #82961: Avoir une entrée "every5min" dans les cronFermé30 octobre 2023

Actions
Lié à Intégrations graphiques Publik - Development #82964: toulouse-2022: [parsifal] Ne plus passer de date de référence sur la cellule catalogueFermé30 octobre 2023

Actions
Lié à Passerelle - Development #82966: Ne plus proposer de date sur le WS qui renvoie le catalogue général.Fermé30 octobre 2023

Actions

Révisions associées

Révision a7ff9bbc (diff)
Ajouté par Nicolas Roche il y a 6 mois

toulouse-maelis: put global catalog in cache (#82379)

Historique

#1

Mis à jour par Nicolas Roche il y a 6 mois

  • Description mis à jour (diff)

Stéphane me dit que mettre en cache le catalogue toutes les heures ne serait pas satisfaisant ;
qu'il faudrait plutôt viser une mise à jour toutes les 5 ou 10 minutes.
Je me demande si ce ne serait pas trop "sale" de me greffer sur le cron "availability" en créant un job qui met le catalogue en cache, dans "check_status".

#4

Mis à jour par Thomas Noël il y a 6 mois

Alors, je note que ici cache = stocker une copie chaque référentiel en base. Autrement dit, on n'utilise pas le cache de Django, mais on maintient une copie des référentiels, c'est pas un "cache" mais plutôt une "synchro régulière". C'est ce qui est fait dans Referential et c'est bien.

Selon moi, la technique de gestion d'une synchro avec une mise à jour non bloquante est plutôt celle ci :
  • lorsqu'un référentiel est utilisé, renvoyer immédiatement ce qui est présent en local
  • puis, si la date de dernière synchro a plus de "x" minutes, lancer un job de mise à jour (self.add_job)

Il faut donc deux choses en plus de la copie local du référentiel : sa date de dernière mise à jour, et un système de "lock" pour ne lancer qu'un seul job de mise à jour.

Pour le lock, pour ne pas lancer un job qui serait déjà en cours, je pense qu'il faut regarder ce qui est dans self.jobs_set (en ne considérant pas les jobs avec un statut failed/completed) ; ici je verrais bien un ticket spécifique pour ajouter une méthode add_job_once à côté de add_job. Ou pas :)

Reste qu'avec cette solution, si le référentiel n'est pas utilisé pendant 3 heures, alors la synchro ne se fait pas pendant 3 heures.

Pour contrer ça, on peut imaginer un cron hourly qui va lancer un job de synchro. Mais comme ça n'est que "hourly", s'il ne faut jamais que le cache ait plus d'une heure, alors on peut imaginer lancer un job asynchrone dans self.jobs, qui serait du genre :

def jobs(self):
   self.add_job_once('sync_referentials')
   super().jobs()

(self.jobs est un cron qui est lancé chaque 5 minutes, comme availability)

#5

Mis à jour par Nicolas Roche il y a 6 mois

self.jobs est un cron qui est lancé chaque 5 minutes, comme availability

\o/ ça me plaît.

Le code de mise à jour des référentiels n'utilise pas de verrou.
(de mémoire je suis parti du connecteur BAN https://dev.entrouvert.org/issues/70982#note-15)
J'ai peut-être manqué quelque-chose (il faut me le dire si c'est flagrant) :
je procède par mise à jour des items via update_or_create
et à la fin je supprime ceux dont la date n'a pas été modifiés : .filter(..., updated__lt=last_update).delete()
De cette façon j'ai l'impression que je pourrais continuer à me passer d'un verrou, et traiter le catalogue comme les autres référentiels, sans lancer de job asynchrone :

    def daily(self):
        super().daily()
        self.update_referentials()

#6

Mis à jour par Thomas Noël il y a 6 mois

Le problème si tu n'as pas de verrou est le risque de lancer "n" mise à jour en même temps.

Pour un truc qui ne prend que quelques minutes, le risque est nul si tu fais juste du "cron hourly". (Sur la BAN c'est carrément du daily).

Sur le "cron jobs" qui se lance chaque 5 minutes, il faut être un peu plus sûr de toi... mais si on parle d'un truc qui prend une minute, ça doit passer.

Je ne pense pas qu'on augmente un jour la fréquence du cron jobs. Si c'est le cas, je compte sur toi pour rappeler que "ça fait pas uniquement les jobs" :) Blague à part je me dis qu'une solution plus propre, au lieu de réutiliser un cron pas prévu pour, ça serait d'ajouter un "every5min" dans nos FREQUENCY de cron, que tu serais le premier à utiliser -- ça doit se faire en quelques lignes dans commands/cron.py + passerelle/base/models.py + debian/uwsgi.ini, ça serait un premier commit facile je pense.

(si on parle d'un lancement de synchro encore plus fréquent, genre "dès que le référentiel a plus d'une minute" alors il faut vraiment locker, mais mon avis est que dans un tel besoin c'est d'abord au webservice en face d'accélérer ;) )

#8

Mis à jour par Nicolas Roche il y a 6 mois

#9

Mis à jour par Nicolas Roche il y a 6 mois

  • Lié à Development #82964: toulouse-2022: [parsifal] Ne plus passer de date de référence sur la cellule catalogue ajouté
#10

Mis à jour par Nicolas Roche il y a 6 mois

  • Lié à Development #82966: Ne plus proposer de date sur le WS qui renvoie le catalogue général. ajouté
#11

Mis à jour par Robot Gitea il y a 6 mois

  • Statut changé de Nouveau à Solution proposée
  • Assigné à mis à Nicolas Roche

Nicolas Roche (nroche) a ouvert une pull request sur Gitea concernant cette demande :

#12

Mis à jour par Robot Gitea il y a 6 mois

  • Statut changé de Solution proposée à Solution validée

Benjamin Dauvergne (bdauvergne) a approuvé une pull request sur Gitea concernant cette demande :

#13

Mis à jour par Robot Gitea il y a 6 mois

  • Statut changé de Solution validée à En cours

Nicolas Roche (nroche) a fermé une pull request sur Gitea concernant cette demande.

#14

Mis à jour par Robot Gitea il y a 6 mois

  • Statut changé de En cours à Solution proposée

Nicolas Roche (nroche) a ouvert une pull request sur Gitea concernant cette demande :

#15

Mis à jour par Robot Gitea il y a 6 mois

  • Statut changé de Solution proposée à Résolu (à déployer)

Nicolas Roche (nroche) a mergé une pull request sur Gitea concernant cette demande :

#16

Mis à jour par Transition automatique il y a 6 mois

  • Statut changé de Résolu (à déployer) à Solution déployée
#17

Mis à jour par Transition automatique il y a 3 mois

Automatic expiration

Formats disponibles : Atom PDF