DealTracker - Architecture
L'architecture de DealTracker
L'architecture de DealTracker est conçue en plusieurs parties, dont beaucoup sont hébergées chez moi dans mon homelab.
[Graphique]
1- La couche d'accès aux données
L'objectif de cette partie est de collecter les données des annonces d'occasion publiées sur différents marketplaces. Ces données sont restructurées et normalisées, afin de permettre un traitement équivalent quel que soit le marketplace sur laquelle l'annonce a été publiée à l'origine.
2- La couche d'enrichissement
Lorsque des annonces sont collectées, nous devons l'enrichir avec notre système de Machine Learning.
C'est un procédé durant lequel nous allons:
- Télécharger les images
- Les envoyer à notre système de Machine Learning chargé de la classification
- Faire d'éventuels post-traitements sur la base du contenu textuel
- Calculer l'attractivité de l'annonce (à quel point c'est une bonne affaire)
- La mettre à jour dans la base de données
J'ai voulu m'assurer que DealTracker soit en mesure de gérer n'importe quelle volumétrie. J'ai donc optimisé ce process en maximisant son débit de traitement, et en m'assurant qu'il soit scalable.
Concernant le débit de traitement, le plus important est de mettre en place un pipeline de traitement asynchrone. C'est à dire que les tâches ne sont pas traitées séquentiellement, elles sont orchestrées par Taskiq (un équivalent de Celery/Dramatiq avec asyncio). Le bottleneck du système c'est le modèle PyTorch, qui occupe 4Go de VRAM, et est capable de traiter environs 450 annonces par minutes sur ma RTX 3060Ti.
Concernant la scalabilité de ce pipeline, cela est naturellement permis par taskiq, puisque les tâches ne gardent pas d'état, et sont découplées. Il est possible de rajouter des capacités hardware pour gérer chacune des tâches, ce qui signifie que le système est aussi capable que le hardware sur lequel il est déployé.
3- La couche d'accès aux données (l'API)
Une fois les annonces enrichies, elles sont prêtes à être affichées sur notre site internet. Pour cela, il faut que nous mettions en place une API, afin de rendre les informations sur les annonces disponibles aux clients. Je me suis naturellement orienté vers FastAPI (le framework web Python le plus à jour du moment, asynchrone par nature et bien implémenté).
J'ai peu de commentaires à faire sur cette API, qui est sommes toutes classique. Elle récupère les données, les met en cache, et les sert à la demande. Deux parties semblent particulièrement intéressantes:
La réalisation de la liste des meilleures affaires:
Qu'est-ce que la bonne affaire ? La bonne affaire, c'est une annonce:
- Publiée récemment
- Près de chez vous
- À un prix cassé
Lorsqu'un utilisateur demande à voir les bonnes annonces, ces 3 critères sont donc pris en compte et pondérées afin de fournir la liste la plus pertinente.
Le filtrage géographique:
Un utilisateur sur le site de DealTracker a la possibilité de faire un filtrage géographique, et de dire "quelles sont les annonces dans un rayon de X km autour de telle ville". Lorsqu'il fait ce filtrage, cela envoie une requête à notre API, afin de retourner une liste filtrée d'annonces.
Ce filtrage géographique des annonces est réalisé avec geopandas, une version enrichie de pandas qui est dédiée au traitement d'informations géographiques. Après avoir trouvé une liste de géodonnées vectorielles pour chacune des communes françaises, j'ai donc pu implémenter l'algorithme permettant, à partir de la localisation envoyée par l'utilisateur, de trouver toutes les annonces situées à moins de X km.
4- Le Frontend
L'objectif du Front-end, c'est de fournir une interface pour que les utilisateurs puissent accéder aux résultats de notre analyse. Cette interface doit être:
- Fluide
- Ergonomique
- Conviviale
- Optimisée pour du SEO
Pour ce site, j'ai fini par m'orientier vers du NextJS. Ce n'était pas mon premier choix, j'avais d'abord décidé de le faire en Flutter web...
Le design est fait avec antd, et j'ai fait un véritable travail sur la hiérarchisation de l'information pertinente. Bien sûr, vous pouvez accéder au site internet sur https://www.dealtracker.org