Cocher 650 000 000 de cases : faire face à une popularité inattendue
Le 26 juin 2024, lancement du site One Million Checkboxes (OMCB)
- Un site avec 1 million de cases à cocher globales, où cocher une case se répercute immédiatement chez tous les utilisateurs
- Quelques milliers d’utilisateurs ont coché des millions de cases en seulement 30 minutes après le lancement
- Arrivées de trafic depuis Hacker News, /r/InternetIsBeautiful, Mastodon, Twitter, etc.
- Mentionné aussi dans le Washington Post et le New York Times
- Plus de 50 millions de cases ont été cochées le premier jour
- Plus de 650 millions de cases ont été cochées avant la fermeture du site, deux semaines plus tard
Architecture d’origine
- L’état des cases à cocher est stocké sous forme de 1 million de bits (125 Ko)
- Les clients utilisent un bitset pour afficher les cases et signalent au serveur les changements d’état
- Le serveur utilise Redis pour mettre à jour les bits et diffuser les changements à tous les clients
- Le contenu statique est servi via nginx, tandis qu’un serveur Flask gère l’état du bitset et les connexions WebSocket
- Redis sert à la fois de stockage d’état et de file de messages
Principes de mise à l’échelle
- Limite de coût : calculer mathématiquement les coûts pour pouvoir monter en charge sans faire exploser la facture, en s’appuyant sur du serverless
- Accepter des solutions de court terme : partir du principe que la popularité du site serait temporaire et choisir des solutions rapides
- Utiliser des technologies simples et auto-hébergées : n’ajouter que des outils qu’on peut exploiter et déboguer soi-même
- Rechercher avant tout le plaisir : faire passer l’amusement avant l’argent
- Préserver l’état global : faire en sorte que tous les utilisateurs voient les changements immédiatement
Premier jour : succès explosif
- La charge serveur a fortement augmenté en 30 minutes
- Des serveurs supplémentaires ont été lancés pour répartir la charge
- Des mises à jour par lots ont été introduites pour résoudre des problèmes de connexions Redis
- L’instance Redis managée de Digital Ocean a été montée en gamme
Aucune vraie planification pour la nuit
- Un plan a été improvisé pour exposer un jeu Pacman à reconnaissance faciale au camp ITP
- Un iPad a été emporté pour lancer des serveurs
- Huit VM de workers ont été exploitées, avec une convention de nommage des serveurs devenue de plus en plus élaborée
- Le nombre de processus Flask a été réduit et la taille des lots de mise à jour augmentée pour diminuer la charge
Problème de bande passante
- Le prix de la bande passante chez Digital Ocean n’avait pas été pris en compte
- La fréquence des snapshots d’état a été réduite, ainsi que la taille des mises à jour
- L’utilitaire
tc a été utilisé pour limiter la quantité de données envoyées par seconde
Deuxième jour : la croissance continue
- Le site est tombé à cause d’une validation d’entrée insuffisante
- Un réplica Redis a été ajouté pour répartir la charge
- Les processus Flask continuaient à planter, donc un script de redémarrage automatique a été écrit
Problème des mises à jour anciennes
- Les clients appliquaient d’anciennes mises à jour, ce qui affichait un état incorrect
- Des horodatages ont été ajoutés pour garantir l’ordre des mises à jour
Réécriture en Go
- Le backend a été réécrit en Go avec l’aide d’un ami ingénieur performance
- Les performances se sont nettement améliorées
- Les attaques DDoS ont été contrées via CloudFlare
Fermeture du site
- Le comportement a été modifié pour que les cases se figent si elles n’étaient pas décochées assez rapidement
- Redis a été utilisé pour gérer cet état figé
- Le site a été fermé au bout de deux semaines
Ce qui a été appris
- C’était la deuxième fois qu’un serveur avec un « vrai » backend était déployé sur l’Internet public
- Le choix de solutions de court terme s’est révélé pertinent
- Cela a confirmé une nouvelle fois la puissance de Redis et de nginx
- Cela a montré à quel point les gens ont envie de sites où ils peuvent interagir anonymement
Résumé GN⁺
- Cet article traite des problèmes techniques causés par la popularité inattendue d’un site web, ainsi que de la manière dont ils ont été résolus
- Il montre qu’une architecture simple reposant sur Redis et nginx peut malgré tout absorber un trafic à grande échelle
- Il explique comment résoudre rapidement les problèmes et stabiliser un site grâce à des solutions de court terme
- Il aborde divers défis techniques, comme une réécriture en Go et la défense contre les attaques DDoS via CloudFlare
- Parmi les projets aux fonctionnalités similaires, on peut citer des projets collaboratifs de grande ampleur comme /r/Place de Reddit
1 commentaires
Commentaires sur Hacker News
J’ai pu en tirer beaucoup d’enseignements et de connaissances historiques
C’était un excellent article ! Félicitations aussi pour le site, mais le texte lui-même est la partie dont il faut être le plus fier
Construire le site en seulement deux jours était un bon choix
Projet connexe récent :
Projet amusant
C’était un excellent article — je me demande combien cela a coûté
Cela a confirmé ma conviction que les gens ont soif d’interactions anonymes mais limitées
En tant que débutant en backend, je me demande s’il existe une architecture alternative simple pour ce projet
Sympa !
Je me demande si le jeu est toujours en ligne