Comment fonctionne un grand site Web

Ils ont des millions de visiteurs par jour. Quelles technologies utilisent les grands sites?

Nous allons comparer les infrastructures de quelques grands sites comme Tumblr (10 millions de visites par jour), Facebook (250 millions) et quelques autres pour montrer les choix possibles.

Orchestre d'ordinateurs, les grands sites web

Cette revue n'est pas complète, car les sites ne communiquent pas les détails de leurs infrastructures, mais les informations que j'ai pu rassembler devraient suffire à donner une idée de la façon dont ils peuvent fonctionner, et des logiciels permettant de traiter des masses de données gigantesques. Et l'on aura des surprises, plus particulièrement au sujet des bases de données.

Système de fichiers

Google

Le moteur de recherche a créé un système de fichiers convenant mieux a son fonctionnement fait de milliards de requêtes en lecture seule et aussi pour le partage en clusters. Le GoogleFS ou GFS est propriétaire et a été imaginé dès les premiers jours du site, vers 1998.

Les autres

Ils utilisent des systèmes similaires disponibles sur le marché, tels le GPFS d'IBM, un système parallèle en clusters également, choisi par de nombreuses entreprises. Ou HDFS, Hadoop Distributed File System, qui fait partie d'un ensemble de logiciels créé par la fondation Apache pour traiter des données en clusters. Adobe, AOL, Facebook, EBay, Hulu, Linkedln et même IBM utilisent Hadoop ou une partie de ses outils.

Base de données

Une chose que l'on va remarquer avec tous ces grands sites est qu'aucun n'utilise Oracle! Une des raisons est qu'ils ont besoin de quantités énormes de serveurs et que la licence dépendant du nombre de machines, le coût serait astronomique. En outre, en utilisant des solutions open source, ce que tous font, il est plus facile de faire des modifications et les mises à jour et corrections sont plus rapides. On utilise essentiellement MySQL, le même logiciel qui propulse votre blog, mais avec des outils complémentaires et une bonne équipe de développement pour optimiser le logiciel à volonté et le rendre très performant.

Tumblr

Le site dépend en grande partie de MySQL dont les opérations sont accélérées avec Memcache, HAProxy et le shardling qui est une des formes de partitionnement des bases de données.
Mais il utilise aussi intensivement Redis, un stockage sous la forme clé-valeur avec des fonctions d'accès rapide qui s'utilise pour les notifications sur les tableaux de bord des utilisateurs. Elles ont une durée de stockage limitée, ce qui convient à Redis, qui est aussi utilisé pour d'autres fonctions éphémères et même pour la mémoire tampon en remplacement de Memcache (on peut stocker le couple URL/page comme clé-valeur).
Tumblr fait appel à HBase pour le raccourcisseur d'URL, pour les historiques, les statistiques et pour la messagerie.

Facebook

Bien que Cassandra ait été créée par Facebook, qui a transmis le projet à la fondation Apache, la compagnie ne fait plus partie de la liste des utilisateurs. Facebook l'a remplacé par HBase.
HBase est utilisé pour le système de messagerie, mais l'essentiel du stockage est fait avec MySQL complété par Memcache pour accélérer les opérations. Il y a plus de programmeurs travaillant sur HBase que sur MySQL bien que son usage soit plus limité, ce qui suggère qu'il est plus difficile à mettre en oeuvre.
Haystack est un système de stockage spécialisé pour les photos. C'est intermédiaire entre une SGDB et un système de fichiers, avec un index en mémoire, qui optimise l'écriture et la lecture.

Google

Utilise BigTable, qui a inspiré partiellement Cassandra et HBase, pour l'essentiel du stockage. En fait, BigTable est même proposée aux utilisateurs sur App Engine. BigTable fonctionne en clusters de milliers de machines, et n'a aucun problème de performance sur de grandes quantités de données.

Les autres

Parmi les sites qui utilisent Hadoop, nombreux recourent à HBase, pour le stockage de masses de données. C'est un SGDB similaire à BigTable de Google. Il convient mieux au stockage de données en masse avec mise à jour périodique et Cassandra convient mieux au transactionnel avec mise à jour en continu. Il est aussi non relationnel au contraire de Cassandra qui est NoSQL.

Langages de programmation

Pour ces grands sites, les langages les plus utilisés sont Scala (conçu comme son nom l'indique pour l'agrandissement, "scale" en anglais) et PHP. Java est compatible avec Scala qui peut utiliser ses API.
Google utilise aussi Python mais tend à le remplacer par Go dont les fonctions de concurrence font qu'il convient lieux aux sites web. Le couple JavaScript et Node est en développement.

Dailymotion et Facebook

Les deux sites se sont développés avec PHP et l'ont conservé malgré sa lenteur relative. Dailymotion utilise le framework Symfony. Cela se comprend car le traitement sur le serveur est négligeable par rapport au temps de transfert des vidéos.
Facebook n'a pas voulu reprogrammer tout son système dans un autre langage, ce ne serait pas un problème en soi, mais si le nouveau code comporte des bogues, ce qui est inévitable, cela affectera des millions d'utilisateurs. Il a donc choisit plutôt accélèrer PHP en créant un compilateur en langage binaire, ainsi qu'avec une machine virtuelle pour la mise au point.

Tumblr

