<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Decrypt &#187; Facebook</title>
	<atom:link href="http://decrypt.ysance.com/tag/facebook/feed/" rel="self" type="application/rss+xml" />
	<link>http://decrypt.ysance.com</link>
	<description>Le site de decryptage des technologies de l&#039;informatique</description>
	<lastBuildDate>Thu, 01 Jul 2010 14:41:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Comment FarmVille scale pour récolter 75 millions de joueurs par mois</title>
		<link>http://decrypt.ysance.com/2010/03/comment-farmville-scale-pour-recolter-75-millions-de-joueurs-par-mois/</link>
		<comments>http://decrypt.ysance.com/2010/03/comment-farmville-scale-pour-recolter-75-millions-de-joueurs-par-mois/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 16:29:57 +0000</pubDate>
		<dc:creator>Todd Hoff</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[Casual Gaming]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Munin]]></category>
		<category><![CDATA[Nagios]]></category>
		<category><![CDATA[Puppet]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=1024</guid>
		<description><![CDATA[<img class="size-full wp-image-870 alignright" title="Farm Ville" src="http://decrypt.ysance.com/wp-content/uploads/2010/02/farmville.jpg" alt="Farm Ville" width="183" height="139" />

Si la vie des vrais agriculteurs était aussi douillette que dans <a title="FarmVille" href="http://www.farmville.com/">FarmVille</a>, le jeu phare de chez Zynga, alors ma famille n’aurait probablement jamais quitté les hivers rudes du North Dakota. A FarmVille, aucun des contes atroces que me racontait ma grand-mère n’est véridique. Les agriculteurs y prospèrent, les cultures fleurissent, et les animaux ne partent jamais au «  <a title="Murder In The Red Barn By Tom Waits" href="http://www.youtube.com/watch?v=eUJz3137EQ8">red barn</a> » (abattoir). A mon avis, c’est justement ce charme rustique d’un univers où l’on ne salit même pas ses souliers, qui a contribué à rendre FarmVille « le jeu le plus important au monde » dans un délai étonnamment court.

Comment FarmVille a-t-il réussi le scaling d’une application web pour accueillir 75 millions de joueurs par mois ? Luke Rajlich de FarmVille nous a gracieusement révélé quelques uns de leurs défis et de leurs secrets. Je passe la parole à Luke. [...]
]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-870 alignright" title="Farm Ville" src="http://decrypt.ysance.com/wp-content/uploads/2010/02/farmville.jpg" alt="Farm Ville" width="240" height="182" /></p>
<p>Si la vie des vrais agriculteurs était aussi douillette que dans <a title="FarmVille" href="http://www.farmville.com/">FarmVille</a>, le jeu phare de chez Zynga, alors ma famille n’aurait probablement jamais quitté les hivers rudes du North Dakota. A FarmVille, aucun des contes atroces que me racontait ma grand-mère n’est véridique. Les agriculteurs y prospèrent, les cultures fleurissent, et les animaux ne partent jamais au «  <a title="Murder In The Red Barn By Tom Waits" href="http://www.youtube.com/watch?v=eUJz3137EQ8">red barn</a> » (abattoir). A mon avis, c’est justement ce charme rustique d’un univers où l’on ne salit même pas ses souliers, qui a contribué à rendre FarmVille « le jeu le plus important au monde » dans un délai étonnamment court.</p>
<p>Comment FarmVille a-t-il réussi le scaling d’une application web pour accueillir 75 millions de joueurs par mois ? Luke Rajlich de FarmVille nous a gracieusement révélé quelques uns de leurs défis et de leurs secrets. Je passe la parole à Luke.</p>
<p>L’entretien comprenait quelques questions que je lui ai adressées, auxquelles il a répondu ainsi :</p>
<p style="padding-left: 30px;"><em>FarmVille a rencontré des défis de scaling rares, qui sont uniques à cette application. Le jeu a dû scaler très rapidement et très loin. Après seulement 4 jours, le jeu avait attiré un million de joueurs quotidiens, et 10 millions après 60 jours. Lors du lancement, le jeu social le plus important du web avait 5 millions de joueurs quotidiens. Actuellement FarmVille détient 28 millions de joueurs quotidiens, et 75 millions de joueurs mensuels, neuf mois après le lancement. Cela veut dire que le fond de joueurs mensuels FarmVille est plus important que la population totale de la France. Il y a deux éléments fondamentaux qui rendent FarmVille unique au niveau du défi évolutif : premièrement, c’est le jeu le plus répandu au monde, et deuxièmement, c’est l’application la plus importante sur une plate-forme web. Ces deux facteurs représentent un ensemble unique de défis évolutifs que FarmVille a dû surmonter. En termes d’investissement de technologie, FarmVille utilise principalement des composants Open Source, et ses fondements reposent sur la pile LAMP.</em></p>
<p style="padding-left: 30px;"><em>Afin de faire prospérer FarmVille en tant que jeu, nous devons nous accommoder des besoins en charge de traitement d’un jeu. L’état de chaque joueur contient une grosse quantité de données, qui sont liées entre elles de façon subtile et complexe. Par exemple, les objets à la ferme ne doivent pas se percuter, donc si un utilisateur installe une maison sur sa ferme, le Backend doit vérifier qu’il n’y aucun autre objet déjà installé qui risque de chevaucher sur l’espace prévu. La plupart des sites web connus, comme Google ou Facebook, servent surtout à être lus, mais FarmVille a une charge de travail en écriture extrêmement lourde. Le ratio de données en lecture par rapport aux données en écriture est de 3:1 (3 pour 1), ce qui implique un taux d’écriture très élevé. La majorité des demandes pour FarmVille adressées au Backend modifient en quelque sorte l’état de l’utilisateur qui joue. Pour que ce soit scalable, nous faisons dialoguer notre application principalement avec des composants de type cache. En plus, le lancement d&#8217;un nouveau contenu ou de nouvelles fonctions a tendance à provoquer des pics d’utilisation, car cela revient à une extension du jeu. Les pics de téléchargement peuvent atteindre les 50% le jour du lancement d’une nouvelle fonction. Il nous faut pouvoir accueillir ces pics de trafic.</em></p>
<p style="padding-left: 30px;"><em>Le deuxième point est de faire scaler FarmVille comme l’application la plus importante sur une plate-forme web, et elle a autant d’envergure que certains des sites web les plus gros du monde. Du fait que le jeu est exécuté au sein de la plate-forme Facebook, nous sommes très sensibles aux écarts de latence (temps d’attente) et de performance de la plate-forme. En conséquence, nous avons fait des efforts pour mitiger cette variance de la latence : nous entreposons en cache beaucoup de données Facebook, et nous limitons gentiment l’utilisation de la plate-forme quand nous nous apercevons d’une dégradation de la performance. FarmVille a déployé tout un cluster (une grappe) de serveurs cache pour la plate-forme Facebook. Le volume de trafic entre FarmVille et la plate-forme Facebook est vaste : aux heures de pointe environ 3 Gigabits/sec passent entre FarmVille et Facebook, et en même temps notre cluster de caching fournit 1.5 Gigabits/sec de plus à l’application. En plus, étant donné que la performance est variable, l’application est capable de stopper dynamiquement les appels en retour vers la plate-forme. Nous avons un &laquo;&nbsp;bouton de réglage&nbsp;&raquo; qui nous permet de réduire de manière incrémentale de plus en plus d&#8217;appels en retour. Nous faisons en sorte que tous les appels qui reviennent à la plate-forme n’empêchent pas le chargement de l’application même. L’intérêt de cette manipulation est que, quoiqu’il advienne, les joueurs peuvent au moins continuer leur partie.</em></p>
<p style="padding-left: 30px;"><em>Pour toute application web, un temps d’attente élevé est fatal, et une latence hautement variable lui sera fatale tôt ou tard. Afin de résoudre la latence élevée, FarmVille a installé beaucoup de caches devant les composants à latence élevée. La latence hautement variable représente une épreuve de plus, car elle nous oblige à trouver une approche différente : l’application dépend des éléments de son architecture qui ont habituellement une latence correcte. Pratiquement tous les composants sont susceptibles de latence variable, certains plus que d&#8217;autres. Vu la nature de FarmVille, qui a une charge de travail très importante en termes d&#8217;écritures et de transactions, la variabilité de latence affecte l&#8217;expérience de jeu des utilisateurs de façon exacerbée, par rapport à une application web traditionnelle. La solution, chez nous à FarmVille, pour gérer ces scénarii est de considérer chaque composant comme un service dégradable. Memcache, base de données, APIs REST, etc. sont maniés comme des services dégradables. Afin de gérer la dégradation des services, nous attribuons des seuils en termes de nombre d&#8217;erreurs et utilisons des régulateurs d’usage desdits services. Les principes clés sont d&#8217;isoler les services problématiques et hautement latents et de les empêcher, par le biais de régulateurs d’erreurs et de timeout, d’entraîner des problèmes similaires ailleurs et, si besoin, désactiver la fonctionnalité de l’application avec des interrupteurs On/Off et des régulateurs de fonctionnalité.</em></p>
<p style="padding-left: 30px;"><em>En ce qui concerne la gestion et le suivi de la ferme web de FarmVille, nous exploitons quelques outils de gestion et de monitoring Open Source. Nous utilisons Nagios pour les alertes (supervision), Munin pour le monitoring et Puppet pour la configuration. Nous nous appuyons fortement sur des systèmes de statistiques internes afin de surveiller la performance des services utilisés par l’application, tels Facebook, DB et Memcache. En outre, dès que nous constatons une dégradation de performance, nous profilons les événements I/O d’une demande, sur une base échantillonnée.</em></p>
<h2>Leçons retenues</h2>
<p>Il manque un peu de détails à mon goût, mais il y a quand même beaucoup de points intéressants qui pourront servir :</p>
<ol>
<li><strong>Les jeux interactifs sont lourds en écriture</strong>. Les applications web typiques lisent plus qu’elles n’écrivent, donc il se peut que plusieurs architectures courantes ne suffisent pas. Des applications lourdes en lecture peuvent souvent s’en sortir à l’aide d’une couche de cache devant une seule base de données. Les applications lourdes en écriture auront besoin de partitionner, les écritures sont donc réparties et/ou utilisent une architecture en mémoire.</li>
<li><strong>Chaque composant      doit être conçu comme un service dégradable</strong>. Isolez les      composants de manière que les latences élevées dans une zone particulière ne      puissent pas impacter une autre. Régulez l’usage afin de réduire les      problèmes. Désactivez les fonctions quand c’est nécessaire.</li>
<li><strong>Mettez les données      Facebook en cache</strong>. Quand vous dépendez fortement d’un composant      externe, pensez à mettre en cache les données du composant afin      d’améliorer les temps de latence.</li>
<li><strong>Prévoyez à l’avance      des pics de trafic liés aux nouveaux lancements</strong>.</li>
<li><strong>Echantillonnez</strong>. En analysant des flux      abondants de données, à la recherche de problèmes par exemple, il n’est pas      nécessaire de traiter chaque donnée. Echantillonner rendra les mêmes      résultats pour beaucoup moins d’effort.</li>
</ol>
<p>J’aimerais remercier Zynga et Luke Rajlich de nous avoir accordé cette interview. Si des lecteurs ont une architecture qu’ils voudraient présenter ici, n’hésitez pas à me contacter.</p>
<p><em><strong>Todd HOFF <a href="http://highscalability.com/">@highscalability.com</a></strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2010/03/comment-farmville-scale-pour-recolter-75-millions-de-joueurs-par-mois/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook et le graphe social : LAMP et Memcache</title>
		<link>http://decrypt.ysance.com/2009/10/facebook-graphe-social-lamp-memcache/</link>
		<comments>http://decrypt.ysance.com/2009/10/facebook-graphe-social-lamp-memcache/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 16:33:53 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[graphe social]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=579</guid>
		<description><![CDATA[Facebook... En voilà une architecture qui fait rêver et qui laisse songeur au vue du volume de connexions simultanées et de données stockées. J'ai récemment regardé une vidéo très intéressante d'une conférence données par Aditya Agarwal (Director of Engineering chez Facebook) durant le QCon SF 2008 (San Fransisco) sur l'architecture de Facebook et plus exactement la couche logicielle utilisée, basée sur le modèle LAMP (Linux, Apache, MySQL, PHP). C'est essentiellement de MySQL et PHP que la conférence traite sur ce modèle. Une belle part est également faite à Memcache. Memcache, cache mémoire réseau qui n'est plus à présenter, et qui a été optimisé par les développeurs de Facebook pour l'occasion. Une brève présentation d'outils "maison" tels que Thrift, Scribe, ... est également effectuée en fin de conférence.

[...]]]></description>
			<content:encoded><![CDATA[<p>Facebook&#8230; En voilà une architecture qui fait rêver et qui laisse songeur au vue du volume de connexions simultanées et de données stockées. J&#8217;ai récemment regardé une vidéo très intéressante d&#8217;une conférence données par Aditya Agarwal (Director of Engineering chez Facebook) durant le QCon SF 2008 (San Fransisco) sur l&#8217;architecture de Facebook et plus exactement la couche logicielle utilisée, basée sur le modèle LAMP (Linux, Apache, MySQL, PHP). C&#8217;est essentiellement de MySQL et PHP que la conférence traite sur ce modèle. Une belle part est également faite à Memcache. Memcache, cache mémoire réseau qui n&#8217;est plus à présenter, et qui a été optimisé par les développeurs de Facebook pour l&#8217;occasion. Une brève présentation d&#8217;outils &laquo;&nbsp;maison&nbsp;&raquo; tels que Thrift, Scribe, &#8230; est également effectuée en fin de conférence.</p>
<p>Vous trouverez cette vidéo en suivant ce lien : <a title="Facebook: Science and the Social Graph" href="http://www.infoq.com/presentations/Facebook-Software-Stack" target="_blank">Facebook: Science and the Social Graph</a>.</p>
<p>La conférence est en anglais et dure 1h00. Je vous conseille de prendre ce temps car les sujets abordés sont forts intéressants.</p>
<p>Je me propose de faire un bref récapitulatif des points de l&#8217;architecture Facebook qui m&#8217;ont semblé importants lors de cette présentation de Aditya Agarwal et d&#8217;en tirer les éléments que nous pouvons appliquer dans nos architectures, même à moindre échelle.</p>
<p><strong><em>Rappel de la problématique du graphe social</em></strong><br />
La difficulté de l&#8217;exploitation d&#8217;un graphe social est que la majeure partie des données sont actives en permanence car chaque utilisiteur peut consulter les données d&#8217;un autre, même si celui-ci n&#8217;est pas connecté. De plus, un utilisateur a en général un nombre de &laquo;&nbsp;connexions&nbsp;&raquo; ou relations non négligeable. Ce qui implique de devoir gérer un volume de données conséquent et accédé en permanence et de mettre à jour toutes ces informations afin que chacun puisse accéder à ses informations et celles de ses relations en &laquo;&nbsp;temps réel&nbsp;&raquo;. Cela implique des problématiques telles que la difficulté de partitionner les données du fait que &laquo;&nbsp;tout le monde est connecté&nbsp;&raquo;, de conserver un maximum d&#8217;informations en cache mémoire (RAM) pour accélérer les requêtes, &#8230; Et je ne parle pas du traitement de tous les accès concurrents !</p>
<p><strong><em>MySQL ou &laquo;&nbsp;comment stocker un graphe social ?&nbsp;&raquo;</em></strong><br />
Tout d&#8217;abord MySQL est utilisé comme une base clé &#8211; valeur. Les données sont distribuées massivement et de manière aléatoire sur un large éventail d&#8217;instances logiques qui elles-mêmes sont réparties sur un ensemble de noeuds physiques. Chaque donnée possède un &laquo;&nbsp;global ID&nbsp;&raquo; (identifiant unique) par lequel elle est accédée. Il n&#8217;y a pas de JOIN (jointure SQL) au niveau des requêtes du fait de la distribution des données. Outre le fait que la majeure partie des données est distribuée (et donc qu&#8217;aucun lien logique ne les rapproche), &laquo;&nbsp;quelques&nbsp;&raquo; méta données sont stockées sur une logique &laquo;&nbsp;par utilisateur&nbsp;&raquo; et sont rassemblées sur un même serveur (ou ensemble de serveurs mais regroupées selon des critères logiques, donc permettant d&#8217;effectuer des jointures) : ce sont les méta informations des utilisateurs telles que le profile, &#8230; Meta informations que l&#8217;on retrouve en cache (Memcache), mais nous verrons cela après.</p>
<p>Il est à noter également que les bases sont optimisées afin d&#8217;accéder plus rapidement aux données récentes ou fréquemment accédées tandis que les plus anciennes sont &laquo;&nbsp;archivées&nbsp;&raquo; (mais toujours disponibles). Il s&#8217;agit du partitionnement ou sharding vertical que j&#8217;ai décrit dans l&#8217;article <a title="Sharding et optimisation des accès aux données" href="http://decrypt.ysance.com/2009/05/sharding-partitionnement-optimisation-acces-aux-donnees/">Sharding et optimisation des accès aux données</a>.</p>
<p>Il est à noter que le moteur de base de données MySQL utilisé par Facebook a subi quelques modifications (mais peu, notamment en comparaison de Memcache), notamment afin de faire de la réplication entre plusieurs data-center et de gérer au mieux la consistence des données. On entend à nouveau parler de la consistence éventuelle des données&#8230; A ce propos, je vous invite à lire cet article <a title="Eventually Consistent - Revisited" href="http://www.allthingsdistributed.com/2008/12/eventually_consistent.html">Eventually Consistent &#8211; Revisited</a> de Werner Vogels (CTO &#8211; Amazon.com) sur son weblog &laquo;&nbsp;All Things Distributed&nbsp;&raquo;. Il explique notamment que la consistence éventuelle, c&#8217;est le fait que pour construire des systèmes fiables (comprendre disponibles &#8211; haute disponibilité) distribués à une échelle mondiale, cela demande un compromis entre consistance (intégrité des données à un instant &laquo;&nbsp;t&nbsp;&raquo; entre plusieurs bases) et disponibilité.</p>
<p>On note également que les objects sont faiblement typés afin de faciliter leur utilisation.</p>
<p><strong><em>Memcache ou &laquo;&nbsp;comment soulager la base ?&nbsp;&raquo;</em></strong><br />
<a title="Site de Memcached" href="http://www.danga.com/memcached/">Memcache</a> (ou Memcached, &laquo;&nbsp;d&nbsp;&raquo; pour daemon &#8211; démon), une hashtable haute performance distribuée (accès via interface réseau) stockée en mémoire (RAM), pour Facebook c&#8217;est 25TB de données et des temps de réponse moyens &lt; 200 <span style="text-decoration: underline;">micro</span>-secondes. Memcache permet de soulager les bases MySQL, voire plutôt de les sauver, et d&#8217;avoir des temps de réponse bien meilleurs. Y sont stockées beaucoup de données et notamment des objets PHP &laquo;&nbsp;pré-calculés&nbsp;&raquo; et sérialisés. Les requêtes sont effectuées via les &laquo;&nbsp;global ID&nbsp;&raquo; en &laquo;&nbsp;multi-get&nbsp;&raquo; (sur de telles volumétries, oubliez les get). Les chiffres annoncés en termes de hit rate pour Memcache sont supérieurs à 95%.</p>
<p>Concernant l&#8217;aspect customisation de Memcache, il a été modifié en profondeur, notamment en remplaçant les accès protocolaires TCP par des UDP, impliquant l&#8217;ajout d&#8217;un contrôle de cohérence au niveau applicatif afin de prévenir les pertes de données et de combler la lacune laissée par le passage de TCP à UDP. Le Kernel du système a également été modifié, &#8230;</p>
<p>A la question d&#8217;un invité sur &laquo;&nbsp;qui a fait ces modifications ?&nbsp;&raquo; que ce soit pour Memcache ou bien MySQL, on notera la réponse : &laquo;&nbsp;des gens qui connaissent&nbsp;&raquo;. C&#8217;est dit : ne reproduisez pas à la maison ce que vous venez de voir à la conférence ! Plus sérieusement, les modèles décrits sont applicables à nos cas d&#8217;utilisation plus modestes, cependant il n&#8217;est pas conseillé (ni forcément nécessaire pour nos cas) d&#8217;effectuer des modifications aussi en profondeur. On notera que la version UDP de Memcache devra être (est ?) à disposition de la communauté. Cependant est-ce que nous pourrons l&#8217;utiliser telle quel sachant toutes les modifications annexes apportées par Facebook (Kernel, &#8230;) ?</p>
<p><strong><em>LAMP is not perfect</em></strong><br />
Effectivement, LAMP ne s&#8217;applique pas à tous les cas et n&#8217;est pas exempt d&#8217;inconvénients. Commençons par PHP, stateless et pas si rapide, en tout cas moins que des langages compilés. De plus, certaines fonctionnalités sont présentes dans d&#8217;autres langages et non dans PHP. D&#8217;où le développement par Facebook de services accédés par PHP : chaque service est développé dans le langage (JAVA, Erlang, Python, &#8230;) optimisé pour la tâche qui lui incombe. Cependant, ces services (nécessaires) induisent la présence d&#8217;autres failure points éventuels et ajoute un coût de déploiement et de maintenance.</p>
<p><strong><em>Les outils &laquo;&nbsp;maison&nbsp;&raquo;</em></strong><br />
La présentation s&#8217;achève par une rapide présentation, disons plutôt citation, faute de temps, des outils &laquo;&nbsp;maison&nbsp;&raquo; tels que Thrift, Scribe, SMC (Service Management Console), &#8230; Vous pouvez retrouvez certains de ces outils et notamment Thrift et Scribe et bien d&#8217;autres encore (Cassandra, &#8230;) sur le <a title="Site des développeurs de Facebook" href="http://developers.facebook.com/">Site des développeurs de Facebook</a>, dans la rubrique <a title="Site des développeurs de Facebook, rubrique Community - Open Source" href="http://developers.facebook.com/opensource.php">Community &#8211; Open Source</a>.</p>
<p><strong><em>Conclusion</em></strong><br />
Cette conférence, comme je vous l&#8217;ai précisé, est en anglais et dure 1h00, mais elle vaut le coût de part les sujets abordés forts intéressants. On appréciera cette incursion dans l&#8217;architecture logicielle de Facebook et plus généralement des réseaux sociaux et des applications bâties sur l&#8217;exploitation de graphes sociaux et dont le leitmotiv est &laquo;&nbsp;scalabilité !&nbsp;&raquo;.</p>
<p><strong><em>Frédéric FAURE</em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2009/10/facebook-graphe-social-lamp-memcache/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
