-
Notifications
You must be signed in to change notification settings - Fork 31
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Cache préemptif pour l’endpoint /api/datasets #4427
Conversation
apps/transport/lib/transport_web/api/controllers/datasets_controller.ex
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
J'ai fait une première passe avec des commentaires.
@vdegove si tu souhaites modifier j'attendrai que tu l'aies fait, avant de tester en local (pour économiser le budget).
Je propose aussi de renommer la PR: ce qu'on fait est parfois appelé "cache préemptif" (ex: https://www.drupal.org/forum/general/general-discussion/2009-08-09/what-is-preemptive-caching), ce qui est un peu plus précis.
apps/transport/lib/transport_web/api/controllers/datasets_controller.ex
Outdated
Show resolved
Hide resolved
@callback fetch(cache_key :: binary(), fun(), integer()) :: any | ||
|
||
defp impl, do: Application.get_env(:transport, :cache_impl) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Note de relecture : ce n'est pas effacé, mais juste déplacé plus bas du fait de la visibilité privée.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
J'ai fait deux propositions, une pour éviter un double calcul "aux frontières", l'autre est une note pour le futur.
J'ai aussi vérifié que le cache préemptif ne tournait pas pendant les tests (et donc ne pollue pas apps/transport/test/transport_web/controllers/api/datasets_controller_test.exs).
J'approuve mais @vdegove je te laisse finaliser sur les deux suggestions avant, et on peut déployer pour tenter ensuite ?
Co-authored-by: Thibaut Barrère <[email protected]>
Co-authored-by: Thibaut Barrère <[email protected]>
Cette PR rajoute un mécanisme pour calculer et remplir automatiquement le contenu du cache pour la réponse de l’endpoint principal
/api/datasets
.Ce calcul du cache se fait au lancement de l’application puis toutes les 5 minutes, le cache étant configuré pour expirer au bout de 10 minutes. En théorie donc, aucun utilisateur ne devrait obtenir de résultat non caché sur cet endpoint. J’ai toutefois gardé le fonctionnement précédent par sécurité : si jamais le cache venait à ne pas être rempli, l’appel GET sur
/api/datasets
devrait fonctionner (et re-remplir le cache avec un délai de 10 minutes).Chez moi ça marche, (mais ce n’est pas testé par des tests en dur), extrait de logs :
Je n’ai pas augmenté le timeout Ecto volontairement : celui-ci est par défaut à 15 secondes et l’ensemble de la fonction générant la payload JSON est calculée à environ 3,5s sur ma machine en local. Je préfère donc pour l’instant observer. J’ai mis des logs en début et fin de fonction principale pour avoir une idée du temps réel en production.