Free mobile: les erreurs du site d’inscription
January 25th, 2012Le site de Free Mobile a connu beaucoup de problèmes le jour de l’ouverture de l’offre: impossibilité de s’inscrire, inscriptions non prises en compte, etc.
Ne tenant pas la charge, le site à été réécrit pendant la nuit, en effectuant au passage une transition de Java (Jsf) vers Php.
En partant de ce constat, le troll Java Vs PHP est facile, mais plusieurs erreurs de conception ont largement contribué à l’écroulement du site:
Avant l’ouverture:
Avant l’ouverture officielle des inscriptions, le site de Free Mobile affichait un message du type : “dans quelques instants vous pourrez consulter nos offres”
- Première erreur: Rechargement automatique toutes les minutes.
la page se rafraîchissait automatiquement toutes les minutes.
En plus des rafraîchissements manuels effectués par les impatients, ce code à généré un surplus de connexions et surtout a agit comme une retenue d’eau : à l’ouverture du vrai site, l’ensemble des utilisateurs en attente y ont accédé dans la première minute.….
À l’ouverture
Le site utilisait un système de “slots” pour le processus d’inscription : seul un nombre limité d’utilisateurs pouvaient s’inscrire simultanément. Les autres devaient attendre.
- Deuxième erreur: Rechargement automatique toutes les 5 secondes.
Lorsqu’aucun slot était disponible, le site affichait une page d’attente qui se rechargeait automatiquement toutes les 5 secondes pendant plusieurs minutes.
En réponse à une surcharge, le site a multiplié volontairement la charge au bas mot entre 12x et 60x. - Troisième erreur: Choix de JSF
JSF est un framework par composants, orienté applications web (type intranet), qui a besoin de stocker en session, pour chaque utilisateur :- L’état de l’ensemble des composants de la page courante
- Le même état pour les X dernières pages visitées pour permettre l’utilisation du bouton précédent
… là où les frameworks orientés sites web publics ne stockent que l’identifiant de l’utilisateur, dans le cas où celui-ci est authentifié.
Dans le cas de free mobile, toutes les inscriptions sont faites par des utilisateurs différents. Le volume de données à stocker est donc énorme et n’est pas adapté à la fonction du site.
Il est possible dans JSF de reporter ces données coté utilisateur en les intégrant dans le code html, au prix d’une augmentation de la bande passante. Cette configuration n’était pas utilisée sur free mobile.
Après la refonte:
Le site fonctionne maintenant en PHP, mais on peut voir que les leçons ont été tirées des problèmes ci-dessus:
- En cas de surcharge du site, la page d’erreur redirige immédiatement vers la page d’accueil. Il n’y a plus de rechargement automatique. La redirection est même suffisamment rapide pour empêcher les utilisateurs de recharger eux-même la page trop facilement. (Note: La page principale est statique.)
- Le site est en php basique, sans utilisation de framework visible. On se doute qu’il n’y a quasiment pas de données en session, voir pas du tout
Conclusion
- Les rechargement de page en javascript sont dangereux sur les sites à forte charge. Il faut porter une extrême attention à leur impact sur le dimensionnement. Il vaut mieux privilégier un rechargement manuel de la page par l’utilisateur
- La session est un élément sensible des applications web. Pour un site a forte audience, il faut limiter drastiquement les données stockées, ce qui exclut naturellement un certain nombre de frameworks de type JSF.
En cas de nécessité, il est possible de déporter les données sur des caches mémoire, tels que memcache, ehcache, cohérence.
- Un rappel: l’architecture mise en place ne dépend pas du langage. Faire une application complexe (modèle composant, de multiples couches, plein de données en session) ou ultra-simple quelques lignes dans un fichier est un choix, qui est réalisable de façon sensiblement identique dans les différents langages.
J’en profite également pour placer le projet open source Stateless Filter qui permet de déporter de façon transparente les sessions d’applications Java coté client ou dans un cache mémoire.
Les retours sont bien sûr les bienvenus. Je mettrai à jour l’article pour quelques corrections si nécessaire…

