etalab / transport-site

Rendre disponible, valoriser et améliorer les données transports
https://transport.data.gouv.fr
184 stars 28 forks source link

Optimisation de la recherche par modes #4006

Closed thbar closed 1 week ago

thbar commented 1 week ago

Intro

DRAFT

Suite à :

Et en lien avec :

La pagination / recherche actuelle prend jusqu'à 20 secondes par requête, en monopolisant le pool Ecto, ce qui crée actuellement un risque opérationnel sur tout le site (downtime l'autre jour, 5k+ erreurs).

Cette PR optimise fortement la recherche par modes, et s'appuie sur le fait que:

Le principe général est d'avoir un bout de code qui va aller faire cette pré-calc, et d'ajouter un champ spécifique counter_cache sur chaque ressource pour noter le résultat du calcul (et éventuellement dedans des informations d'invalidation type "metadata id" si on le souhaite).

Cette payload est structurée comme suit, de façon à permettre un peu de flexibilité et d'ajout si besoin:

{
  "gtfs_json": ["bus", "ferry"]
}

Une fois le cache calculé, le temps passe sur un exemple (région + modes, voir plus bas) de 11 secondes à 50 millisecondes environ.

Requêtes testées en local

J'ai réalisé une implémentation "side by side" temporaire avec un paramètre modes_v2 (qu'on fera sauter avant merge) pour faciliter le travail de vérification / recettage (non régression fonctionnelle, comparaison de la perf).

Version actuelle

Version optimisée

Liste des tâches

Script initial

Début d'usage

Mise au propre

thbar commented 1 week ago

@vdegove has entered the chat and is teaming with @thbar on PR #4006

ptitfred commented 1 week ago

Il s'agit davantage d'une indexation que d'un cache non ?

thbar commented 1 week ago

Il s'agit davantage d'une indexation que d'un cache non ?

Cela dépend de comment tu définis chaque terme je dirais.

Pour moi une indexation est plutôt un système qui va "pointer du doigt" vers ailleurs, là où est la donnée, tandis qu'un cache va "copier la donnée" (ou une partie de la donnée), et la rendre directement disponible à la source (ce qu'on fait ici).

Les deux termes ayant aussi de l'overlap (dans une certaine mesure, les deux peuvent devenir "stale", toutefois en général l'index est conservé à jour de façon plus immédiate pour que ça fonctionne, et le cache ça peut être un peu moins le cas).

thbar commented 1 week ago

GG @vdegove. Je propose de déployer sur prochainement, et de noter les comparaisons après sur les deux requêtes types en terme de temps de réponse, ça te va ?

thbar commented 1 week ago

J'ajoute @vdegove qu'une fois que c'est déployé sur prochainement, on peut partager les urls avec les @etalab/transport-bizdev pour un peu + de tests plus ouvert, et que si c'est concluant, on pourra remplacer ici modes par la logique de modes_v2, redéployer sur prochainement, puis finaliser la PR pour que ça parte en prod semaine prochaine par exemple.

vdegove commented 1 week ago

Je propose de déployer sur prochainement, et de noter les comparaisons après sur les deux requêtes types en terme de temps de réponse, ça te va ?

On fait ça.

vdegove commented 1 week ago

@AntoineAugusti a trouvé deux cas de reproduction d’erreurs 500 sur prochainement :

thbar commented 1 week ago

merci @AntoineAugusti - et poke @vdegove j'ai ajouté deux todos liées à ça sur la PR, on s'en reparle !

thbar commented 1 week ago

Merci @ptitfred

Je n'ai pas assez d'expérience du support JSON de PG pour avoir un regard critique sur les requêtes SQL utilisant le cache.

Ça peut être l'occasion de faire un tour ensemble, même sans le côté regard critique est-ce que déjà les appels sont plutôt clairs ou pas trop, justement pour la maintenabilité future ? Est-ce que le principe général te semble suffisamment lisible ? (en dehors de l'aspect privé / public qu'on va raffiner) ?

Merci !

thbar commented 1 week ago

Merci @ptitfred pour la review.

Au final j'ai supprimé le filtrage par dataset ids, car c'est à la réflexion plutôt un "reste" des besoins de développer en incréments, que vraiment un besoin applicatif derrière à ce stade (on n'a même pas besoin de batcher tellement c'est rapide etc). Voir https://github.com/etalab/transport-site/pull/4006/commits/5dd3b1ddec91fe03c60bf9fff664449f69c0e895.

thbar commented 1 week ago

@vdegove j'ai refait une passe ! (merci @ptitfred pour les retours).

thbar commented 1 week ago

On a fait le point avec @vdegove, on déploie c'est parti, et je viendrai compléter les TODOs post deploy ici.

thbar commented 1 week ago

J'ai été voir: baisse nette des erreurs DB, temps de réponse nettement amélioré, on est OK.

thbar commented 4 days ago

j'ai été "recetter" après quelques jours de recul:

  1. Point intéressant, le taux d'erreur (% de requêtes web non réussies, qui lèvent une erreur) pour nos utilisateurs a baissé fortement (on était entre 4% et 5% avant, on est entre 0,5 et 1% après). En terme de fiabilité / utilisabilité pour nos visiteurs / utilisateurs d'API, c'est un gros bon qualitatif au final.

CleanShot 2024-06-28 at 09 09 29@2x

  1. Le gain en temps de réponse se confirme dans le temps, ce qui est une bonne nouvelle (pas de "surprise")

CleanShot 2024-06-28 at 09 09 57@2x

Ce round est donc nettement concluant.

Concernant les erreurs DB selon où on regarde la conclusion n'est pas la même (merci @vdegove pour tes liens), et je vais aller ajouter ces éléments sur #3997

AntoineAugusti commented 4 days ago

Stylé ! Est-ce qu'on connait la part de crawlers sur la recherche ? Il me semble que les crawlers perdent pas mal de temps là-bas vu le nombre de liens à suivre (pagination, filtres etc).