Les Flammes

Rémi Langdorph | Mar 30, 2024 min read

La première édition des Flammes

Il y a un peu plus d’un an, Guillaume de l’agence Baltazare m’avait demandé de l’aide pour la première édition des Flammes🔥, une cérémonie qui récompense les artistes RAP où le public vote sur le site avec le système innovant des TOPLISTS de Vainkeurz. Le concept est simple: vous avez une liste d’artistes, et vous avez le choix successivement entre 2 artistes, et vous choisissez celui que vous préférez. A la fin, on obtient un classement des artistes en fonction des votes.

Pourquoi avait-il besoin d’aide ? Parce qu’il avait peur que le site Wordpress ne tienne pas la charge avec le nombre d’utilisateurs qui allaient voter, ce qui avec du recul était une crainte tout à fait légitime.

Inutile de dire qu’il avait raison d’avoir peur car Wordpress est réputé pour être gourmand, surtout sur la base de donnée SQL. Même en augmentant les ressources, le serveur était rapidement dépassé lors des tests de charge. Il y a plusieures raisons à cela:

  • Wordpress utilise la base de donnée SQL pour beaucoup d’étapes critiques telles que le routage (savoir quelle page correspond à quelle addresse), ce qui fait que l’affichage d’une page demande de nombreuses requêtes SQL.
  • Chaque vote était enregistré dans la base de donnée et rafréchissait la page, ce qui créait beaucoup de requêtes WordPress et donc de requêtes SQL.
  • MySQL est très simple pour débuter mais devient très vite un goulot d’étranglement dès que le nombre de requêtes simultanées augmente, surtout si les requêtes sont complexes.

Alors inutile de vous dire que même si nous n’étiens qu’à quelques jours de l’ouverture des votes, nous avons réalisé de nombreux changements.

Ce qui a changé

La première partie était de passer l’algorithme de vote en javascript pur pour éviter de rafraîchir la page à chaque vote. Ensuite, la gestion de l’authentification/connexion utilisateur a été passée en JS sur la page là aussi avec Firebase. La partie vote a été transférée à une API dédiée avec sa propre base de donnée. Enfin, nous avons gardé Wordpress pour la partie affichage des artistes et des votes ainsi que les résultats (à partir de l’API), avec un cache très agressif pour éviter de surcharger le serveur.

L’API

L’API est l’enjeu clé de la première édition des flammes, elle a été réalisé en Rust 🦀 avec un framework interne de War Legend. Le manque de temps nous a forcé à réduire son périmètre:

  • Lister les catégories votées par un utilisateur
  • Soumettre le vote dans une catégorie
  • Récupérer le vote d’un utilisateur avec un lien public
  • Et des statistiques évidemment

L’authentification était gérée avec Firebase donc pas de soucis pour l’implémenter rapidement dans l’API.

Nous avons pu utiliser une bonne partie du stack de War Legend, et nous avons gardé les mêmes technologies de base de donnée:

  • ScyllaDB, une base de donnée très rapide et scalable en plus d’être fiable car distribuée, basée sur Cassandra mais ré-écrite en C++. C’est elle qui nous permet de stocker la plupart des données.
  • Redis, une base de donnée en mémoire très rapide et fiable, utilisée pour les statistiques.

Pourquoi Rust ?

Rust est un langage de programmation système qui a été créé par Mozilla pour remplacer C++ et C dans Firefox. Il est rapide, sûr et concurrent. Ici, Go aurait pu être suffisant, mais bien qu’ayant beaucoup utilisé Go pour mes projets, je préfère Rust grace aux garanties et à la performance qu’il offre mais surtout pour l’écosystème bien plus complet que Go.

Pour l’hébergement, nous avons utilisé Kubernetes avec le cloud d’Hetzner qui a un prix défiant toute concurrence pour de l’hébergement européen et permet un scaling rapide.

La première édition des Flammes a été un succès, avec plus de 100 000 utilisateurs en quelques jours, et un site qui n’a jamais planté, même lors des pics de charge.

Les Flammes 2024

Pour la deuxième édition des Flammes, nous avons décidé de repartir sur les mêmes bases, mais en retirant totalement Wordpress ainsi que Firebase. Cette fois ci, l’API a été étendue pour gérer l’authentification: avec email ou Google/Facebook/Apple.

Nous avons remplacé wordpress par des templates statiques avec Jinja pour la plupart des pages. La page résultat avait besoin d’être dynamique pour afficher les résultats d’un vote en particulier et afficher les previews de vote pour les réseaux sociaux. Nous avons découvert Askama, une librairie qui reprend la syntaxe jinja2 mais compile du code Rust à partir des templates et permet donc de bénéficier de la performance et des garanties de Rust pour générer les pages.

Cela nous a permis d’avoir un site encore plus fiable, qui a tenu plus de 25.000 utilisateurs simultanés en pic avec plus de 26 millions de votes enregistrés en 2 semaines !

Que retenir ?

  • Wordpress est un CMS très simple à utiliser mais qui peut vite devenir un goulot d’étranglement dès que le nombre de visiteurs augmente.
  • Rust est un langage très performant et sûr, qui peut être utilisé pour des applications web avec des performances incroyables, et avec l’habitude est plus rapide à développer que les autres langages dès que le projet devient complexe.
  • Le plus important pour qu’un site tienne la charge n’est pas tant la technologie utilisée mais la manière dont elle est utilisée. Un site Rust mal pensé peut être aussi lent qu’un site PHP bien pensé.
  • Toujours faire un test de charge en amont.

Merci à Guillaume pour sa confiance et pour m’avoir permis de travailler sur un projet aussi intéressant et avec une telle visibilité, j’espère que le concept de Vainkeurz va continuer à se développer et que celui-ci pourra peut-être rouiller (être ré-écrit en Rust 😊) pour pouvoir supporter la hype de tous !