Comme de nombreux autres, Le site est passé à Scala. Il a démarré en PHP, d'autre ont démarré en Ruby, mais lorsqu'il s'agit de traiter des millions de requêtes par seconde, la machine virtuelle Java est plus efficace.
En fait elle a été mise en balance avec JavaScript sur Node. Mais au moment du choix, on ne savait pas trop ce que valait Node pour un site de cette importance, les bibliothèques sont récentes et peu stables. Alors que Scala dispose de Finagle et autres outils conçus pour les grands sites. Pour un projet qui démarre, choisir JavaScript est plus facile, les API et le site évoluent en même temps.

Autres outils

Finagle est un outil RPC (Remote Procedure Call), donc un moyen pour le client de lancer des requêtes au serveur qui convient pour un grand nombre d'utilisateurs. Ecrit en Scala, il fonctionne sur la JVM avec tout protocole de communication.
Il a été créé par Twitter et est utilisé aussi par Tumblr entre autres.

Kafka est un système de messagerie interne distribué open source créé par Linkedln. Il est utilisé par Tumblr pour stocker les messages.

Thrift est un chef d'orchestre pour mixer des services écrits dans des langages de programmation différents, et un projet Apache. Il est utilisé notamment par Facebook, Tumblr et probablement beaucoup d'autres.

Scribe est un système de gestion des utilisateurs créé par Facebook. Il a été utilisé par Tumblr qui l'a abandonné rapidement car il ne supportait pas la charge.

L'exemple de Facebook

Facebook fonctionne avec un ensemble de logiciels qui lui permet de traiter des milliards de pages par jour, tout en restant réactif. A l'exception de Haystack et BigPipe, développés en interne, tous ces logiciels sont open-source et librement utilisables sur tout serveur.

Langage des pages: Le système et notamment les applications utilisait un langage dérivé de HTML et nommé FBML maintenant obsolète et remplacé par HTML + JavaScript.

Bases de données: MySQL pour les opérations courantes et a créé Cassandra, devenu un projet Apache pour remplacer MySQL pour les données de tailles variables, plus efficace pour les réseaux très importants. Mais Cassandra semble peu ou pas utilisé par Facebook maintenant.
Cela est complété par Memcached, un gestionnaire de mémoire tampon entre les applications et la base de données, qui évite de répéter les requêtes fréquentes. >
Apollo est un système noSQL similaire à HBase pour système a faible latence.
GraphQL est le langage de base de données utilisée par les applications mobiles. Sa particularité est qu'une requête, exprimée en JSON a la même forme que la réponse: la requête contient les noms des champs, la réponse ajoute les données contenues dans ces champs.

Langages de programmations: PHP est depuis février 2010 compilé avec le compilateur Hip Hop propre à Facebook, mais open source. Les logiciels sont donc en code binaire mais la firme s'est ensuite tournée vers une machine virtuelle et a même développé sa propre version de PHP, Hack qui a des variables statiquement typées.
Mais Facebook utilise à coté de PHP de nombreux langages: Java, C++, Haskell, Ocaml et même D. Pour interfacer entre eux les programmes écrits dans différents langages, Thrift génère le code approprié, pour les services Web.

Stockage. A coté de MySQL pour les données, Haystack est un système de stockage et d'accès aux photos performant. Il gère les 80 milliards de photos stockées par les utilisateurs (en juin 2010).

Serveur de pages: BigPipe gère en parallèle le chargement des pages (mur, flux, chat, etc...). Il a été réalisé par Facebook.

Gestion des utilisateurs: Scribe gère l'accès au site pour les utilisateurs.

Analyse des données: Hadoop est un autre projet Apache pour réaliser des calculs massifs sur les données. Hive est un complément à Hadoop, il permet d'utiliser ses calculs avec des requêtes similaires à celles de SQL.

Transfers du contenu : Varnish est un accélérateur HTTP faisant office de mémoire tampon.

Open Graph a remplacé Facebook connect, un moyen d'utiliser les services de Facebook sur un site Web, auquel la concurrence et Google ont répondu avec Xauth.
Le graphe ouvert se propose de faire des sites Web les noeuds d'un réseau social unique dont Facebook serait le centre. Les profils des membres, leurs relation avec les autres, deviennent accessibles à partir des sites Web et utilisés par eux.

Open Graph est sans doute intéressant pour les compte d'entreprises (ce n'est pas son but), mais inquiète pour le respect de la vie privée.
Il y a eu beaucoup de réactions négatives et de désactivation de compte de personnalités du Web après l'annonce d'Open Graph.

Conclusion

Cet article décrit les logiciels. Aller plus loin et décrire leur interaction serait plus compliqué et en fait dépendant de l'activité du site. Il faut aussi savoir que l'utilisation de tous ces outils ne se résume pas à un déballage hors du carton. Pour chacun il faut d'abord le tester sur un service particulier et limité avant de l'intégrer au système et le faire utiliser par la masse des utilisateurs. Même quand il s'agit de MySQL, il y a l'utilisation simple avec un CMS et l'utilisation ample avec tous les outils d'optimisation.
Il ne faut pas avoir peur d'une migration future et refuser d'employer les outils les plus simples quand on démarre un projet. Ceux-ci sont nécessaires pour permettre un bon départ. On ne saura comment utiliser les outils faits pour les lourdes charge qu'en les testant sur une large audience.
Un site n'est jamais fini.

Voir aussi...

Les bases de données des sites du Web.