<?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>OCTO talks !</title>
	<atom:link href="http://blog.octo.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.octo.com</link>
	<description>Le blog d&#039;OCTO Technology, cabinet d&#039;architectes en systèmes d&#039;information</description>
	<lastBuildDate>Tue, 15 May 2012 12:26:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Agile france 2012 : 7 sessions by OCTO</title>
		<link>http://blog.octo.com/agile-france-2012-7-sessions-by-octo/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=agile-france-2012-7-sessions-by-octo</link>
		<comments>http://blog.octo.com/agile-france-2012-7-sessions-by-octo/#comments</comments>
		<pubDate>Tue, 15 May 2012 07:00:42 +0000</pubDate>
		<dc:creator>Frederic Merizen</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[Méthodologie et conduite du changement]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Agilité]]></category>
		<category><![CDATA[conférence]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=31520</guid>
		<description><![CDATA[La conférence Agile France ouvrira ses portes au Chalet de la Porte Jaune les 24 et 25 mai. OCTO sera présent avec pas moins de sept sessions cette année. Contrôlez vous ce que vous mesurez ? Thomas Lissajoux et Jonathan Scher : faut-il mesurer ce qu’on veut améliorer ? Vous mesurez certainement la vélocité ou les [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/octo-presente-cinq-sessions-dans-le-cadre-de-la-conference-agile-france/' rel='bookmark' title='Octo présente cinq sessions dans le cadre de la conférence Agile France'>Octo présente cinq sessions dans le cadre de la conférence Agile France</a></li>
<li><a href='http://blog.octo.com/interview-des-orateurs-octo-pour-la-conference-agile-france/' rel='bookmark' title='Interview des orateurs OCTO pour la conférence Agile France'>Interview des orateurs OCTO pour la conférence Agile France</a></li>
<li><a href='http://blog.octo.com/octo-soutien-agile-open-france-2009/' rel='bookmark' title='Octo soutient : Agile Open France 2009'>Octo soutient : Agile Open France 2009</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p><a href="http://conf.agile-france.org/" target="_blank"><img class="alignright size-full wp-image-31527" title="AgileFranceConference2012-logo-orateur" src="http://blog.octo.com/wp-content/uploads/2012/05/AgileFranceConference2012-logo-orateur.png" alt="" width="199" height="199" /></a></p>
<p>La <a href="http://conf.agile-france.org/" target="_blank">conférence Agile France</a> ouvrira ses portes au Chalet de la Porte Jaune les 24 et 25 mai. OCTO sera présent avec pas moins de sept sessions cette année.</p>
<p><a href="http://blog.octo.com/author/tli/" target="_blank"><img style="clear: none;" title="Thomas Lissajoux" src="http://blog.octo.com/wp-content/uploads/2012/05/thomas-lissajoux.jpg" alt="" width="70" height="70" /></a><a href="http://blog.octo.com/author/gdu/" target="_blank"><img style="clear: none;" title="Guillaume Duquesnay" src="http://blog.octo.com/wp-content/uploads/2012/05/guillaume-duquesnay.jpg" alt="" width="70" height="70" /></a><a href="http://blog.octo.com/author/jsc/" target="_blank"><img style="clear: none;" title="Jonathan Scher" src="http://blog.octo.com/wp-content/uploads/2012/05/jonathan-scher.jpg" alt="" width="70" height="70" /></a><a href="http://blog.octo.com/author/jfh/" target="_blank"><img style="clear: none;" title="Jean-François Hélie" src="http://blog.octo.com/wp-content/uploads/2012/05/jean-fran%C3%A7ois-helie.jpg" alt="" width="70" height="70" /></a><a href="http://blog.octo.com/author/fme-2/" target="_blank"><img style="clear: none;" title="Frederic Merizen" src="http://blog.octo.com/wp-content/uploads/2012/05/frederic-merizen.jpg" alt="" width="70" height="70" /></a><a href="http://blog.octo.com/author/mde/" target="_blank"><img style="clear: none;" title="Mathieu Despriee" src="http://blog.octo.com/wp-content/uploads/2012/05/mathieu-despriee.jpg" alt="" width="70" height="70" /></a><a href="http://blog.octo.com/author/hlo/" target="_blank"><img style="clear: none;" title="Hervé Lourdin" src="http://blog.octo.com/wp-content/uploads/2012/05/herve-lourdin.jpg" alt="" width="70" height="70" /></a><br />
<span id="more-31520"></span></p>
<ul>
<li><strong><a href="http://conf.agile-france.org/?speakers=controlez-vous-ce-que-vous-mesurez" target="_blank">Contrôlez vous ce que vous mesurez ?</a></strong> <a href="http://blog.octo.com/author/tli/" target="_blank">Thomas Lissajoux</a> et <a href="http://blog.octo.com/author/jsc/" target="_blank">Jonathan Scher</a> : faut-il mesurer ce qu’on veut améliorer ? Vous mesurez certainement la vélocité ou les coûts de vos projets, mais à part ça ? Et que se passerait-il si ces données étaient ouvertes et publiques ?</li>
<li><strong><a href="http://conf.agile-france.org/?speakers=extreme-quotation-le-planning-poker-sous-steroides" target="_blank">eXtreme Quotation : le planning poker sous stéroïdes</a></strong> <a href="http://blog.octo.com/author/jsc/" target="_blank">Jonathan Scher</a> et <a href="http://blog.octo.com/author/gdu/" target="_blank">Guillaume Duquesnay</a> : apprenez à <a href="http://blog.octo.com/extreme-quotation-planning-agile-sous-steroides/" target="_blank">estimer 90 stories en moins de 20 minutes</a>, sans perdre en confiance par rapport à un planning poker.</li>
<li><strong><a href="http://conf.agile-france.org/?speakers=des-codeuses-dans-votre-equipe" target="_blank">Des codeuses dans votre équipe ?</a></strong> <a href="http://blog.octo.com/author/gdu/" target="_blank">Guillaume Duquesnay</a> : pourquoi y a-t-il si peu de développeuses dans nos DSI ? Que gagnerait votre équipe en y remédiant ?</li>
<li><strong><a href="http://conf.agile-france.org/?speakers=des-outils-de-coaching-pour-ameliorer-la-dynamique-de-votre-equipe" target="_blank">Des outils de coaching pour améliorer la dynamique de votre équipe</a></strong> <a href="http://blog.octo.com/author/jfh/" target="_blank">Jean-François Hélie</a> et <a href="http://blog.octo.com/author/gdu/" target="_blank">Guillaume Duquesnay</a> : un gros projet en situation critique. Un virage vers l&#8217;agile réussi. Les outils de coaching qui ont permis à l&#8217;équipe de prendre ses responsabilités et s&#8217;auto-organiser.</li>
<li><strong><a href="http://conf.agile-france.org/?speakers=agile-sur-un-projet-court-etes-vous-prets" target="_blank">Agile sur un projet court : êtes vous prêts ?</a></strong> <a href="http://blog.octo.com/author/gdu/" target="_blank">Guillaume Duquesnay</a> et <a href="http://blog.octo.com/author/jsc/" target="_blank">Jonathan Scher</a> : sur un projet de moins de 2 mois, pas le temps de laisser les choses se tasser. Les règles du jeu pour réussir un projet court en agile.</li>
<li><strong><a href="http://conf.agile-france.org/?speakers=entre-technical-leaders-comment-faire-un-dojo" target="_blank">Entre Technical Leaders : Comment faire un Dojo ?</a></strong> <a href="http://blog.octo.com/author/gdu/" target="_blank">Guillaume Duquesnay</a> et <a href="http://blog.octo.com/author/fme-2/" target="_blank">Frederic Merizen</a> : un cercle de pratiques : partageons nos expériences, écrivons ensemble le guide d&#8217;un coding dojo réussi.</li>
<li><strong><a href="http://conf.agile-france.org/?speakers=retour-dexperience-sur-un-projet-agile-a-large-echelle" target="_blank">Retour d’expérience sur un projet Agile à large échelle</a></strong> <a href="http://blog.octo.com/author/mde/" target="_blank">Mathieu Despriee</a> et <a href="http://blog.octo.com/author/hlo/" target="_blank">Hervé Lourdin</a> : un projet : 80 personnes sur 9 équipes dans 4 pays. Oui, <a href="http://blog.octo.com/compte-rendu-du-petit-dejeuner-organise-par-octo-et-strator-retour-dexperience-lagilite-a-grande-echelle/" target="_blank">l&#8217;agilité fonctionne pour les gros projets</a>. Voici comment.</li>
</ul>
<p>Nous suivrons avec intérêt les autres sessions. Quelques highlights :</p>
<ul>
<li>Le manager agile : Hors de la zone de confort par Gabriel Le Van</li>
<li>Mon binôme m&#8217;a tuer par Jonathan Perret et Emmanuel Gaillot</li>
<li>The recent evolution of consumer products par Régis Medina</li>
<li>Retour d&#8217;expérience : Agile contre Cycle en V : Le match par Étienne Charignon</li>
</ul>
<p>Vous voulez parler d&#8217;agilité ? Venez nous rencontrer à <a href="http://conf.agile-france.org/" target="_blank">Agile France</a> les 24 et 25 mai prochains, les Octos seront présents.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=31520" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/octo-presente-cinq-sessions-dans-le-cadre-de-la-conference-agile-france/' rel='bookmark' title='Octo présente cinq sessions dans le cadre de la conférence Agile France'>Octo présente cinq sessions dans le cadre de la conférence Agile France</a></li>
<li><a href='http://blog.octo.com/interview-des-orateurs-octo-pour-la-conference-agile-france/' rel='bookmark' title='Interview des orateurs OCTO pour la conférence Agile France'>Interview des orateurs OCTO pour la conférence Agile France</a></li>
<li><a href='http://blog.octo.com/octo-soutien-agile-open-france-2009/' rel='bookmark' title='Octo soutient : Agile Open France 2009'>Octo soutient : Agile Open France 2009</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/agile-france-2012-7-sessions-by-octo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les patterns des grands du Web &#8211; Fluidité de l’expérience l’utilisateur</title>
		<link>http://blog.octo.com/fluidite-de-lexperience-lutilisateur/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=fluidite-de-lexperience-lutilisateur</link>
		<comments>http://blog.octo.com/fluidite-de-lexperience-lutilisateur/#comments</comments>
		<pubDate>Mon, 14 May 2012 09:28:23 +0000</pubDate>
		<dc:creator>Guillaume Plouin</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[Ergonomie]]></category>
		<category><![CDATA[les grands du web]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=30288</guid>
		<description><![CDATA[“L’ergonomie n’est plus négociable aujourd’hui”. OCTO Technology L’aspect incontournable de la performance Il existe une conviction partagée chez les grands du Web : la performance perçue par l’utilisateur est critique. Cette performance a en effet un impact direct sur l&#8217;adoption du service et son utilisation dans la durée. Et le ressenti utilisateur est directement lié [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/sharding/' rel='bookmark' title='Les Patterns des Grands du Web – Sharding'>Les Patterns des Grands du Web – Sharding</a></li>
<li><a href='http://blog.octo.com/les-patterns-des-grands-du-web-openapi-ou-ecosysteme-ouvert/' rel='bookmark' title='Les Patterns des Grands du Web : « OpenAPI » ou écosystème ouvert'>Les Patterns des Grands du Web : « OpenAPI » ou écosystème ouvert</a></li>
<li><a href='http://blog.octo.com/test-ab/' rel='bookmark' title='Les Patterns des Grands du Web – Test A/B'>Les Patterns des Grands du Web – Test A/B</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p><em>“L’ergonomie n’est plus négociable aujourd’hui”. OCTO Technology</em></p>
<h2>L’aspect incontournable de la performance</h2>
<p>Il existe une conviction partagée chez les grands du Web : la performance perçue par l’utilisateur est critique. Cette performance a en effet un impact direct sur l&#8217;adoption du service et son utilisation dans la durée. Et le ressenti utilisateur est directement lié à la rapidité d’affichage des interfaces.</p>
<p>Le grand public se moque bien de l’architecture logicielle, de la puissance des serveurs, de la latence réseau provoquée par l’appel à des Web services&#8230; Tout ce qui lui importe, c’est l’impression de fluidité dans l’usage.</p>
<p><span id="more-30288"></span></p>
<p>Les grands du Web l’ont bien compris et parlent ainsi de mesure en “battement de cils”. Tout se joue donc à l’échelle du 1/10<sup>ème</sup> de seconde. Leurs études, réalisées notamment grâce à du test A/B (cf. <a title="Test A/B" href="http://blog.octo.com/test-ab/" target="_blank">article</a> à ce sujet), le démontrent clairement :</p>
<ul>
<li>Amazon : une augmentation de + 100 ms de la latence signifie -1 % de ventes</li>
<li>Google : plus de 500 ms au chargement signifie &#8211; 20 % de trafic (pages vues)</li>
<li>Yahoo : plus de 400 ms au chargement signifie + 5 à  9 % d’abandon (rebond)</li>
<li>Bing : plus d’une 1 seconde au chargement signifie &#8211; 2,8 % de revenu publicitaire</li>
</ul>
<h2>Comment assurer cette performance</h2>
<p>Suivant en cela le Pattern “device agnostic”, les grands du Web développent parfois des interfaces natives, parfois des interfaces Web, afin de toujours offrir la meilleure expérience utilisateur. Dans les deux cas, la performance perçue par l’utilisateur doit être maximisée.</p>
<h2><strong>Applications natives</strong></h2>
<p>Avec l’iPhone, Apple a réintroduit le développement au plus près du matériel (sans revenir à l’assembleur, tout de même) pour maximiser les performances perçues. Ainsi les technologies Java et Flash sont bannies de l’iPhone. La plateforme utilise aussi des artifices visuels : au lancement d’une application, il peut charger la vue du dernier état de l’application pour maximiser l’impression d’instantanéité, la véritable application étant chargée en tâche de fond. Sur Android, les applications Java sont exécutées sur une machine virtuelle optimisée pour la plateforme. Elles peuvent aussi être écrite en C pour maximiser les performances.</p>
<p>De manière générale, un consensus s’est dessiné autour du développement natif, en particulier sur plateformes mobiles : il doit être au plus près du matériel. Et des technologies multiplateformes comme JME, Flash ou Silverlight tendent à tomber en désuétude pour privilégier l’expérience utilisateur.</p>
<h2><strong>Applications Web</strong></h2>
<p>Le chargement complet d’un écran Web est souvent de l’ordre de 4 à 10 secondes tout compris (avec les images, le JavaScript, Le Flash, etc.)</p>
<p>Il apparaît que la lenteur d’affichage perçue est généralement liée pour 5% aux traitements sur serveurs, et pour 95% aux traitements du navigateur. Les grands du Web apportent donc un soin tout particulier à l’optimisation de l’affichage des pages Web.</p>
<p>Voici une liste des principales bonnes pratiques qui font consensus :</p>
<ul>
<li>Il est crucial de <strong>mettre en cache les ressources statiques </strong>(les images, les feuilles de style CSS, les scripts JavaScript, les films Flash, etc.) lorsque c’est possible. Il existe pour cela diverses technologies de cache HTTP. L’optimisation de la durée de vie des ressources dans le cache est ainsi une compétence à acquérir.</li>
<li>Il est recommandé d’utiliser un <strong>réseau de cache</strong>, ou Content Delivery Network (<a title="CDN et Pay as you go" href="http://blog.octo.com/perspectives-cdn-et-pay-as-you-go/" target="_blank">CDN</a>),  pour placer les ressources au plus près des utilisateurs et limiter l’impact de la latence réseau. Disposer de serveurs de cache dans tous les pays où résident des utilisateurs est vivement recommandé.</li>
<li>Le <strong>chargement en tâche de fond </strong>permet de masquer la lenteur d’affichage de certains éléments de la page.</li>
<li>Une pratique, très fréquente consiste à utiliser des “<strong>sprites</strong>” : il s’agit d’agréger des images dans un même fichier pour limiter le nombre de ressources à charger ; elles seront ensuite découpées à la volée par le navigateur (voir l’exemple Gmail ci dessous).</li>
<li>Le recours à des <strong>noms de domaines multiples </strong>permet de maximiser la parallélisation dans le chargement simultané de ressources par le navigateur. En effet, les navigateurs sont soumis à un nombre maximal de requêtes simultanées sur un même domaine. Ainsi Yahoo.fr charge ses images à partir de l.yimg.com</li>
<li>Placer les <strong>ressources JavaScript en toute fin de page</strong> pour que le visuel apparaisse le plus vite possible</li>
<li><strong>Minifier</strong>, c’est à dire supprimer du code tous les caractères (retour chariot, commentaires) servant à la relecture mais pas l’exécution du code.</li>
<li>Compacter les différents <strong>fichiers de code source tels que JavaScript dans un seul fichier</strong>, quand c’est possible</li>
</ul>
<h2>Chez qui ça fonctionne ?</h2>
<p>Les exemples d’usage du pattern sont nombreux chez les grands du Web : on peut citer Google, Gmail, Amazon, Yahoo, &#8230;</p>
<h3>Les références chez les grands du Web</h3>
<p>Google possède le réseau de cache distribué le plus maillé des grands du Web : le géant de la recherche disposerait de machines dans toutes les grandes villes, et même d’un réseau privé mondial, selon des rumeurs difficiles à vérifier.</p>
<p>Google Search pousse l’expérience utilisateur temps réel très loin avec “Instant Search” qui charge les résultats de recherche au fur et à mesure de la frappe clavier. Cette fonction est une prouesse technique : elle a soulevé nombre de questions dans la communauté des architectes (cf. liens ci dessous).</p>
<p>Gmail est construit quasiment en HTML : les images de l‘interface sont réduites au strict nécessaire (2 “sprites” d’icônes, voir ci dessous), et  le site fait un usage extensif du cache et du chargement JavaScript en tâche de fond.</p>
<h2 style="text-align: center;"><span style="text-align: left;"><a href="http://blog.octo.com/wp-content/uploads/2012/03/interface.png"><img class="size-medium wp-image-30292 aligncenter" title="les images de l‘interface" src="http://blog.octo.com/wp-content/uploads/2012/03/interface-300x176.png" alt="" width="300" height="176" /></a></span></h2>
<h3><span style="text-align: left;">France</span></h3>
<p>Sites utilisant ou ayant utilisé le réseau de cache distribué (CDN) Akamai :</p>
<ul>
<li>cite-sciences.fr</li>
<li>LeMonde.fr</li>
<li>Allocine.com</li>
<li>UrbanDive.com</li>
</ul>
<h2>Et chez moi ?</h2>
<p>L’effet de la latence d’affichage est le même sur les applications internes, propres à une DSI : exaspération des utilisateurs et abandon du recours à l’application.</p>
<p>Le pattern s’applique donc parfaitement en interne.</p>
<h2>Exceptions !</h2>
<p>Elles sont rares : on peut évoquer les applications asynchrones et les batchs.</p>
<h2>Sources</h2>
<ul>
<li>Présentation “Performance des applications web, quoi faire et pourquoi ?” lors de l’USI 2010 : <a href="http://goo.gl/C57B8">http</a><a href="http://goo.gl/C57B8">://</a><a href="http://goo.gl/C57B8">goo</a><a href="http://goo.gl/C57B8">.</a><a href="http://goo.gl/C57B8">gl</a><a href="http://goo.gl/C57B8">/</a><a href="http://goo.gl/C57B8">C</a><a href="http://goo.gl/C57B8">57</a><a href="http://goo.gl/C57B8">B</a><a href="http://goo.gl/C57B8">8</a></li>
</ul>
<ul>
<li style="text-align: left;">Article sur Google Instant Search : <a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">http</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">://</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">highscalability</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">.</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">com</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">/</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">blog</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">/2010/9/9/</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">how</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">-</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">did</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">-</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">google</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">-</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">instant</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">-</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">become</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">-</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">faster</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">-</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">with</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">-5-7</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">x</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">-</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">more</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">-</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">results</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">.</a><a href="http://highscalability.com/blog/2010/9/9/how-did-google-instant-become-faster-with-5-7x-more-results.html">html</a></li>
<li style="text-align: left;"><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">http</a><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">://</a><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">googleblog</a><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">.</a><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">blogspot</a><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">.</a><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">com</a><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">/2010/09/</a><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">google</a><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">-</a><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">instant</a><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">-</a><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">behind</a><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">-</a><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">scenes</a><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">.</a><a href="http://googleblog.blogspot.com/2010/09/google-instant-behind-scenes.html">html</a></li>
</ul>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=30288" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/sharding/' rel='bookmark' title='Les Patterns des Grands du Web – Sharding'>Les Patterns des Grands du Web – Sharding</a></li>
<li><a href='http://blog.octo.com/les-patterns-des-grands-du-web-openapi-ou-ecosysteme-ouvert/' rel='bookmark' title='Les Patterns des Grands du Web : « OpenAPI » ou écosystème ouvert'>Les Patterns des Grands du Web : « OpenAPI » ou écosystème ouvert</a></li>
<li><a href='http://blog.octo.com/test-ab/' rel='bookmark' title='Les Patterns des Grands du Web – Test A/B'>Les Patterns des Grands du Web – Test A/B</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/fluidite-de-lexperience-lutilisateur/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un opérateur télécom doit-il être autre chose qu’un tuyau ?</title>
		<link>http://blog.octo.com/un-operateur-telecom-doit-il-etre-autre-chose-quun-tuyau/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=un-operateur-telecom-doit-il-etre-autre-chose-quun-tuyau</link>
		<comments>http://blog.octo.com/un-operateur-telecom-doit-il-etre-autre-chose-quun-tuyau/#comments</comments>
		<pubDate>Fri, 11 May 2012 12:33:35 +0000</pubDate>
		<dc:creator>Bertrand Paquet</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[Architecture et technologies]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=30492</guid>
		<description><![CDATA[Quel &#171;&#160;business model&#160;&#187; pour les opérateurs de télécommunications grand public ? Orange, Bouygues Télécom et SFR se veulent fournisseurs de services, voire de contenus, et donc ne veulent pas être de simples fournisseurs de tuyaux. La 4G, les &#171;&#160;pure players&#160;&#187; internet, les nouveaux usages, les réglementations de l’Arcep et autres remettent en cause cette vision. [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/combien-de-temps-doit-prendre-un-build-maven/' rel='bookmark' title='Combien de temps doit prendre un build Maven ?'>Combien de temps doit prendre un build Maven ?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p>Quel &laquo;&nbsp;business model&nbsp;&raquo; pour les opérateurs de télécommunications grand public ? Orange, Bouygues Télécom et SFR se veulent fournisseurs de services, voire de contenus, et donc ne veulent pas être de simples fournisseurs de tuyaux. La 4G, les &laquo;&nbsp;pure players&nbsp;&raquo; internet, les nouveaux usages, les réglementations de l’Arcep et autres remettent en cause cette vision. Ce billet est l’occasion de partager quelques réflexions autour de cette question : quel &laquo;&nbsp;business model&nbsp;&raquo; pour les opérateurs grand public ?</p>
<p><span id="more-30492"></span></p>
<p>Prenons d’abord les précautions d’usage: il ne reflète que nos opinions personnelles et pas celles de notre employeur.</p>
<h3>4G = tout IP</h3>
<p>Les <a href="http://fr.wikipedia.org/wiki/4G">nouveaux réseaux 4G</a> seront des réseaux full IP. Même la voix n’est plus qu’un service parmi d’autres, construits sur la stack IP, qui a décidément bien réussi à enterrer les protocoles de la téléphonie traditionnelle&#8230; Cela tend à simplifier l’architecture réseaux des opérateurs : plus de <a href="http://fr.wikipedia.org/wiki/Mobile_service_Switching_Center">MSC</a> par exemple. Quel est l&#8217;impact de ce changement de protocole ? Les opérateurs n’auront plus la maîtrise de certains services. Quelques exemples : <a href="https://www.icloud.com/">iCloud</a> qui remplace les SMS, <a href="http://www.viber.com/">Viber</a> ou <a href="http://www.skype.com">Skype</a> qui remplace le téléphone.</p>
<p>L’opérateur mobile devient donc un opérateur IP. Or le business model des opérateurs IP (des entreprises inconnues du grand public), est différent des opérateurs grand public : il est entièrement orienté tuyau : pas ou très peu de services à valeur ajoutée, facturation à la bande passante ou au volume de donnée transporté&#8230; Les seuls services que vendent ces opérateurs sont des services « techniques » de communication : hosting, routage&#8230; Rien qui puisse intéresser le grand public ni faire la différence entre deux offres, si ce n&#8217;est la qualité du réseau en terme de couverture et de débit.</p>
<h3>Les services</h3>
<p>Nous sommes toujours surpris quand nous découvrons les interfaces web offertes par les opérateurs pour consulter sa messagerie @mon_opérateur.fr. Quel retard face à Gmail, Windows Live, ou Yahoo ! Ce genre de service n’est pas, et, pour nous, ne sera jamais le &laquo;&nbsp;core business&nbsp;&raquo; d’un opérateur. De plus, un opérateur ne pourra pas concurrencer les &laquo;&nbsp;pure players&nbsp;&raquo; sur ce terrain. Un exemple : une offre de vidéo à la demande. Certes la proximité du réseau va avantager l’opérateur en termes de performances. Mais en termes de fonctionnalité et de catalogue, un acteur spécialisé s’en sortira mieux qu’un opérateur, puisqu&#8217;il ne fait que ça. Par ailleurs, la réglementation de l’Arcep permet, en France, de changer facilement d’opérateur. Du coup, pourquoi choisir un service lié à un opérateur, plutôt qu’un autre, indépendant de l’opérateur, multi-device et donc accessible sur un téléphone Android, sur un iPad ou sur son ordinateur ? A ce titre, certains opérateurs ont des partenariats (<a href="http://www.deezer.com">deezer</a>, <a href="http://www.canalplus.fr">canalplus</a>) et proposent ces services dans leurs catalogues. Ce service n&#8217;est cependant pas lié à l&#8217;opérateur.</p>
<p>D’un autre côté, ayant le contrôle du réseau, les opérateurs sont capables d&#8217;offrir de meilleurs performances à certains fournisseurs de services ou de garantir des performances à leurs utilisateurs. L&#8217;utilisation de tels systèmes peut, dans certains cas, porter atteinte à la <a href="http://fr.wikipedia.org/wiki/Neutralit%C3%A9_du_r%C3%A9seau">neutralité du réseau</a>. Un exemple : Orange propose <a href="http://assistance.orange.fr/musique-premium-deezer-presentation-de-l-option-420.php">un abonnement Deezer</a>. Depuis un portable Orange, la QoS (Quality Of Service) vers Deezer devrait donc être meilleure que vers <a href="http://www.spotify.com/">Spotify</a> ou autre (soit dit en passant, le problème se pose déjà sur l’ADSL, ou certains opérateurs limitaient le débit vers certains services : au hasard feu MegaUpload, ou à un certain moment, <a href="http://www.dailymotion.com/">DailyMotion</a>). Pour un opérateur télécom, fournir un service et assurer la neutralité du réseau est donc un exercice difficile, voire impossible : favoriser le service que l’on vend sans défavoriser les concurrents de ce service&#8230;</p>
<p>Y a-t-il des services qui seraient vraiment plus efficaces proposés par un opérateur, plutôt que par un tiers sur Internet ? Personnellement, pour un usage grand public, nous n’en voyons pas, du moins en full-IP comme sur la 4G. Même la TV devrait pouvoir passer normalement sur de la 4G, de la même façon que sur Internet. Et si les opérateurs proposent des services avec de meilleures performances, on revient au problème évoqué ci-dessus sur la neutralité du réseau. Les services sur lesquels les opérateurs devraient garder la main sont des services &laquo;&nbsp;bas niveau&nbsp;&raquo;, très liés au réseau : géolocalisation, authentification, identification, paiement&#8230; Ces services sont des briques sur lesquels les fournisseurs de services de plus haut niveau pourront s’appuyer pour améliorer leur offre.</p>
<h3>Relation client</h3>
<p>Les opérateurs actuels gèrent la relation client. Ils peuvent utiliser cette position pour leur fournir des services à valeur ajoutée. Il est néanmoins probable que cet avantage se réduise. Apple et Google gèrent aussi des clients, via IOS et iTunes, Android et GoogleApps. Facebook et Twitter aussi. La part de ces acteurs &laquo;&nbsp;nouveaux&nbsp;&raquo; va s’amplifier, au détriment des opérateurs, car la valeur de leur marque est souvent plus puissante que celle des opérateurs pour attirer les clients à utiliser leur service. Un exemple, la messagerie visuelle de l’iPhone : c’est Apple qui a imposé aux opérateurs la façon de travailler. Un autre exemple : on assiste souvent à des débats sans fin iPhone versus Android. Rarement à des débats Orange versus SFR versus Bouyges Telecom. Ce choix-là ne se faisant généralement plus que sur le prix, ou la qualité du réseau.</p>
<p>Dans ce nouveau modèle économique que l&#8217;<a href="http://www.oecd-ilibrary.org/science-and-technology/oecd-communications-outlook_19991460">OCDE</a> désigne comme modèle de la &laquo;&nbsp;connectivité sponsorisée&nbsp;&raquo;, la relation entre le client et le fournisseur d&#8217;accès n&#8217;existe pas, la relation client étant portée par le prestataire de service. Cette transformation a déjà eu lieu pour Tomtom Live services ou Kindle Amazon, l&#8217;utilisateur n&#8217;a pas d&#8217;abonnement à un opérateur et ne sait pas quel est l&#8217;opérateur utilisé. L&#8217;opérateur télécom devient fournisseur d&#8217;infrastructure, et le fournisseur de service ou de terminal électronique (désigné comme &laquo;&nbsp;device subscriber&nbsp;&raquo;) package l&#8217;accès au réseau dans son produit. Il est intéressant de constater qu&#8217;en seulement 1 an, chez AT&amp;T, le nombre d&#8217;abonnement lié aux &laquo;&nbsp;device subscribers&nbsp;&raquo; a plus que doublé en passant de 3,3 Millions à 7,8 millions soit environ 9% du total de leur souscriptions d&#8217;abonnement mobiles .</p>
<h3>Conclusion</h3>
<p>Que va-t-il se passer ? Le plus probable est que, hélas, nous assistions à la fin de la neutralité des réseaux. Pour compenser les coûts induits par la toujours plus grande consommation de bande passante, les opérateurs vont probablement vendre des services sans maintenir l’équité de entre fournisseurs. Le bras de fer entre les opérateurs et les défenseurs de la neutralité est en cours&#8230; Une neutralité maintenue et revendiquée pourrait alors devenir un argument commercial.</p>
<p>Un autre scénario est que les opérateurs recentrent leur business model autour du modèle fournisseur de tuyau, voir fournisseur de tuyau ++ (avec les services / API de bas niveau évoqué ci-dessus). Cela leur permettrait de réduire leur coûts en terme de complexité d’offre, de marketing, de développement de services, et de se recentrer sur leur &laquo;&nbsp;core business&nbsp;&raquo;, le réseau. Egalement de se positionner les uns par rapport aux autres sur le plus important : la qualité de l’accès réseau.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=30492" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/combien-de-temps-doit-prendre-un-build-maven/' rel='bookmark' title='Combien de temps doit prendre un build Maven ?'>Combien de temps doit prendre un build Maven ?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/un-operateur-telecom-doit-il-etre-autre-chose-quun-tuyau/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les Patterns des Grands du Web – Sharding</title>
		<link>http://blog.octo.com/sharding/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sharding</link>
		<comments>http://blog.octo.com/sharding/#comments</comments>
		<pubDate>Wed, 09 May 2012 05:33:49 +0000</pubDate>
		<dc:creator>Marc Bojoly</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[consistent hashing]]></category>
		<category><![CDATA[les grands du web]]></category>
		<category><![CDATA[sharding]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=30844</guid>
		<description><![CDATA[Dans tout système d’information, les données sont un actif important qu’il faut capturer, conserver et traiter de façon fiable et efficace. Là où un serveur central joue très souvent le rôle de gardien des données, la majorité des grands du web ont opté pour une autre stratégie : le « sharding » ou distribution des données [1]. Le [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/fluidite-de-lexperience-lutilisateur/' rel='bookmark' title='Les patterns des grands du Web &#8211; Fluidité de l’expérience l’utilisateur'>Les patterns des grands du Web &#8211; Fluidité de l’expérience l’utilisateur</a></li>
<li><a href='http://blog.octo.com/les-patterns-des-grands-du-web-openapi-ou-ecosysteme-ouvert/' rel='bookmark' title='Les Patterns des Grands du Web : « OpenAPI » ou écosystème ouvert'>Les Patterns des Grands du Web : « OpenAPI » ou écosystème ouvert</a></li>
<li><a href='http://blog.octo.com/test-ab/' rel='bookmark' title='Les Patterns des Grands du Web – Test A/B'>Les Patterns des Grands du Web – Test A/B</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p>Dans tout système d’information, les données sont un actif important qu’il faut capturer, conserver et traiter de façon fiable et efficace. Là où un serveur central joue très souvent le rôle de gardien des données, la majorité des grands du web ont opté pour une autre stratégie : le <strong>« sharding » ou distribution</strong> des données <a title="" href="#_ftnref1">[1]</a>.</p>
<p>Le sharding décrit ainsi un ensemble de techniques qui permet de répartir les données sur plusieurs machines pour assurer la scalabilité de l’architecture.</p>
<p><span id="more-30844"></span></p>
<h2><strong>Les besoins </strong></h2>
<p>Avant de détailler l’implémentation, revenons sur les besoins d’origine. On retrouve chez les grands du web plusieurs problématiques communes assez connues : le stockage et l’analyse <strong>d’énormes quantités de données,</strong> <a title="" href="#_ftnref2">[2]</a><strong>, </strong> des <strong>enjeux forts de performance</strong> pour avoir des temps de réponse faibles, des enjeux de <strong>scalabilité <a title="" href="#_ftnref3">[3]</a> voire d’élasticité <a title="" href="#_ftnref4">[4]</a> </strong>liés aux pics de consultation.</p>
<p>Je souhaiterais insister sur une particularité de ce type d’acteur qui sous-tend nombre des problématiques précédentes. <strong>La rémunération des grands du web est bien souvent indépendante de la quantité de données manipulées</strong> : rémunération par la publicité, facturation de l’utilisateur au forfait <a title="" href="#_ftnref5">[5]</a>. Cela nécessite d’avoir un coût unitaire par transaction très faible. En effet, dans un SI classique, une transaction peut facilement être rattachée à un flux physique (vente, stockage d’un produit). Ce flux permet d’avoir une facturation du SI proportionnelle au nombre de transactions (conceptuellement par une sorte de taxe). Mais sur un site de commerce marchand par exemple, chaque consultation du catalogue ou ajout dans le panier ne générera pas forcément du revenu car l’utilisateur peut quitter le site juste avant la validation du paiement.</p>
<p>En somme, les Systèmes d&#8217;Information des grands du web sont contraints d’assurer une scalabilité à coût marginal très faible pour répondre à leur business mode</p>
<h2><strong>Le sharding pour diminuer les coûts</strong></h2>
<p>Les bases de données restent encore majoritairement sur  un modèle centralisé : un serveur unique, éventuellement redondé en mode actif/passif pour la disponibilité.  La solution la plus courante pour supporter plus de transactions est la scalabilité verticale ou « scale up » : acheter une machine plus puissante (plus d’IO, de CPU, de RAM&#8230;)</p>
<p>Cependant cette approche présente des limitations : une seule machine très puissante ne peut pas suffire pour indexer le web.</p>
<p>Mais au-delà de cela, c’est souvent l’aspect coût et investissement qui conduit à rechercher une autre approche.</p>
<p>Une étude <a title="" href="#_ftnref6">[6]</a> menée par des ingénieurs de Google montre que dès que la charge dépasse la taille d’un grand système, le coût unitaire sur des grands systèmes est très supérieur au coût unitaire sur des machines de grande série <a title="" href="#_ftnref7">[7]</a>.</p>
<p>Même si l’équation pour comparer des coûts par transaction n’est pas simple à poser et peut être sujette à débat  &#8211; complexification de l’architecture, charge réseau à prendre en compte dans les coûts &#8211; les grands du web ont largement choisi d’utiliser des machines de grande série.</p>
<p><strong>Pour mettre en œuvre cette scalabilité horizontale, le sharding devient nécessaire.</strong></p>
<h2><strong>L’implémentation du sharding</strong></h2>
<p>Il existe de fait 2 façons de partitionner (« sharder ») la donnée : <em>verticalement</em> ou <em>horizontalement</em>.</p>
<p>Le partitionnement vertical est le plus communément utilisé : il s’agit d’isoler, de séparer des concepts métier. Par exemple, on décidera de stocker les clients sur une base et leur contrat sur une autre.</p>
<p>La notion de partitionnement horizontal renvoie à l’idée de répartir l’ensemble des enregistrements d’une table (au sens d’une base de données) sur plusieurs machines. Ainsi, on choisira par exemple de stocker les clients de A à M sur une machine #1 et les clients de N à Z sur une autre machine #2.  Le sharding horizontal nécessite une clé de répartition – la première lettre du nom dans l’exemple.</p>
<p><strong>C’est principalement le type de sharding horizontal qui est mis en œuvre chez les grands du web.</strong> Il présente notamment l’avantage de ne pas être limité par le nombre de concepts comme c’est le cas pour le sharding vertical.</p>
<p style="text-align: center;"><a href="http://blog.octo.com/wp-content/uploads/2012/04/figure-1.png"><img class="size-medium wp-image-31059" title="sharding" src="http://blog.octo.com/wp-content/uploads/2012/04/figure-1-300x113.png" alt="" width="300" height="113" /></a></p>
<p style="text-align: center;">Figure 1</p>
<h2><strong>Les techniques liées au sharding</strong></h2>
<p>Les grands du web ont, sur la base de ce choix de scalabilité horizontale, développé des solutions spécifiques (regroupées sous l’acronyme NoSQL) répondant à ces enjeux  et ayant les caractéristiques suivantes :</p>
<ul>
<li>une implémentation à partir de machines de grande série</li>
<li>une distribution (sharding) des données gérées au niveau du logiciel.</li>
</ul>
<p>Si le sharding permet de répondre aux problèmes évoqués plus haut, il nécessite aussi de mettre en œuvre de nouvelles techniques.</p>
<ul>
<li>La gestion de la <strong>disponibilité</strong>, devient plus complexe. Dans un système centralisé ou considéré comme tel, le système est disponible ou indisponible et on ne mesurera qu’un taux d’indisponibilité. Dans un système shardé, certains nœuds peuvent être disponibles et d’autres indisponibles. Si la chute d’un seul nœud rend tout le système indisponible, le taux d’indisponibilité est égal au produit de l’indisponibilité de chacun des nœuds. Ce taux va ainsi chuter très rapidement : 100 machines indisponibles chacune 1 jour par an donneront un système avec près de 3 mois d’indisponibilité <a title="" href="#_ftnref8">[8]</a>. Si le système distribué est capable de rester disponible malgré la chute d’un des nœuds mais avec un <em>service dégradé</em>, la disponibilité devra alors être mesurée par deux chiffres : le <em>yield</em> – le taux d’indisponibilité défini précédemment – et le <em>harvest</em> – la complétude de la réponse qui mesure en quelque sorte l’absence d’indisponibilité <a title="" href="#_ftnref9">[9]</a>.</li>
<li>La <strong>répartition de la charge</strong>  devra  être généralement adaptée à l’utilisation qui est faite des données. Ainsi un référentiel produit (massivement accédé en lecture) n’aura pas les mêmes enjeux de performance qu’un caddie virtuel (massivement accédé en écriture). Le taux de réplication par exemple ne sera pas le même dans ces deux cas.</li>
<li>Ensuite la <strong>gestion de l’ajout de nouveaux nœuds et des problèmes de répartition </strong>de la donnée (rééquilibrage du cluster) sont de nouveaux problèmes spécifiques au sharding. Foursquare, par exemple, a subi une indisponibilité de 11 heures en octobre 2010 <a title="" href="#_ftnref10">[10]</a> suite à une surcharge d’un des nœuds puis à des soucis lors de l’ajout du nœud de secours qui a finalement causé la chute complète du site.  Des algorithmes de répartition des données comme le <a href="http://en.wikipedia.org/wiki/Consistent_hashing">consistent hashing</a> <a title="" href="#_ftnref11">[11]</a>  limitent ainsi le coût de recopie des données lors de l’ajout ou le retrait d’un nœud pour répondre à ces problématiques.</li>
</ul>
<p>Le sharding nécessite également d’adapter les <strong>architectures applicatives</strong> :</p>
<ul>
<li><strong>les requêtes</strong> doivent être adaptées pour tenir compte de la distribution, notamment en évitant toute requête inter-shard car le coût d’accès à plusieurs nœuds distant est prohibitif. Les APIs de ces systèmes limitent ainsi les possibilités de jointure à des données situées sur le même shard.</li>
<li>Que l’on utilise des bases relationnelles ou des systèmes types NoSQL, la modélisation est mise à mal et on se limite majoritairement dans ces systèmes à une modélisation du niveau clé/valeur, clé/document ou en familles de colonnes pour lesquelles la clé ou l’index de ligne servent de clé de partitionnement.</li>
<li>L’atomicité (le A de ACID) est souvent limitée afin d’éviter des mises à jour atomiques incluant plusieurs shards et donc des transactions distribuées sur plusieurs machines coûteuses en performance.</li>
</ul>
<h2><strong>Chez qui ça fonctionne ?</strong></h2>
<p>La mise en œuvre de ces techniques diffère entre les acteurs. Certains ont simplement adapté leurs bases de données pour faciliter le sharding. D’autres ont écrit des solutions NoSQL qui leur sont propre. En suivant ce cheminement de SQL à NoSQL je vous propose de découvrir quelques implémentations représentatives :</p>
<h3><strong>Wikipédia</strong></h3>
<p>La célèbre encyclopédie collaborative est basée sur de nombreuses instances de MySQL réparties et un cache mémoire memcached. C’est ainsi un exemple de mise en œuvre du sharding avec des composants assez répandus.</p>
<p style="text-align: center;"><a href="http://blog.octo.com/wp-content/uploads/2012/04/figure-2.png"><img class="wp-image-31060 aligncenter" title="Wikipedia - sharding" src="http://blog.octo.com/wp-content/uploads/2012/04/figure-2-300x203.png" alt="Wikipedia - sharding" width="300" height="203" /></a></p>
<p style="text-align: center;">Figure 2</p>
<p>L’architecture utilise d’une part la réplication maître esclave pour séparer les charges de lecture et d’écriture et en partitionne d’autre part les données par Wiki et par cas d’utilisation. Le texte des articles est également déporté dans des instances dédiées. Ils utilisent ainsi des instances MySQL avec 200 à 300 GB de données.</p>
<h3><strong>Flickr</strong></h3>
<p>L’architecture de ce site de partage de photos est basée là aussi  sur une organisation de plusieurs instances MySQL (les shards) maîtres et esclaves mais cette fois autour d’un anneau de réplication pour faciliter l’ajout de noeuds.</p>
<p style="text-align: center;"><a href="http://blog.octo.com/wp-content/uploads/2012/05/figure-3.png"><img class="alignnone size-medium wp-image-31406" title="Flickr - sharding" src="http://blog.octo.com/wp-content/uploads/2012/05/figure-3-300x287.png" alt="Flickr - sharding" width="300" height="287" /></a></p>
<p style="text-align: center;">Figure 3</p>
<p>Un identifiant sert de clé de partitionnement (le plus souvent l’identifiant du propriétaire de la photo) qui répartit les données sur les différentes machines. En cas de chute d’un nœud, les écritures sont redirigées vers le nœud suivant sur l’anneau. Chaque instance sur l’anneau est également répliquée sur deux nœuds esclaves qui servent en lecture seule en cas de chute du nœud master associé.</p>
<h3><strong>Facebook</strong></h3>
<p>L’architecture de Facebook présente l’intérêt de montrer l’évolution d’une base relationnelle vers un modèle complètement distribué.</p>
<p>Facebook a ainsi débuté en se basant sur MySQL, solution Open Source très efficace. Ils ont ensuite mis en œuvre un ensemble d’extensions permettant de partitionner les données.</p>
<p style="text-align: center;"><a href="http://blog.octo.com/wp-content/uploads/2012/05/figure-4.png"><img class="alignnone size-medium wp-image-31407" title="Facebook - sharding" src="http://blog.octo.com/wp-content/uploads/2012/05/figure-4-300x229.png" alt="Facebook - sharding" width="300" height="229" /></a></p>
<p style="text-align: center;">Figure 4</p>
<p>Désormais tout stockage de données de façon centralisée est banni dans l’architecture Facebook. Un accès centralisé est assuré par du cache (Memcached) ou un service spécialisé. L’architecture retenue continue d’utiliser MySQL mais uniquement comme système de stockage. Le système de réplication de MySQL est également utilisé après extension pour répliquer les instances entre plusieurs datacenters. Cependant son utilisation est très éloignée d’une base de données relationnelle. Les données sont accédées uniquement sous forme clé/valeur.  Plus aucune jointure n’est réalisée à ce niveau. Enfin la structure des données est prise en compte pour colocaliser les données utilisées simultanément.</p>
<h3><strong>Amazon</strong></h3>
<p>L’architecture Amazon se distingue par une gestion plus avancée de la perte d’un ou plusieurs nœuds sur Dynamo.</p>
<p>Amazon a débuté dans les années 1990 avec un seul serveur web et une base de données Oracle. Ils ont ensuite mis en place un ensemble de services métiers en 2001 avec des stockages indépendants. A côté des bases de données, deux systèmes utilisent le sharding : S3 et Dynamo.  S3 est un stockage de BLOB sur Internet identifié par une URL. Dynamo (utilisé en interne puis très récemment proposé sur Amazon Web Services) est un système de stockage clé/valeur distribué, réparti,  destiné à assurer une très haute disponibilité et des temps de réponse très faibles.</p>
<p>Afin de privilégier la disponibilité sur Dynamo, plusieurs versions d’une même donnée peuvent coexister : on parle de cohérence « à terme » (eventual consistency) <a title="" href="#_ftnref12">[12]</a>.</p>
<p style="text-align: center;"><a href="http://blog.octo.com/wp-content/uploads/2012/05/figure-5.png"><img class="alignnone size-medium wp-image-31408" title="Amazon - sharding" src="http://blog.octo.com/wp-content/uploads/2012/05/figure-5-300x132.png" alt="Amazon - sharding" width="300" height="132" /></a></p>
<p style="text-align: center;">Figure 5</p>
<p>A la lecture, un algorithme comme le <em>vector clock</em> ou en dernier recours l’application cliente devront résoudre le conflit. Le curseur peut être également ajusté entre la réplication pour tolérer la perte d’un nœud et les performances du système.</p>
<h3><strong>LinkedIn</strong></h3>
<p>Le cheminement de LinkedIn présente des similitudes avec Amazon : sortie d’une approche monobase en 2003, un découpage en service et la mise en place d’un système distribué avec des concepts similaires à Dynamo : Voldemort. Contrairement à Dynamo, il est open source. A noter : les index et graphes sociaux ont toujours été stockés de façon séparée chez LinkedIn.</p>
<h3><strong>Google</strong></h3>
<p>Google a, le premier, publié des informations sur son système de stockage distribué. Celui-ci tire ses gênes non pas des bases de données mais des systèmes de fichiers.</p>
<p style="text-align: left;">Google évoque dans sa publication <a title="" href="#_ftnref13">[13]</a> sur le Google File System (GFS) les faiblesses précédemment observées et le choix structurant du commodity hardware. Ce système de fichier distribué sert directement, ou indirectement, aux stockages des données chez Google (index, mail).</p>
<p style="text-align: center;"><a href="http://blog.octo.com/wp-content/uploads/2012/05/figure-6.png"><img class="alignnone size-medium wp-image-31409" title="Google - sharding" src="http://blog.octo.com/wp-content/uploads/2012/05/figure-6-300x81.png" alt="Google - sharding" width="300" height="81" /></a></p>
<p style="text-align: center;">Figure 6</p>
<p>Son architecture repose sur un serveur de métadonnées centralisé (pour orienter l’application cliente) et un très grand nombre de serveurs de stockage. Le degré de consistance des données est inférieur à ce que peut garantir un système de fichiers classique, mais ce point à lui tout seul pourrait faire l’objet d’un article. Google utilise en production des clusters de plusieurs centaines de machines lui permettant ainsi de stocker des petabytes de données à indexer.</p>
<h2><strong>Exceptions</strong></h2>
<p>Il est cependant indéniable qu’un nombre important de sites restent sur des technologies de base de données relationnelle sans sharding (ou sans communiquer sur le sujet) : Stack Overflow, SalesForce, Voyages-SNCF, Vente privées… La liste est difficilement exhaustive dans un cas comme dans l’autre. Pourtant nous pensons que le sharding est désormais une stratégie classique sur les sites web à grand trafic. En effet, l’architecture de SalesForce est certes basée sur une base de données Oracle, mais elle utilise la base de données de façon très différente des pratiques qui ont cours dans nos SI : tables avec une multitude de colonnes non typées et nommées de façon générique (col1, col2), moteur d’exécution des requêtes en amont de celui d’Oracle pour prendre en compte ces spécificités… Les optimisations montrent les limites d’une pure architecture relationnelle. L’exception la plus marquante vient selon nous de chez StackOverflow, dont l’architecture repose sur une unique base relationnelle SQL Serveur. Ce site a entièrement fait le choix d’une architecture basée sur la scalabilité verticale, leur architecture initialement inspirée de Wikipédia ayant évolué pour mieux se conformer à cette stratégie. Face à cela, il faut noter que le besoin en scalabilité de StackOverflow n’est pas forcément comparable à celui d’autres sites car la communauté ciblée (celle des experts en informatique) est assez limitée, et le modèle favorise la qualité des contributions à leur quantité. Par ailleurs, le choix d’une plateforme sous licence Microsoft, leur offre un outil efficace mais pour lequel les coûts de licences deviendraient probablement prohibitifs en cas de scalabilité horizontale.</p>
<h2><strong>Et dans mon entreprise ?</strong></h2>
<p>La distribution des données est l’une des clés qui a permis aux grands du web d’atteindre leur taille actuelle et de fournir des services qu’aucune autre architecture ne pourrait supporter. Mais qu’on ne s’y trompe pas, ce n’est pas un exercice facile : des problématiques toutes simples dans le monde relationnel (jointures, consistance de la donnée) demandent la maîtrise de nouveaux outils ou de nouvelles méthodes.</p>
<p>Les domaines avec de forts enjeux de volumétrie mais des enjeux de consistance limités – cas des données partitionnables notamment – sont ceux pour lesquels la distribution des données aura le plus de bénéfice. Des offres autour de<a href="http://hadoop.apache.org/"> Hadoop</a> utilisent ses principes et sont pertinentes dans la BI et plus particulièrement dans l’analyse de données non structurées. Côté transactionnel, les problématiques de consistance sont plus importantes.  Les contraintes sur les API d’accès sont aussi limitantes mais de nouvelles offres comme <a href="http://www.vmware.com/fr/products/application-platform/vfabric-sqlfire/overview.html">SQLFire</a> de VMWare ou <a href="http://www.nuodb.com/">NuoDB</a> tentent de mixer sharding et interface SQL. A suivre donc.</p>
<p>En somme, il faut se demander quelles sont les données utilisées dans un même use case (quelle partition est possible ?) et quelles seraient pour chaque donnée les conséquences d’une perte de consistance ? En fonction de ces réponses, vous pourrez identifier vos grands enjeux d’architecture qui vous permettront de choisir, au-delà de la seule problématique de sharding, l’outil qui répondra le mieux à vos besoins. Plus qu’une solution magique, le partitionnement des données doit être abordé comme un outil permettant de franchir des frontières de scalabilité inaccessibles sans son utilisation.</p>
<h2><strong>Pattern connexes</strong></h2>
<p>L’utilisation de produits Open Source ou maison, maîtrisés en interne, est inextricablement liée à l’utilisation du partitionnement des données du fait du tuning très fin requis.  Le modèle transactionnel ACID est également remis en question par le partitionnement des données.  Le pattern Eventually Consistent (consistance finale) propose une autre vision et une autre façon de répondre au besoin des utilisateurs tout en tolérant cette remise en question. Là encore, une maîtrise de ce pattern est très utile pour mettre en œuvre la distribution des données. Enfin et surtout, le sharding est indissociable du choix du commodity hardware fait par les grands du web.</p>
<h2><strong>Sources</strong></h2>
<ul>
<li><a href="http://blog.octo.com/datacenter-as-a-computer-une-plongee-dans-les-datacenters-des-acteurs-du-cloud/">http://blog.octo.com/datacenter-as-a-computer-une-plongee-dans-les-datacenters-des-acteurs-du-cloud/</a></li>
<li><a href="http://www.worldwidewebsize.com/">http://www.worldwidewebsize.com/</a></li>
<li><a href="http://www.tpc.org/results/individual_results/Oracle/Oracle_SPARC_SuperCluster_with_T3-4s_TPC-C_ES_120210.pdf">http://www.tpc.org/results/individual_results/Oracle/Oracle_SPARC_SuperCluster_with_T3-4s_TPC-C_ES_120210.pdf</a></li>
<li><a href="http://static.googleusercontent.com/external_content/untrusted_dlcp/labs.google.com/fr/papers/gfs-sosp2003.pdf">http://static.googleusercontent.com/external_content/untrusted_dlcp/labs.google.com/fr//papers/gfs-sosp2003.pdf</a></li>
<li><a href="http://www.paragon-cs.com/wordpress/?p=144">http://www.paragon-cs.com/wordpress/?p=144</a></li>
</ul>
<p><strong>Définition</strong></p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Shard_(database_architecture)">http://en.wikipedia.org/wiki/Shard_(database_architecture)</a></li>
<li><a href="http://en.wikipedia.org/wiki/Partition_%28database%29">http://en.wikipedia.org/wiki/Partition_%28database%29</a></li>
</ul>
<p><strong>Wikipedia</strong></p>
<ul>
<li><a href="http://www.codefutures.com/weblog/database-sharding/2008/06/wikipedias-scalability-architecture.html">http://www.codefutures.com/weblog/database-sharding/2008/06/wikipedias-scalability-architecture.html</a></li>
</ul>
<p><strong>eBay</strong></p>
<ul>
<li><a href="http://www.codefutures.com/weblog/database-sharding/2008/05/database-sharding-at-ebay.html">http://www.codefutures.com/weblog/database-sharding/2008/05/database-sharding-at-ebay.html</a></li>
</ul>
<p><strong>Friendster and Flickr</strong></p>
<ul>
<li><a href="http://www.codefutures.com/weblog/database-sharding/2007/09/database-sharding-at-friendster-and.html">http://www.codefutures.com/weblog/database-sharding/2007/09/database-sharding-at-friendster-and.html</a></li>
</ul>
<p><strong>HighScalability</strong></p>
<ul>
<li><a href="http://highscalability.com/">http://highscalability.com/</a></li>
</ul>
<p><strong>Amazon</strong></p>
<ul>
<li><a href="http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf">http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf</a></li>
</ul>
<p>&nbsp;</p>
<hr align="left" size="1" width="33%" />
<div>
<div>
<p style="text-align: left;"><a title="" name="_ftnref1"></a>[1] Wikipédia décrit ce mot comme une méthode de partitionnement horizontale d’une base de données ou d’un moteur de recherche (<a href="http://en.wikipedia.org/wiki/Sharding">http://en.wikipedia.org/wiki/Sharding</a>)</p>
</div>
<div style="text-align: left;">
<p><a title="" name="_ftnref2"></a>[2] Enjeux que l’ouverture de nos SI sur Internet tire également insidieusement (analyse du comportement des utilisateurs, liens avec les réseaux sociaux…)</p>
</div>
<div style="text-align: left;">
<p><a title="" name="_ftnref3"></a>[3] La notion de scalabilité est certes liée à la capacité d’un système à absorber une charge plus importante mais ce qui est important dans la scalabilité est la dimension coût. Formulé autrement, un système est scalable s’il est capable d’absorber la requête supplémentaire (avec un temps de réponse identique) et si cette requête supplémentaire coûte le même prix que les précédentes (autrement dit que les coûts d’infrastructure sous-jacent ne font pas exploser la facture)</p>
</div>
<div style="text-align: left;">
<p><a title="" name="_ftnref4"></a>[4] Au-delà de la scalabilité, la notion d’élasticité est liée à la capacité à n’avoir que des coûts variables sans lien avec la charge. Autrement dit, un système est élastique si quelque soit le trafic (10 requêtes par seconde ou 1 000 requêtes par seconde), le coût unitaire par requête est identique.</p>
</div>
<div style="text-align: left;">
<p><a title="" name="_ftnref5"></a>[5] Par exemple l’absence de taille maximale sur les boîtes mail</p>
</div>
<div style="text-align: left;">
<p><a title="" name="_ftnref6"></a>[6] Cette étude <a href="http://www.morganclaypool.com/doi/pdf/10.2200/S00193ED1V01Y200905CAC006">http://www.morganclaypool.com/doi/pdf/10.2200/S00193ED1V01Y200905CAC006</a> est également résumée dans cet article de blog d’Olivier Malassi <a href="http://blog.octo.com/datacenter-as-a-computer-une-plongee-dans-les-datacenters-des-acteurs-du-cloud/">http://blog.octo.com/datacenter-as-a-computer-une-plongee-dans-les-datacenters-des-acteurs-du-cloud/</a></p>
</div>
<div style="text-align: left;">
<p><a title="" name="_ftnref7"></a>[7] C’est ainsi que nous traduirons « commodity hardware » car il ne s’agit pas forcément de machines d’entrée de gamme mais de machines dont le rapport performance/prix est le plus élevé dans le système en question</p>
</div>
<div style="text-align: left;">
<p><a title="" name="_ftnref8"></a>[8] (364/365)<sup>100</sup>=76%=277/365 soit 88 jours</p>
</div>
<div style="text-align: left;">
<p><a title="" name="_ftnref9"></a>[9] Ainsi, si lorsqu’un nœud tombe, les autres nœuds ignorent les modifications faites sur ce nœud puis réconcilient les différentes modifications lorsque ce nœud est reconnecté au cluster, on a diminué le <em>harvest</em> – la réponse n’est pas complète car elle n’intègre pas les dernières modifications – mais préserve le <em>yield</em>. Les solutions NoSQL développées par ces acteurs intègrent différents mécanismes pour gérer cela : réplication des données sur plusieurs nœuds, algorithme <em>vector clock</em>[9] pour réconcilier des mises à jour concurrentes lorsqu’un nœud est reconnecté au cluster. Plus de détail dans cet article <a href="http://radlab.cs.berkeley.edu/people/fox/static/pubs/pdf/c18.pdf">http://radlab.cs.berkeley.edu/people/fox/static/pubs/pdf/c18.pdf</a></p>
</div>
<div style="text-align: left;">
<p><a title="" name="_ftnref10"></a>[10] Plus de détails sur cet incident de la part de FourSquare <a href="http://blog.foursquare.com/2010/10/05/so-that-was-a-bummer/">http://blog.foursquare.com/2010/10/05/so-that-was-a-bummer/</a> et l’analyse d’un autre blog <a href="http://highscalability.com/blog/2010/10/15/troubles-with-sharding-what-can-we-learn-from-the-foursquare.html">http://highscalability.com/blog/2010/10/15/troubles-with-sharding-what-can-we-learn-from-the-foursquare.html</a></p>
</div>
<div style="text-align: left;">
<p><a title="" name="_ftnref11"></a>[11] Plus de détail dans cet article <a href="http://blog.octo.com/consistent-hashing-ou-l%E2%80%99art-de-distribuer-les-donnees/">http://blog.octo.com/consistent-hashing-ou-l%E2%80%99art-de-distribuer-les-donnees/</a></p>
</div>
<div style="text-align: left;">
<p><a title="" name="_ftnref12"></a>[12] Il existe des mécanismes de Quorum (<a href="http://en.wikipedia.org/wiki/Quorum_(distributed_computing)">http://en.wikipedia.org/wiki/Quorum_(distributed_computing)</a> pour trouver des compromis entre  cohérence, tolérance à la panne, disponibilité&#8230;</p>
</div>
<div>
<p style="text-align: left;"><a title="" name="_ftnref13"></a>[13] <a href="http://static.googleusercontent.com/external_content/untrusted_dlcp/labs.google.com/fr/papers/gfs-sosp2003.pdf">http://static.googleusercontent.com/external_content/untrusted_dlcp/labs.google.com/fr//papers/gfs-sosp2003.pdf</a></p>
</div>
</div>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=30844" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/fluidite-de-lexperience-lutilisateur/' rel='bookmark' title='Les patterns des grands du Web &#8211; Fluidité de l’expérience l’utilisateur'>Les patterns des grands du Web &#8211; Fluidité de l’expérience l’utilisateur</a></li>
<li><a href='http://blog.octo.com/les-patterns-des-grands-du-web-openapi-ou-ecosysteme-ouvert/' rel='bookmark' title='Les Patterns des Grands du Web : « OpenAPI » ou écosystème ouvert'>Les Patterns des Grands du Web : « OpenAPI » ou écosystème ouvert</a></li>
<li><a href='http://blog.octo.com/test-ab/' rel='bookmark' title='Les Patterns des Grands du Web – Test A/B'>Les Patterns des Grands du Web – Test A/B</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/sharding/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Performance côté client avec Rails &amp; Heroku</title>
		<link>http://blog.octo.com/performance-cote-client-avec-rails-heroku/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=performance-cote-client-avec-rails-heroku</link>
		<comments>http://blog.octo.com/performance-cote-client-avec-rails-heroku/#comments</comments>
		<pubDate>Fri, 04 May 2012 09:11:19 +0000</pubDate>
		<dc:creator>Rémy-Christophe Schermesser</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[coffeescript]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[scss]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=31378</guid>
		<description><![CDATA[À ChooseYourBoss on développe une appli web tout ce qu’il y a de plus classique : HTML5, JS, CSS3 + quelques API (Linkedn, Viadeo, Google Maps, Google Analytics, etc). Côté serveur on est en Rails sur Heroku. Bref, rien d&#8217;exceptionnel quoi. Puis un jour, on a jeté un œil sur le graphe de temps de chargement de notre [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/platform-as-a-service-avec-ruby-on-rails/' rel='bookmark' title='Platform as a Service avec Ruby on Rails'>Platform as a Service avec Ruby on Rails</a></li>
<li><a href='http://blog.octo.com/rails-tests/' rel='bookmark' title='Rails += Tests'>Rails += Tests</a></li>
<li><a href='http://blog.octo.com/presentation-rails-au-paris-jug/' rel='bookmark' title='Présentation Rails au Paris JUG'>Présentation Rails au Paris JUG</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p>À <a href="http://chooseyourboss.com">ChooseYourBoss</a> on développe une appli web tout ce qu’il y a de plus classique : HTML5, JS, CSS3 + quelques API (Linkedn, Viadeo, Google Maps, Google Analytics, etc). Côté serveur on est en Rails sur Heroku. Bref, rien d&#8217;exceptionnel quoi.</p>
<p>Puis un jour, on a jeté un œil sur le graphe de temps de chargement de notre appli &#8211; merci Google Analytics. Et là le drame : une moyenne de plus de <strong>5 secondes</strong> pour la page d&#8217;accueil, et je ne vous parle pas sur mobile. On se dépêche alors d&#8217;aller faire un petit tour sur <a href="mailto:https://developers.google.com/speed/pagespeed/">Google Pagespeed</a>, notre score : 44/100 (bof bof).</p>
<p>On décide d’investiguer point par point nos hypothèses, en voici un résumé.<br />
<span id="more-31378"></span></p>
<h2>Les faux problèmes – a.k.a. de la pub pour Rails</h2>
<h3>1 JavaScript pour tous les gouverner. Ça marche aussi avec le CSS!</h3>
<p>On est en Rails 3.2, on a donc <a href="http://coderberry.me/blog/2012/04/24/asset-pipeline-for-dummies/">l&#8217;asset pipeline</a> qui nous compresse nos JS et CSS en un seul fichier, merci Rails.</p>
<h3>Tu rendras ton JS &amp; tes CSS minimal (&amp; illisible)</h3>
<p>De même, l&#8217;asset pipeline est notre ami, il minifie les JS et CSS tout seul. Ça enlève tous les caractères inutiles, sans changer le fonctionnel, pour réduire les temps de transfert. Accessoirement ça sert aussi d’offuscation sur notre code. Encore merci Rails.</p>
<h2>Et les vrais problèmes ?</h2>
<h3>Tu utiliseras le cache du navigateur</h3>
<p>Là pas merci Heroku. Avant, il y avait <a href="https://www.varnish-cache.org/">varnish</a> qui était devant vos serveurs et il faisait la magie tout seul. Sur la nouvelle stack Heroku (<a href="https://devcenter.heroku.com/articles/cedar">Cedar</a>), varnish a disparu. Il faut donc le faire à la main. Ici on a plusieurs solutions :</p>
<ul>
<li>Mettre les assets sur un <a href="http://fr.wikipedia.org/wiki/Content_Delivery_Network">CDN</a></li>
<li>Utiliser un autre système de cache</li>
</ul>
<p>On a préféré la deuxième solution, en mettant en cache nos assets dans un <a href="http://memcached.org/">memcache</a>. Ce n’est pas compliqué à faire, il y a un <a href="https://devcenter.heroku.com/articles/rack-cache-memcached-static-assets-rails31">tutoriel</a>. On peut se permettre de mettre une durée de cache très grande, car à chaque déploiement Rails regénère les assets avec un nom différent. Et donc le navigateur ne gardera en cache que les derniers assets.</p>
<p>On a choisi cette solution pour une seule raison. On n’a pas de compte AWS, pas forcément les moyens d’en avoir un rapidement (process d’achat). On a donc opté pour la solution la plus rapide à mettre en place.</p>
<h3>Tu compresseras tes JS/CSS</h3>
<p>Là c&#8217;est facile, il suffit de rajouter un <a href="http://railscasts.com/episodes/149-rails-engines">engine à rails</a> qui va gziper les requêtes sortantes si le client cible supporte le gzip. On rajoute donc juste Rack::Deflater dans le fichier config.ru :</p>
<pre class="brush:ruby"> # This file is used by Rack-based servers to start the application.
require ::File.expand_path('../config/environment',  __FILE__)
use Rack::Deflater # Required for Heroku CEDAR stack
run ChooseYourBoss::Application</pre>
<h3>Des <em>sprites</em> tu créeras</h3>
<p>Dans le but de minimiser le nombre de requêtes entre le client et le serveur, on a voulu mettre en <em>sprites</em> nos images. Les sprites à la main c’est c&#8217;est long, ennuyeux, sujets à erreur, et à recommencer dès que l&#8217;on rajoute une image. Heureusement pour nous, la gem <a href="http://compass-style.org/">compass</a> permet de faire des sprites automatiquement. En plus, c&#8217;est cool, on fait du <a href="http://sass-lang.com/">SASS</a> et compass est en SASS.</p>
<p>Son utilisation est assez simple :</p>
<ul>
<li>Rajouter compas comme dépendance, ainsi que <a href="https://github.com/wvanbergen/oily_png">oily_png</a> pour la génération du sprinte en png</li>
<li>Mettre toutes les images à spriter dans un répertoire : sprites/ pour nous</li>
<li>Dans un fichier SASS :</li>
<ul>
<li>Indiquer que l&#8217;on veut qu&#8217;il optimise l&#8217;agencement des images dans notre sprite : $sprites-layout: smart;</li>
<li>Inclure toute les images de notre répertoire : @import &laquo;&nbsp;sprites/*.png&nbsp;&raquo;;</li>
<li>Générer le css / sprite : @include all-sprites-sprites;</li>
</ul>
</ul>
<p>Tout ceci va générer une classe CSS par image, avec ce qu&#8217;il faut dedans. Ex : Mon image <em>sprites/toto.png</em> va générer la classe <em>.sprites-toto</em>.</p>
<p>Pour plus de détails, la <a href="http://compass-style.org/help/tutorials/spriting/">doc</a> peut vous éclairer.</p>
<h3>Du chargement JS en bas de page tu feras</h3>
<p>Un grand classique, on a mis nos JS tout à la fin de notre page HTML, ce qui permet de ne les charger qu&#8217;après le chargement de l’HTML et du CSS.</p>
<h3>Du chargement JS asynchrone tu ferras</h3>
<p>C&#8217;est bien le JS en bas de page, mais à cause nos boutons <em>like</em> Facebook et <em>follow</em> Twitter, on chargeait respectivement 200ko et 100ko de JS en plus dans notre page, ce qui bloquait son chargement. On a donc passé le chargement de ces 2 boutons en asynchrone. Attention, nos exemples sont en <a href="http://coffeescript.org/">CoffeeScript</a>.</p>
<p><strong>Pour Facebook :</strong></p>
<pre class="brush:javascript">id = 'facebook-jssdk'
ref = document.getElementsByTagName('script')[0]
return if document.getElementById(id)
js = document.createElement('script')
js.id = id
js.async = true
js.src = "//connect.facebook.net/en_US/all.js#xfbml=1"
ref.parentNode.insertBefore(js, ref)</pre>
<p><strong>Même chose pour Twitter</strong></p>
<pre class="brush:javascript">id = 'twitter-jssdk'
ref = document.getElementsByTagName('script')[0]
return if document.getElementById(id)
js = document.createElement('script')
js.id = id
js.async = true
js.src = "//platform.twitter.com/widgets.js"
ref.parentNode.insertBefore(js, ref)</pre>
<p>De même, on a rajouté l&#8217;attribut <em>async</em> sur nos balises script. Ce qui permet de charger les assets en asynchrone, merci HTML5 :</p>
<pre class="brush:ruby">= javascript_include_tag "application", async: true</pre>
<h3>Du chargement JS asynchrone tu referas</h3>
<p>On avait fait de belles optimisations, sauf que notre site était cassé 1 requête sur 2. En effet, notre JS dépend de l&#8217;API de Google Maps. Et une fois sur deux l&#8217;API était chargée après notre js, donc on obtenait des erreurs.<br />
Il a fallut donc trouver une autre solution pour le chargement en asynchrone. Et la, on a utilisé une petite lib nommée <a href="http://headjs.com/">head.js</a>, qui permet de faire du chargement asynchrone d&#8217;assets, mais de garantir leur ordre d&#8217;exécution.</p>
<p>On a donc en rails :</p>
<pre class="brush:ruby">= javascript_include_tag "loader", async: true</pre>
<p>loader correspond à un fichier JS qui inclus head.js en premier, puis notre fichier de chargement de JS spécifique, attention c&#8217;est du CoffeeScript avec de l&#8217;ERB (un language de template pour Ruby) :</p>
<pre class="brush:ruby">@CYB = @CYB || {} #On déclare notre namespace global JS.

&lt;% if Rails.env.production? %&gt;
#Le JS de notre application
application_path = '&lt;%= javascript_path "application" %&gt;'

#Chemins vers nos différentes lib JS
gmaps_path = '&lt;%= "https://maps.googleapis.com/maps/api/js?key=#{GMAPS_BROWSER}&amp;sensor=false" %&gt;'
viadeo_path = 'http://cdn.viadeo.com/javascript/sdk.js'
linkedin_path = 'http://platform.linkedin.com/in.js?async=true'

#Le chargement par head.js
head.js gmaps_path, viadeo_path, linkedin_path, application_path
&lt;% end %&gt;</pre>
<p>Le seul problème c’est que tout ça, ne marche qu&#8217;en mode production, il faut donc rajouter le bout de code suivant pour avoir tous vos JS en mode dev. Re attention, c&#8217;est du <a href="http://haml-lang.com/">HAML</a> :</p>
<pre class="brush:ruby">- options = {}
- options = {async: true} if Rails.env.production?
= javascript_include_tag "loader", options

- #We need this, because head.js can not generate all the JS assets in dev &amp; test
- unless Rails.env.production?
  = javascript_include_tag "https://maps.googleapis.com/maps/api/js?key=#{GMAPS_BROWSER}&amp;sensor=false"
  = javascript_include_tag 'http://cdn.viadeo.com/javascript/sdk.js'
  = javascript_include_tag 'http://platform.linkedin.com/in.js?async=true'
  = javascript_include_tag "application"</pre>
<p>Oui, il y a de la duplication, mais c’est facile à corriger. A savoir que ce mécanisme de chargement asynchrone peut être aussi mis en jeu si vous utilisez d’autres médias (ex : une pub, une vidéo, etc.)</p>
<h3>Des images tu supprimeras</h3>
<p>On avait pas mal d&#8217;images sur notre site, et les images (même en sprite) c&#8217;est gros. Donc on a tenté au maximum de les remplacer par du CSS. On a abusé des pseudos élément ::before et ::after qui permettent de rajouter des éléments html mais que visible dans le css. Ce qui permet, par exemple de créée des puces pour une liste à partir d&#8217;un dessin fait en css, ou d&#8217;un texte spécifique. Ce qui nous permet de transformer 2ko d&#8217;image en quelques lignes de SASS.</p>
<p>Ex :</p>
<pre class="brush:css">#mon_id {
  ul {
    list-style: none;
  }
  li::before {
    content: "\02713";
    margin-right: 10px;
    font-size: 1.3em;
  }
}</pre>
<h3>Des webfonts tu chargeras en asynchrone (ou pas)</h3>
<p>Comme on a un site bleeding edge (web 3.5, HTML10.3 et CSS14.2 au minimum), on utilise des webfonts pour avoir des polices plus sympas. C&#8217;est bien beau tout ça, mais c&#8217;est long à télécharger. On avait déjà décidé de n&#8217;utiliser que des polices venant de Google webfonts, ce qui nous permettait de profiter des CDN de Google. On a donc suivi la <span style="text-decoration: underline;">procédure</span> sur leur site pour rendre le chargement asynchrone.</p>
<p>Mais, en fait ça donnait un rendu étrange à notre page. En effet, la page était affichée avec certaines polices, et d&#8217;un coup elles changeaient toutes pour les webfonts.</p>
<p>On a donc décidé de remettre leur chargement en synchrone.</p>
<h3>Conclusion</h3>
<p>Toutes ses optimisations nous ont pris entre 2-3 jh et nous ont permis de passer notre score Google pagespeed de 44/100 à 94/100, y compris sur mobile.</p>
<p><a href="mailto:https://developers.google.com/speed/pagespeed/insights%23url=http_3A_2F_2Fchooseyourboss.com_2F%26mobile=false">Pagespeed</a> nous donne encore quelques points d’amélioration, mais ceux-ci sont majoritairement indépendants de nous. Par exemple, le JS de twitter n’est mis en cache que 30 minutes.</p>
<p>Notre prochaine étape est donc indéterminée. Par contre, nous avons un indicateur de qualité produit que nous ne négligerons plus.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=31378" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/platform-as-a-service-avec-ruby-on-rails/' rel='bookmark' title='Platform as a Service avec Ruby on Rails'>Platform as a Service avec Ruby on Rails</a></li>
<li><a href='http://blog.octo.com/rails-tests/' rel='bookmark' title='Rails += Tests'>Rails += Tests</a></li>
<li><a href='http://blog.octo.com/presentation-rails-au-paris-jug/' rel='bookmark' title='Présentation Rails au Paris JUG'>Présentation Rails au Paris JUG</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/performance-cote-client-avec-rails-heroku/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>HTTP Caching avec Nginx / Memcached</title>
		<link>http://blog.octo.com/http-caching-avec-nginx-memcached/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=http-caching-avec-nginx-memcached</link>
		<comments>http://blog.octo.com/http-caching-avec-nginx-memcached/#comments</comments>
		<pubDate>Fri, 04 May 2012 07:26:51 +0000</pubDate>
		<dc:creator>Bertrand Paquet</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[Infrastructure et opérations]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=30858</guid>
		<description><![CDATA[La mise en place d&#8217;un cache HTTP devant des serveurs web est un bon moyen d&#8217;en améliorer les performances. Ce billet a deux objectifs : Présenter les bases du caching HTTP Présenter les nouvelles fonctionnalités que j&#8217;ai implémentées dans le module Nginx Memcached pour faciliter le caching HTTP sur les serveurs Un cache c&#8217;est quoi [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/memcached-une-alternative-aux-caches-classiques/' rel='bookmark' title='Memcached : une alternative aux caches classiques'>Memcached : une alternative aux caches classiques</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p>La mise en place d&#8217;un cache HTTP devant des serveurs web est un bon moyen d&#8217;en améliorer les performances. Ce billet a deux objectifs :</p>
<ul>
<li>Présenter les bases du caching HTTP</li>
<li>Présenter les nouvelles fonctionnalités que j&#8217;ai implémentées dans le module Nginx Memcached pour faciliter le caching HTTP sur les serveurs</li>
</ul>
<p><span id="more-30858"></span></p>
<h3>Un cache c&#8217;est quoi ?</h3>
<p>Les caches sont utilisés pour améliorer les performances d&#8217;accès à une ressource. Cette amélioration peut se faire de 2 manière.</p>
<p>La première est de réduire le temps d&#8217;accès à la ressource en copiant la ressource au plus prês de son utilisateur. Quelques exemples : le cache L2 d&#8217;un processeur, le cache de base de données, le cache de navigateur web, un <a href="http://fr.wikipedia.org/wiki/Content_Delivery_Network">CDN</a>.</p>
<p>La deuxième est d&#8217;accélérer la construction de la ressource en réduisant son nombre d&#8217;accès : par exemple, on va mettre en cache la page d&#8217;accueil d&#8217;un blog, pour qu&#8217;elle ne soit pas reconstruite à toutes les requêtes, mais seulement toutes les 30 secondes. C&#8217;est ce principe que nous allons maintenant étudier : un cache HTTP.</p>
<h3>Le cache HTTP</h3>
<h4>Architecture</h4>
<p>Le cache HTTP se place généralement devant votre serveur web. Cela donne une architecture qui ressemble à ça :<br />
<a href="http://blog.octo.com/wp-content/uploads/2012/04/Capture-d’écran-2012-04-23-à-10.38.04.png"><img src="http://blog.octo.com/wp-content/uploads/2012/04/Capture-d’écran-2012-04-23-à-10.38.04.png" alt="" title="Architecture Cache HTTP" width="429" height="229" class="aligncenter size-full wp-image-30860" /></a><br />
Le principe est le suivant : pour une URL donnée, le cache HTTP va demander la page au serveur web à la première requête d&#8217;un client, puis va stocker cette page et la servir pour les requêtes suivantes. Comme on l&#8217;a expliqué ci dessus, cela permet d&#8217;alléger la charge sur le serveur web, et d&#8217;accélérer le site, puisque la page n&#8217;est plus calculée dynamiquement, mais juste sortie du cache.</p>
<p>Il y a de nombreuses implémentations de cache HTTP. Les plus connues sont</p>
<ul>
<li><a href="https://www.varnish-cache.org/">Varnish</a></li>
<li><a href="http://www.squid-cache.org/">Squid</a></li>
<li><a href="http://wiki.nginx.org/HttpProxyModule">Nginx</a> avec cache sur disque</li>
<li><a href="http://httpd.apache.org/docs/2.2/fr/caching.html">Apache2</a> avec cache sur disque</li>
</ul>
<h4>Comment cela marche ?</h4>
<p>C&#8217;est assez simple : le cache HTTP va réutiliser les headers de cache HTTP prévus pour le cache du navigateur du client. Par exemple, si votre serveur web renvoie pour une URL donnée un header HTTP : <code>Expires: Thu, 31 Dec 2037 23:55:55 GMT</code>, cela indique que cette ressource ne sera pas modifiée avant le 31 décembre 2037. Et cela permet donc à tous les utilisateurs de cette ressource de la récupérer une seule fois et de la stocker jusqu&#8217;à sa date d&#8217;expiration. C&#8217;est exactement ce que va faire le cache HTTP.</p>
<p>En plus de <code>Expires</code>, il existe d&#8217;autres headers HTTP impliqués dans les mécanismes de cache, notamment <code>Cache-Control</code> et <code>Vary</code>. Je vous invite à consulter la <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html">RFC 2616</a> pour plus de détails. Et hélas, c&#8217;est un domaine assez compliqué : les différents navigateurs / reverse proxy / cache HTTP ne gèrent pas ces headers de la même manière.</p>
<p>L&#8217;architecture simplifiée d&#8217;un cache HTTP est donc la suivante :<br />
<a href="http://blog.octo.com/wp-content/uploads/2012/04/Capture-d’écran-2012-04-26-à-21.29.13.png"><img src="http://blog.octo.com/wp-content/uploads/2012/04/Capture-d’écran-2012-04-26-à-21.29.13.png" alt="" title="Architecture simplifiée cache HTTP" width="478" height="324" class="aligncenter size-full wp-image-31086" /></a></p>
<p>Un point important à noter est que le cache HTTP ne va pas stocker seulement le contenu de l&#8217;URL, il va aussi stocker des headers HTTP, des temps d&#8217;expiration &#8230;</p>
<p>Certains produits permettent de configurer le caching sans utiliser les headers, si on ne veut pas (ou on ne peut pas) modifier son application. Voir par exemple la <a href="https://www.varnish-cache.org/trac/wiki/VCL">VCL</a> de varnish. Je vous invite cependant à utiliser les headers HTTP, car c&#8217;est standard et plus simple à déployer (tout est dans l&#8217;applicatif).</p>
<p>Dans les implémentations ci dessus, Varnish et Squid vont être des démons séparés du serveur Web. Ces deux outils vont faire du caching en mémoire et/ou sur disque. Apache2 et Nginx vont pouvoir faire du caching HTTP, directement dans le serveur Web. La différence de performances ne sera pas gigantesque (au moins coté Nginx). L&#8217;architecture avec un cache séparée a cependant d&#8217;autres avantages. Elle permet de mutualiser le cache entre plusieurs applications, ou de lui confier d&#8217;autres fonctions : load balancing, aiguillage des certaines urls sur des serveurs spécifiques &#8230;</p>
<h4>Limitations</h4>
<p>Le système de cache fonctionne tellement bien qu&#8217;on va souvent chercher à lui faire faire autre chose. Prenons un exemple : mon site web affiche un classement. Ce classement est recalculé toutes les 3 minutes par un démon. Il est stocké dans une page web chargée en Ajax. Comment faire ? La solution la plus simple est d&#8217;écrire un fichier sur le disque qui sera ensuite servi par un serveur web, comme une page statique. Un problème est que le fichier ne contient que les données : pas de meta data, comme par exemple le temps d&#8217;expiration de la ressource. On aimerait donc bien placer notre classement directement dans un cache HTTP, en précisant le temps d&#8217;expiration. C&#8217;est assez compliqué en fait, puisque c&#8217;est un démon qui met à jour notre classement, et que le cache est alimenté par un serveur web &#8230;</p>
<p>Pour ce besoin, on va plutôt chercher une architecture du genre :<br />
<a href="http://blog.octo.com/wp-content/uploads/2012/04/Capture-d’écran-2012-04-26-à-17.21.29.png"><img src="http://blog.octo.com/wp-content/uploads/2012/04/Capture-d’écran-2012-04-26-à-17.21.29.png" alt="" title="Cache HTTP avec stockage externe" width="441" height="355" class="aligncenter size-full wp-image-30918" /></a></p>
<p>Dans cette architecture, pour chaque requête HTTP entrante (ou seulement sur un pattern d&#8217;URL), le reverse proxy HTTP se connecte sur le stockage et lui demande si il contient des données pour l&#8217;URL en question. Si oui, le reverse proxy HTTP renvoie les données. Si non, le reverse proxy interroge le serveur Web. Dans ce cas, ce n&#8217;est pas le reverse proxy qui remplit le stockage. Il est rempli soit par un autre serveur qui execute des traitements métiers (le serveur back office du dessin), soit par le serveur web, qui le remplit sur certains requêtes en plus de renvoyer des pages HTML.</p>
<p>C&#8217;est en fait un cache HTTP &laquo;&nbsp;éclaté&nbsp;&raquo; : on sépare la partie reverse proxy de la partie stockage, et on supprime l&#8217;alimentation du stockage par analyse des headers HTTP.</p>
<p>Cette architecture n&#8217;est pertinente que si le coût de régénération de la ressource est supérieur au coût d&#8217;aller la chercher dans le stockage. C&#8217;est très souvent le cas : une interrogation d&#8217;un stockage comme a href=&nbsp;&raquo;http://memcached.org/&nbsp;&raquo;>Memcached</a> sera bien plus rapide qu&#8217;un appel en base de données. On architecturera le site web pour que toutes les URLs que l&#8217;on peut mettre en cache soit facilement identifiables : /cache par exemple, de manière à ne pas faire d&#8217;appels sur le cache inutilement.</p>
<p>Ce besoin est en fait de plus en plus important : aujourd&#8217;hui, il n&#8217;y a plus besoin de démontrer l&#8217;impact de la vitesse d&#8217;un site web sur son business : &laquo;&nbsp;Amazon a découvert que chaque 100ms de latence lui coûte 1% de chiffre d&#8217;affaire&nbsp;&raquo;. Il est donc vital d&#8217;accélérer l&#8217;affichage des pages. Et une solution pour le faire est de réaliser certains traitements trop long de manière asynchrone. Quelques exemples : envoyer un mail, calculer un classement, mettre à disposition le pdf d&#8217;une facture &#8230;<br />
Ce mécanisme de jobs asynchrones est intégré dans certains frameworks de dévelopement web, par exemple Rails et ses <a href="https://github.com/tobi/delayed_job">delayed jobs</a>. </p>
<h3>Nginx / memcached module</h3>
<p>Le module Nginx / Memcached permet de réaliser l&#8217;architecture précédente, en utilisant <a href="http://nginx.org/">Nginx</a> comme reverse proxy HTTP et <a href="http://memcached.org/">Memcached</a> comme stockage. (Note : memcached est souvent utilisé pour stocker les sessions HTTP de manière partagée).</p>
<p>Le module <a href="http://wiki.nginx.org/HttpMemcachedModule">Nginx memcached</a> de base fonctionne très bien. Il a cependant une grosse limitation : on ne peut stocker les headers HTTP avec les données. Par exemple, les pages servies par Nginx et des données dans Memcached ont le Content-Type par défaut de Nginx : impossible donc de stocker plusieurs types de données dans le cache (CSS, JS, images, HTML, json&#8230;). On peut ajouter des headers HTTP spécifiques, mais seulement dans la configuration Nginx. Ces headers seront donc communs pour tous les resources servies par Nginx/Memcached (à moins de mettre des ifs partout dans la configuration).</p>
<p>Cette limitation rend donc plus difficile l&#8217;utilisation de ce module.<br />
Note : le module <a href="http://wiki.nginx.org/HttpRedis">Nginx Redis</a> présente le même type de limitation.</p>
<p>J&#8217;ai donc modifié le module Nginx / Memcached afin de pouvoir stocker des headers HTTP dans Memcached. Pour l&#8217;utiliser, il suffit d&#8217;insérer dans Memcached quelque chose du genre :</p>
<pre class="brush:java ; collapse:false">
EXTRACT_HEADERS
Content-Type: text/xml

&lt;toto&gt;&lt;/toto&gt;
</pre>
<p>Nginx renverra une page qui contiendra juste <code>&lt;toto&gt;&lt;/toto&gt;</code>, mais avec un header HTTP <code>Content-Type: text/xml</code>.</p>
<p>J&#8217;en ai profité pour ajouter des fonctionnalitées :</p>
<ul>
<li>Gère les headers <b><code>If-Modified-Since</code></b>, pour renvoyer un code <code>304 Not modified</code> quand la donnée dans Memcached contient un header <code>Last-Modified</code>.</li>
<li><b>Hasher les clés</b> utilisées dans Memcached pour contourner la limite de taille des clés dans Memcached (250 caractères)</li>
<li><b>Insertion dans Memcached via Nginx</b>, par une URL spécifique. Cela permet d&#8217;utiliser le cache avec un simple client HTTP, au lieu d&#8217;un client Memcached. C&#8217;est aussi utile quand on va répartir les données sur plusieurs serveurs : les mêmes load balancers HTTP pourront être utilisés en lecture et écriture</li>
<li><b>Purge Memcached via Nginx</b>, par une URL spécifique. Comme précédemment, cela permet de purger Memcached avec un simple client HTTP (<a href="http://curl.haxx.se/">curl</a> par exemple) </li>
<li><b>Purge partielle de Memcached</b> gràce à un mécanisme de <a href="http://code.google.com/p/memcached/wiki/NewProgrammingTricks#Namespacing">namespace</a>. Utile quand on cache des données pour plusieurs domaines, et que l&#8217;on veut en purger un seul.</li>
</ul>
<p>Un exemple de configuration Nginx, où Nginx regarde pour toutes les URLs si il y a des données dans memcached avant de passer les requêtes aux servers webs :</p>
<pre class="brush:java ; collapse:false">
  location / {
    error_page 404 = @fallback;

    if ($http_pragma ~* "no-cache") {
       return 404;
    }
    if ($http_cache_control ~* "no-cache") {
       return 404;
    }
    set $enhanced_memcached_key "$request_uri";
    set $enhanced_memcached_key_namespace "$host";
    enhanced_memcached_hash_keys_with_md5 on;
    enhanced_memcached_pass memcached_upstream;
  }

  location @fallback {
    proxy_pass http://backend_upstream;
  }
</pre>
<p>Ce module est open source et disponible <a href="https://github.com/bpaquet/ngx_http_enhanced_memcached_module">ici</a>.<br />
Il est utilisé en production chez <a href="http://www.fasterize.com">fasterize</a>, et toutes ces fonctionnalités sont utilisées et fonctionnent très bien.</p>
<p>J&#8217;espère que ce module vous sera utile !</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=30858" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/memcached-une-alternative-aux-caches-classiques/' rel='bookmark' title='Memcached : une alternative aux caches classiques'>Memcached : une alternative aux caches classiques</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/http-caching-avec-nginx-memcached/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>L&#8217;écosystème CEP Esper</title>
		<link>http://blog.octo.com/lecosysteme-cep-esper/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lecosysteme-cep-esper</link>
		<comments>http://blog.octo.com/lecosysteme-cep-esper/#comments</comments>
		<pubDate>Thu, 03 May 2012 23:00:53 +0000</pubDate>
		<dc:creator>Thomas Vial</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[CEP]]></category>
		<category><![CDATA[Esper]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=31260</guid>
		<description><![CDATA[Dans son introduction au Complex Event Processing (CEP), Mathieu avait annoncé une série d&#8217;articles sur les solutions de CEP. Nous l&#8217;inaugurons avec cet article sur Esper. Esper, édité par EsperTech, est une plateforme Java dédiée au CEP et au traitement de flux d&#8217;événements (ESP &#8211; event stream processing). C&#8217;est une collection de frameworks et d&#8217;outils [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/complex-event-processing-avec-esper/' rel='bookmark' title='Complex Event Processing avec Esper'>Complex Event Processing avec Esper</a></li>
<li><a href='http://blog.octo.com/complex-event-processing-2/' rel='bookmark' title='Complex Event Processing'>Complex Event Processing</a></li>
<li><a href='http://blog.octo.com/complex-event-processing-cep-de-quoi-sagit-il/' rel='bookmark' title='Complex Event Processing (CEP), de quoi s&#8217;agit-il?'>Complex Event Processing (CEP), de quoi s&#8217;agit-il?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p>Dans son <a href="http://blog.octo.com/en/complex-event-processing/">introduction</a> au <em>Complex Event Processing</em> (CEP), Mathieu avait annoncé une série d&#8217;articles sur les solutions de CEP. Nous l&#8217;inaugurons avec cet article sur Esper.</p>
<p>Esper, édité par <a href="http://www.espertech.com/">EsperTech</a>, est une plateforme Java dédiée au CEP et au traitement de flux d&#8217;événements (ESP &#8211; <em>event stream processing</em>). C&#8217;est une collection de frameworks et d&#8217;outils servant à construire et intégrer des applications orientées événements.</p>
<p>Les 3 packages de la suite Esper couvrent la plupart du socle technique de telles applications. EsperTech s&#8217;y réfère en tant que 3 &laquo;&nbsp;éditions&nbsp;&raquo;, mais ce sont en fait des groupes d&#8217;outils complémentaires.</p>
<p>La construction d&#8217;une application orientée événement avec Esper implique :</p>
<ul>
<li>le développement de la logique applicative au moyen d&#8217;instructions de traitement d&#8217;événements, instructions comprises par le coeur algorithmique de la suite, le moteur Esper Event Stream and Complex Event Processing (ou, en plus court, Esper Engine). Le moteur est distribué en open source sous licence GPLv2</li>
<li>le packaging, l&#8217;intégration et le déploiement de l&#8217;application &#8211; Esper Enterprise Edition (EsperEE) peut assurer ce rôle</li>
<li>si nécessaire, la sécurisation du traitement des événements avec EsperHA, qui ajoute des fonctions de persistance pour les scénarios de haute disponibilité et de reprise sur erreur</li>
</ul>
<p>L&#8217;<a href="http://blog.octo.com/en/the-esper-cep-ecosystem/">article complet</a>, en anglais, offre un tour d&#8217;horizon de la plateforme CEP constituée par cet écosystème Esper. Le discours s&#8217;appuie sur la version 4.5.0 de la suite (à ce jour, la dernière version est la 4.6.0).</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=31260" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/complex-event-processing-avec-esper/' rel='bookmark' title='Complex Event Processing avec Esper'>Complex Event Processing avec Esper</a></li>
<li><a href='http://blog.octo.com/complex-event-processing-2/' rel='bookmark' title='Complex Event Processing'>Complex Event Processing</a></li>
<li><a href='http://blog.octo.com/complex-event-processing-cep-de-quoi-sagit-il/' rel='bookmark' title='Complex Event Processing (CEP), de quoi s&#8217;agit-il?'>Complex Event Processing (CEP), de quoi s&#8217;agit-il?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/lecosysteme-cep-esper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>L&#8217;Infrastructure agile</title>
		<link>http://blog.octo.com/linfrastructure-agile/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=linfrastructure-agile</link>
		<comments>http://blog.octo.com/linfrastructure-agile/#comments</comments>
		<pubDate>Fri, 27 Apr 2012 10:02:51 +0000</pubDate>
		<dc:creator>Arnaud-François FAUSSE</dc:creator>
				<category><![CDATA[Infrastructure et opérations]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Capacité]]></category>
		<category><![CDATA[capacity planning]]></category>
		<category><![CDATA[Cloud computing]]></category>
		<category><![CDATA[Cloud privé]]></category>
		<category><![CDATA[CMDB]]></category>
		<category><![CDATA[COnfiguration manager]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[EC2]]></category>
		<category><![CDATA[gestion de configuration]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[infrastructure as code]]></category>
		<category><![CDATA[Inventaire]]></category>
		<category><![CDATA[OCCI]]></category>
		<category><![CDATA[production]]></category>
		<category><![CDATA[Usine de développement]]></category>
		<category><![CDATA[Virtualisation]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=30997</guid>
		<description><![CDATA[Les principes de l’Infrastructure agile Au cours de la vie d’un logiciel, beaucoup de temps est consacré à son déploiement sur différentes plates-formes (recette, preprod, prod&#8230;). Bien souvent, nous réalisons des sous-projets de création d&#8217;environnements pour les logiciels nouvellement développés. Ce type de sous-projet est rarement capitalisé techniquement et peu contributeur à la valeur métier. [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/annonce-kanban-depuis-les-tranchees-a-agile-grenoble-2010/' rel='bookmark' title='Annonce :  Kanban depuis les tranchées à Agile Grenoble 2010'>Annonce :  Kanban depuis les tranchées à Agile Grenoble 2010</a></li>
<li><a href='http://blog.octo.com/octo-presente-cinq-sessions-dans-le-cadre-de-la-conference-agile-france/' rel='bookmark' title='Octo présente cinq sessions dans le cadre de la conférence Agile France'>Octo présente cinq sessions dans le cadre de la conférence Agile France</a></li>
<li><a href='http://blog.octo.com/apero-agile-chez-octo-technology/' rel='bookmark' title='Apéro Agile chez OCTO Technology'>Apéro Agile chez OCTO Technology</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<h2>Les principes de l’Infrastructure agile</h2>
<p>Au cours de la vie d’un logiciel, beaucoup de temps est consacré à son <a title="déploiement sur différentes plates-formes" href="http://blog.octo.com/devops-le-mouvement-qui-tend-a-%e2%80%9cagilifier%e2%80%9d-votre-dsi/">déploiement sur différentes plates-formes</a> (recette, preprod, prod&#8230;). Bien souvent, nous réalisons des sous-projets de création d&#8217;environnements pour les logiciels nouvellement développés.<a href="http://blog.octo.com/wp-content/uploads/2012/04/IMG-000.png"><img class="wp-image-31147 alignright" align="right" title="IMG-000" src="http://blog.octo.com/wp-content/uploads/2012/04/IMG-000.png" alt="" width="209" height="130" /></a> Ce type de sous-projet est rarement capitalisé techniquement et peu contributeur à la valeur métier. Être capable de composer,  monter et démonter des environnements à la demande offrirait une flexibilité appréciable. Pour cela, il est efficace de standardiser les ressources d’infrastructure pour les utiliser comme des composants combinables. C’est ce que propose le cloud computing en offrant des capacités de production industrialisées sur Internet.<span id="more-30997"></span><br />
Construire des environnements requiert cependant des types de ressources d’infrastructure variés dont quelques exemples sont présentés ci-dessous :</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2012/04/IMG-0011.png"><img class="wp-image-31004 aligncenter" title="IMG-001" src="http://blog.octo.com/wp-content/uploads/2012/04/IMG-0011-1024x341.png" alt="" width="475" height="158" /></a></p>
<p>A la manière de ce qui est fait pour les capacités de calcul et de stockage (avec les API EC2 et S3 d’Amazon par exemple), les autres ressources peuvent aussi être requises à la demande et assemblées à travers des réseaux. C’est la vision de l’<strong>Infrastructure agile</strong>, où des ressources « standard » sont mises à disposition en self-service via une interface humaine ou par appel de web-services. La figure suivante donne un exemple d’infrastructure réalisée par un tel assemblage :</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2012/04/IMG-002.png"><img class="wp-image-31005 aligncenter" title="IMG-002" src="http://blog.octo.com/wp-content/uploads/2012/04/IMG-002-1024x531.png" alt="" width="460" height="238" /></a></p>
<p>Ainsi, un système d’information modélisé par des capacités et des réseaux pourrait se réaliser par une « simple » instanciation de ressources « cloud » sans mener « un projet spécifique d’infrastructure ». Vision utopique ou réalité ? Le deuxième choix est déjà le bon !</p>
<p>Il se pose quatre questions essentielles pour réaliser une telle vision :</p>
<ul>
<li>Comment définir et gouverner les ressources utiles aux usages de l’entreprise  (périmètre fonctionnel, modèle de financement et de facturation aux utilisateurs, SLA) ?</li>
<li>Comment donner aux utilisateurs l’accès à ces ressources ?</li>
<li>Comment implémenter les ressources à fournir (architecture, technologies) ?</li>
<li>Comment opérer techniquement les ressources ?</li>
</ul>
<p>Nous allons passer en revue ces différents sujets au cours d’une série d’articles sur ce blog. Mais nous pouvons d’ores et déjà en donner un aperçu.</p>
<h2>Un exemple de fonctionnement</h2>
<p>Examinons la dynamique permettant aux utilisateurs d’obtenir des capacités de manière agile. Ces dernières doivent disposer des caractéristiques du « cloud » c’est à dire être :</p>
<ul>
<li>disponibles dès que demandées via une interface humaine ou programmatique (approche « à la demande ») ;</li>
<li>payées à la consommation ;</li>
<li>en ligne avec un SLA donné ;</li>
<li>de capacité infinie vue de l’utilisateur.</li>
</ul>
<p>Prenons par exemple une capacité de transport et routage de messages (Broker MOM). La figure suivante montre un système de déploiement d’application qui invoque l&#8217;API de l’Infrastructure agile pour créer une ressource de transport de message :</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2012/04/IMG-003.png"><img class="wp-image-31007 aligncenter" title="IMG-003" src="http://blog.octo.com/wp-content/uploads/2012/04/IMG-003.png" alt="" width="490" height="330" /></a></p>
<p>La ressource de transport de message instanciée (MOM Messaging sur la figure) est composée d’un Broker, d’une console de paramétrage et d’exploitation. Les paramètres d’invocation de la demande précisent les services de messaging souhaités (par exemple les patterns d’intégration que le MOM doit fournir, la qualité de service attendue). Une fois le MOM créé, l’API d’accès à la ressource est active et présente dans ce cas l’accès au Broker. Un SLA définit les qualités opérationnelles de la ressource.</p>
<p>Il y a donc 3 composantes essentielles :</p>
<ul>
<li>L’API de demande de mise à disposition, qui une fois invoquée déclenche la création de la ressource et la mise à disposition des informations d’usage à l’utilisateur (réponse au web-service de demande ou vue dans le portail) ;</li>
<li>L’API d’usage des ressources qui permet l’accès aux capacités créées ;</li>
<li>Le Portail qui offre une vue d’interface humaine sur les ressources créées et utilisées.</li>
</ul>
<p>Notre capacité de messaging est donc :</p>
<ul>
<li>Disponible à la demande via une API (ou une IHM style « portail ») ;</li>
<li>De capacité infinie car on peut créer autant de brokers que l’on souhaite ;</li>
<li>Facturable au broker instancié et aux trafic de messages effectif ;</li>
<li>Ajustée en fonction d’un SLA définissant la disponibilité du service, sa fiabilité et ses performances maximales (niveau de disponibilité, latence de transmission&#8230;).</li>
</ul>
<p>Cette approche est généralisable à toutes les ressources d’infrastructure et de middleware.</p>
<p>Les API sont utilisables depuis par exemple une <a title="Usine de développement &quot;2.0&quot;" href="http://blog.octo.com/vers-une-usine-de-developpement-2-0/">usine de développement « 2.0 »</a> qui consomme de manière intensive l’infrastructure agile :</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2012/04/IMG-004.png"><img class="wp-image-31009 aligncenter" title="IMG-004" src="http://blog.octo.com/wp-content/uploads/2012/04/IMG-004.png" alt="" width="510" height="364" /></a></p>
<p>Grâce à l’Infrastructure agile, les environnements de test et de production sont déployables à la demande. Les Développeurs, devenus Opérateurs applicatifs dans une organisation DevOps, consomment les ressources sans se soucier de la technologie sous-jacente. Ils déploient leurs applications sur des capacités et laissent leurs collègues Opérateurs d’infrastructure assurer l’opération de l’Infrastructure agile selon les SLAs convenus.</p>
<h2>Comment découvrir et préciser les capacités de l’Infrastructure agile ?</h2>
<p>Il convient de spécifier fonctionnellement les capacités d’infrastructure et d’indiquer par quels mécanismes techniques l’utilisateur pourra y accéder.<br />
Concernant <strong>l’aspect fonctionnel</strong>, l’essentiel est dans l’organisation : qui participe à la spécification des capacités offertes ?<br />
Deux organisations et méthodes projet sont possibles :</p>
<ul>
<li>Le marketing interne proactif, c’est à dire que les responsables de l’infrastructure sont à l’initiative et démarchent les utilisateurs de façon anticipée pour découvrir quelles capacités sont ou seront requises ;</li>
<li>La réalisation réactive, où les responsables de l’infrastructure attendent les demandes (venant des équipes de développement la plupart du temps) pour faire évoluer leurs actifs dans un but de factorisation et de rationalisation progressive.</li>
</ul>
<p>Ces deux modes d’engagement de la réflexion débouchent cependant sur un travail de <strong>collaboration</strong> entre le monde de l’application et celui de l’infrastructure.</p>
<p>Concernant <strong>l&#8217;aspect technique</strong>, quel cadre de spécification et de réalisation utiliser ?<br />
Les spécifications EC2, S3, OCCI, font apparaître des spécialisations plus ou moins marquées vers des capacités. Par exemple S3 adresse le stockage et non les MOMs. Il convient de rendre le plus homogène possible l’API afin de constituer un catalogue aisément utilisable et surtout actionnable en terme de combinaison des capacités. Nous examinerons l’utilisation d’OCCI pour une description quasi universelle des capacités d’infrastructure dans un prochain article.</p>
<h2>Comment réaliser et opérer l’Infrastructure agile ?</h2>
<p>La promesse de l’Infrastructure agile impose de respecter les principes suivants lors de sa conception :</p>
<ul>
<li>Automatisation totale, pour obtenir une qualité « industrielle » ;</li>
<li>Standardisation totale des composants (matériel, logiciel), pour réduire les coûts ;</li>
<li>Opération dédiée, pour libérer l’Opérateur d’infrastructure qui ne connaît plus les applications mais se focalise sur le SLA des capacités livrées.</li>
</ul>
<h3>Architecture</h3>
<p>L’Infrastructure agile a deux facettes :</p>
<ul>
<li>Les ressources matérielles et logicielles (Machines, OS, stockage… qui permettent de livrer les ressources requises via l’API de mise à disposition). On appelle ces ressources des « Capacités sous-jacentes », non visibles en tant que telles par les utilisateurs de l’API ;</li>
<li>Les ressources effectivement livrées et fonctionnant dans un contexte utilisateur (VM, VLAN, Consoles de supervision, stockages…), ce sont les « Capacités livrées ».</li>
</ul>
<p>Les composants fournissant les ressources peuvent être utilisés à la fois pour les capacités sous-jacentes et les capacités livrées. Typiquement, la supervision peut fournir des informations sur les machines à l’Opérateur d’infrastructure, mais également des informations concernant les capacités livrées (supervision de VM par exemple) à leurs utilisateurs. Ce double usage est à considérer avec soin, car il entraine la création de contraintes bien spécifiques (sécurité, multi-tenant…).</p>
<h3>Composants essentiels</h3>
<p>La figure ci-dessous présente des composants connectés dont les rôles sont les suivants :</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2012/04/IMG-005.png"><img class="wp-image-31010 aligncenter" title="IMG-005" src="http://blog.octo.com/wp-content/uploads/2012/04/IMG-005.png" alt="" width="478" height="348" /></a></p>
<div>
<ul>
<li>L’inventaire et la CMDB recensent le parc des ressources composant l’Infrastructure agile (du point de vue des capacités) ;</li>
<li>Le Configuration manager a pour objectif de maintenir la configuration à jour de tous les composants utiles à la livraison des capacités. Il est aussi en charge de la configuration élémentaire des capacités livrées ;</li>
<li>Le Cloud controller, en association avec le Configuration manager provisionne les capacités demandées via l’API ;</li>
<li>La supervision surveille les capacités sous-jacentes et livrées ;</li>
<li>Le réseau permet de composer dynamiquement des sous réseaux respectant des politiques de communication et de sécurité ;</li>
<li>Un système de stockage est utilisé pour fournir de l’espace sous-jacent ou livré ;</li>
<li>Un pool de machines homogène et supportant la virtualisation fournit la puissance de calcul.</li>
</ul>
<p>Nous aborderons les aspects technologiques et « produits » dans un prochain article.</p>
<h3>Opération de l’Infrastructure agile</h3>
<p>L’Opérateur de l’Infrastructure agile livre l’API et les capacités aux utilisateurs. Il n’est pas impliqué dans l’usage des capacités livrées, si ce n’est de surveiller leur bon usage et de vérifier que le SLA est bien tenu. On libère ainsi l’Opérateur de toute action applicative pour qu’il se concentre sur son cœur de métier. L’Infrastructure agile doit apporter toutes les métriques à son Opérateur afin qu’il puisse :</p>
<ul>
<li>Superviser l’ensemble des ressources sous-jacentes ;</li>
<li>Etablir le capacity planning moyen terme et le travailler avec les équipes de développement et le Métier ;</li>
<li>Anticiper les maintenances ;</li>
<li>Préparer la facturation des capacités livrées consommées ;</li>
<li>Participer au plan d’évolution de l’Infrastructure agile avec les Architectes d’infrastructure ;</li>
<li>Conduire les tests de l’Infrastructure agile avec les Architectes d’infrastructure.</li>
</ul>
<h2>L’architecte d’infrastructure</h2>
<p>La construction de l’Infrastructure agile requiert les compétences d’<strong>Architectes d’infrastructure</strong> et ne peut plus se satisfaire de déploiement de capacités par silos ou spécialités technologiques. L’Infrastructure agile a une dimension systémique qui requiert une véritable démarche d’architecture assurant cohérence, maîtrise des coûts et capacité d’adaptation aux nouveaux besoins. Examinons ces quelques remarques afin d’en cerner l’aspect :</p>
<ul>
<li>L’Infrastructure agile se comporte comme une application informatique traditionnelle vue des utilisateurs. En effet, ces derniers voient une API programmatique et un Portail ;</li>
<li>De ce fait, les principes d’élaboration des applications/systèmes d’information sont applicables. Par exemple, il convient de définir les cas d’usages de l’Infrastructure agile (Utilisateur / Opérateur), les cas de test, le comportement interne (règles de gestion…) ;</li>
<li>L’Infrastructure agile est réalisée par l’intégration de produits. Il faut les maîtriser (cartographies fonctionnelles, capacités opérationnelles), puis étudier l’architecture applicative et technique complète, réaliser les dimensionnements des composants, étudier les flux inter-composants, les modes dégradés…</li>
<li>L’automatisation poussée impose souvent de complémenter les produits par du code spécifique (optimiseurs, ordonnanceurs, règles de gestion) ;</li>
<li>Il convient de livrer l’Infrastructure agile en mode itératif afin de suivre les besoins de capacités exprimés notamment par les Équipes de développement et Métiers. Une usine de développement et de tests pour l’Infrastructure agile est donc nécessaire.</li>
</ul>
<p>L’Architecte d’infrastructure qui conçoit et réalise l’Infrastructure agile, apporte son savoir-faire unique qui mixe les technologies d’infrastructure, l’élaboration logicielle et l’intégration de systèmes.</p>
<h2>Conclusion</h2>
<p>Au cours de cette introduction à l’Infrastructure agile, nous avons proposé d’appliquer les principes du cloud computing à l’ensemble des capacités d’infrastructure. Elles sont alors mises à disposition en self-service, élastiques et payées à la consommation. Une telle infrastructure permet la mise en place de DevOps, en rendant plus clair le contrat de service de l’infrastructure, en libérant les Opérateurs d’infrastructure de l’opération des applications et en poussant l’Opération applicative du coté études. Pour construire l’Infrastructure agile, des compétences d’intégrateur de système et de concepteur/développeur d’application sont nécessaires. L’Architecte d’infrastructure est au cœur de la construction de cette vision. Il nous reste à mettre cette vision en action.  Les prochains articles sur ce blog vont nous éclairer sur comment procéder.</p>
</div>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=30997" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/annonce-kanban-depuis-les-tranchees-a-agile-grenoble-2010/' rel='bookmark' title='Annonce :  Kanban depuis les tranchées à Agile Grenoble 2010'>Annonce :  Kanban depuis les tranchées à Agile Grenoble 2010</a></li>
<li><a href='http://blog.octo.com/octo-presente-cinq-sessions-dans-le-cadre-de-la-conference-agile-france/' rel='bookmark' title='Octo présente cinq sessions dans le cadre de la conférence Agile France'>Octo présente cinq sessions dans le cadre de la conférence Agile France</a></li>
<li><a href='http://blog.octo.com/apero-agile-chez-octo-technology/' rel='bookmark' title='Apéro Agile chez OCTO Technology'>Apéro Agile chez OCTO Technology</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/linfrastructure-agile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CR du petit déjeuner prospective &#171;&#160;La banque du futur : vision 2020&#8243;</title>
		<link>http://blog.octo.com/cr-du-petit-dejeuner-prospective-la-banque-du-futur-vision-2020/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cr-du-petit-dejeuner-prospective-la-banque-du-futur-vision-2020</link>
		<comments>http://blog.octo.com/cr-du-petit-dejeuner-prospective-la-banque-du-futur-vision-2020/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 08:58:27 +0000</pubDate>
		<dc:creator>Thibaut Le Loir</dc:creator>
				<category><![CDATA[Général -- NE PAS UTILISER CETTE CATEGORIE]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=31069</guid>
		<description><![CDATA[Mercredi 27 mars, l&#8217;entité Banque et Services Financiers d&#8217;OCTO a initié un nouveau format de petit déjeuner : la vision prospective sectorielle. Imaginer ce que sera l&#8217;environnement bancaire dans un futur à moyen terme à la fois proche et lointain. Proche pour le rattacher à des signaux faibles et des tendances que nous observons aujourd&#8217;hui, et [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/banque-de-detail-du-futur-scenarios-2020/' rel='bookmark' title='Banque de détail du futur : scénarios 2020'>Banque de détail du futur : scénarios 2020</a></li>
<li><a href='http://blog.octo.com/petit-dejeuner-mobilite-ipad-iphone-android-en-banque-et-assurance-preparez-vous-au-coup-dapres/' rel='bookmark' title='Petit déjeuner mobilité &#8211; iPad, iPhone Android en banque et assurance, préparez-vous au coup d&#8217;après !'>Petit déjeuner mobilité &#8211; iPad, iPhone Android en banque et assurance, préparez-vous au coup d&#8217;après !</a></li>
<li><a href='http://blog.octo.com/petit-dejeuner-octo-lagilite-a-grande-echelle-retour-dexperience-avec-strator/' rel='bookmark' title='Petit-déjeuner OCTO &#8211; L&#8217;agilité à grande échelle : Retour d&#8217;experience avec Strator'>Petit-déjeuner OCTO &#8211; L&#8217;agilité à grande échelle : Retour d&#8217;experience avec Strator</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p>Mercredi 27 mars, l&#8217;entité Banque et Services Financiers d&#8217;OCTO a initié un nouveau format de petit déjeuner : la vision prospective sectorielle.</p>
<p>Imaginer ce que sera l&#8217;environnement bancaire dans un futur à moyen terme à la fois proche et lointain. Proche pour le rattacher à des signaux faibles et des tendances que nous observons aujourd&#8217;hui, et assez lointain pour ne pas rester englué dans la situation actuelle et amorcer une dynamique d&#8217;évolution.</p>
<p><span style="color: #333399;"><strong>La Banque dans dix ans&#8230; </strong></span></p>
<p>Sous quelles formes seront réalisées les interactions entre les institutions financières et la population au quotidien ?</p>
<p>La tendance virtuelle, électronique qui a débuté au début des années 2000 va-t-elle se poursuivre ou la banque va-t-elle réinverser la tendance en replaçant la relation physique au coeur du système Homme-Banque ?</p>
<p>Ces nouveaux modèles de relation vont-ils apporter avec eux une révolution dans la conception informatique des outils bancaires, dans l&#8217;architecture même des briques informatiques qui composent son SI ? <span id="more-31069"></span></p>
<p><span style="color: #333399;"><strong>Notre mode de fonctionnement</strong></span></p>
<p>Nous nous sommes donc prêtés à un exercice original et difficile : le jeu des scenarios.</p>
<p>L&#8217;objectif d&#8217;un tel exercice est de lancer des idées, raisonnables ou plus folles, les rassembler en groupes cohérents, et faire ressortir de ces tendances quelques scenarios, schématisés par une appellation révélatrice. Ensuite, il s&#8217;agit d&#8217;identifier les signaux faibles actuels qui concourent à ces prévisions.</p>
<p>D&#8217;un tel exercice se dégagent des scenarios qu&#8217;il ne convient pas de prendre au pied de la lettre. Les tendances de fond, les révolutions technologiques ou de conception sont des éléments prolongeant des évolutions que nous constatons aujourd&#8217;hui, et qui sont éclairantes dès aujourd&#8217;hui pour commencer à amorcer des virages et repenser la façon dont on va pouvoir faire de l&#8217;informatique bancaire demain.</p>
<p><span style="color: #333399;"><strong>Le résultat</strong></span></p>
<p>Nous avons abouti à 3 scénarios :</p>
<ul>
<li><span style="text-decoration: underline;">Le scenario &laquo;&nbsp;Tout concret&nbsp;&raquo; :</span></li>
</ul>
<p>Le défaut de l’Italie, après celui de l’Espagne 3 ans plus tôt, a bouleversé les certitudes des consommateurs européens. Ils se sont massivement tournés vers des investissements concrets : immobilier, terre et métaux précieux, boudant les produits financiers obscurs car ils n’accordent plus de crédit aux banques.</p>
<p>Ces dernières se sont vu obliges de revoir leur image et de regagner la confiance perdue. Elles ont donc misé sur la relation avec leur clientèle en repensant leur modèle d’agence à travers un espace convivial renouant avec leurs origines : Proximité et Conseil.</p>
<p>Ces agences se recentrent sur les domaines où la banque excelle : gestio de l’épargne et patrimoniale, octroi de crédit et financement des entreprises. L’écoute du terrain étant privilégiée, son personnel d’agence se spécialise pour répondre aux questions toujours plus pointues de clients échaudés. Des outils d’aide à la décision intéractifs (tablettes, tables tactiles) permettent au conseiller de bâtir avec le client une solution sur mesure.</p>
<p>Le contexte socio-économique oblige à adapter les produits proposés : simplification des offres pour les rendre plus accessibles et plus transparentes, adaptation des produits à la clientèle (vieillissement de la population), introduction du financement participatif sont autant d’avancées. Côté BtoB, le succès de l’auto-entreprenariat a favorisé l’émergence de nombreuses TPE/PME demandeuses de solutions simples et peu coûteuses (paiement, crédit, …) avec l’aval d’un gouvernement désireux de voir repartir la croissance.</p>
<p>Recentrées sur leurs métiers historiques, toutes les banques, ayant fait l’effort de se rapprocher de leurs clients, au propre comme au sens figuré, ont vu leur côte de confiance repartir à la hausse et retrouver des niveaux de profitabilité qu’elles croyaient ne plus revoir de si tôt.</p>
<ul>
<li><span style="text-decoration: underline;">Le scenario &laquo;&nbsp;Tout virtuel&nbsp;&raquo; :</span></li>
</ul>
<p>Le succès des banques en ligne ne se dément plus. Toute la population française d’un accès Internet, d’une identité numérique et les « digital natives » sont majoritaires en cette année 2020. De fait, très peu de gens prennent encore la peine de se déplacer en agence conduisant les banques à diviser par 10 leur nombre et à automatiser la quasi-totalité des actes pour diminuer le personnel présent.</p>
<p>Désormais, tout peut se faire seul de chez soi. La banalisation des analyses biométriques (voix, visage, veine, …) a résolu les problématiques d’identification des individus notamment à la signature des contrats. Ces documents, tout comme la plupart des pièces administratives, sont collectés et archivés durablement dans des coffres forts électroniques qui garantissent leur intégrité et permettent par leur moteur de recherche avancé de tout retrouver facilement.</p>
<p>Mais si la virtualisation des actes bancaires s’est étendue ces 10 dernières années, que dire des solutions de paiement qui ont été révolutionnées au cours de cette même période. Qui aurait pu pronostiquer que la carte bleue plastique disparaitrait de notre quotidien avant le chèque ? Qui aurait pu prévoir une telle adhésion pour l’argent virtuel et les portemonnaies électroniques multifonctions sur mobile quand on se souvient des tentatives peu fructueuses de Moneo ?</p>
<p>Et l’usage même de notre accès à Internet s’est modifié, passant de l’austère PC familial aux IHMs tabulaires, aux tablettes tactiles, améliorant l’expérience client en utilisant judicieusement notre gestuelle. Car ne nous y trompons pas, ce sont bien les tablettes qui ont conquis les plus seniors ou les moins technophiles d’entre nous. La simplicité et la transparence d’utilisation sont plus que jamais des gages de fiabilité et de confiance.</p>
<p>En 10 ans, l’image de la banque s’est métamorphosée ; elle figure aujourd’hui au côté des grands acteurs du WEB sur le plan des avancées technologiques.</p>
<ul>
<li><span style="text-decoration: underline;">Le scenario &laquo;&nbsp;Tout distribué&nbsp;&raquo; :</span></li>
</ul>
<p>Juillet 2020, Composite Bank vient de détrôner CityGroup en nombre de clients particuliers et gère un encours considérable qui attise la convoitise d’états fortement affaiblis budgétairement, un succès inimaginable 8 ans plus tôt en plein marasme économique… car CompositeBank n’existait pas ! Et pourtant, tous les ingrédients nécessaires à la cette success-story étaient déjà présents à cette époque-là.</p>
<p>Souvenez-vous fin 2011, BankSimple avait ouvert la voie en proposant une offre en rupture basée sur un back-end temps réel et une relation client totalement repensées. Comment avait-elle réussi ce tour de force en un temps aussi court ? Simplement en se concentrant sur leur différenciant, et en complétant leur SI avec des briques prêtes à l’emploi, en avance sur le marché, proposées par des acteurs déjà implantés.</p>
<p>CompositeBank représente l’aboutissement de cette stratégie : externaliser les processus métier offrant le moins de valeur ajoutée à l’organisation en intégrant des offres clé-en-main en marque blanche ou via des APIs ouvertes. Pourtant de nombreux acteurs se sont lancés sur cette piste-là mais seulement très peu ont réussi le passage à l’échelle. Pourquoi ?</p>
<p>Dès le début, CompositeBank a assumé son statut de consommateur de solutions et bâti une organisation en conséquence : un pôle « expérience client » très développé qui collabore étroitement avec un pôle IT réduit mais composé d’experts, eux-mêmes dialoguant avec une communauté de partenaires. Fini le découpage historique Etude / Production, place à une organisation par ligne produit qui fluidifie la communication entre les équipes, aligne tous les acteurs sur le même enjeu et dynamise l’innovation.</p>
<p>Car c’est cette même innovation qui a permis à CompositeBank de se faire un nom à ses débuts et qui, aujourd’hui encore, malgré la taille de l’entreprise, la rend capable de nous surprendre… et a contraint ses concurrents, y compris les acteurs historiques, à modifier leurs organisations.</p>
<p><span style="color: #333399;"><strong>Conclusion</strong></span></p>
<p>Cet exercice a été salué par les participants à ce petit déjeuner. Il a mis en avant des tendances sociétales, économiques, mais aussi un ancrage fort sur les impacts informatiques et organisationnels qui en découlent.</p>
<p>OCTO travaille depuis 13 ans sur des problématiques de création ou de transformation des systèmes d&#8217;information, et adresse aujourd&#8217;hui des sujets tels que les APIs, le Big Data, le PFM, la mobilité, les technologies web et les récentes normes HTML5, l&#8217;interfaçage de briques externes avec le SI, la sécurité applicative, les cibles et trajectoires d&#8217;évolution des SI en voie d&#8217;obsolescence&#8230;</p>
<p>Si vous avez des besoins, des projets ou que vous souhaitez notre retour d&#8217;expérience sur ces sujets, n&#8217;hésitez pas à nous contacter.<br />
Voici le lien vers les <a href="https://extranet.octo.com/oft/viewfile.php?fileid=e58eea80c1d0cd482c3b2f87557b8fc1&amp;dl= ">slides</a> du petit déjeuner ainsi que le lien vers la <a href="http://www.youtube.com/watch?v=kXWrgnaxrnc">vidéo</a>.</p>
<p>&nbsp;</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=31069" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/banque-de-detail-du-futur-scenarios-2020/' rel='bookmark' title='Banque de détail du futur : scénarios 2020'>Banque de détail du futur : scénarios 2020</a></li>
<li><a href='http://blog.octo.com/petit-dejeuner-mobilite-ipad-iphone-android-en-banque-et-assurance-preparez-vous-au-coup-dapres/' rel='bookmark' title='Petit déjeuner mobilité &#8211; iPad, iPhone Android en banque et assurance, préparez-vous au coup d&#8217;après !'>Petit déjeuner mobilité &#8211; iPad, iPhone Android en banque et assurance, préparez-vous au coup d&#8217;après !</a></li>
<li><a href='http://blog.octo.com/petit-dejeuner-octo-lagilite-a-grande-echelle-retour-dexperience-avec-strator/' rel='bookmark' title='Petit-déjeuner OCTO &#8211; L&#8217;agilité à grande échelle : Retour d&#8217;experience avec Strator'>Petit-déjeuner OCTO &#8211; L&#8217;agilité à grande échelle : Retour d&#8217;experience avec Strator</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/cr-du-petit-dejeuner-prospective-la-banque-du-futur-vision-2020/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les Patterns des Grands du Web &#8211; la bêta perpétuelle</title>
		<link>http://blog.octo.com/la-beta-perpetuelle/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=la-beta-perpetuelle</link>
		<comments>http://blog.octo.com/la-beta-perpetuelle/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 13:02:14 +0000</pubDate>
		<dc:creator>Guillaume Plouin</dc:creator>
				<category><![CDATA[Accompagnement de projets]]></category>
		<category><![CDATA[Méthodologie et conduite du changement]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=30300</guid>
		<description><![CDATA[Description du pattern Avant d’introduire la bêta perpétuelle, il est nécessaire de revenir sur un pattern classique du monde Open Source : “Release early, release often”. Le principe de ce pattern consiste à mettre régulièrement le code à la disposition de la communauté afin de permettre aux développeurs, testeurs, utilisateurs de donner un feedback en [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/les-patterns-des-grands-du-web-openapi-ou-ecosysteme-ouvert/' rel='bookmark' title='Les Patterns des Grands du Web : « OpenAPI » ou écosystème ouvert'>Les Patterns des Grands du Web : « OpenAPI » ou écosystème ouvert</a></li>
<li><a href='http://blog.octo.com/test-ab/' rel='bookmark' title='Les Patterns des Grands du Web – Test A/B'>Les Patterns des Grands du Web – Test A/B</a></li>
<li><a href='http://blog.octo.com/les-patterns-des-grands-du-web-lobsession-de-la-mesure/' rel='bookmark' title='Les Patterns des Grands du Web &#8211; L&#8217;obsession de la mesure'>Les Patterns des Grands du Web &#8211; L&#8217;obsession de la mesure</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<h2>Description du pattern</h2>
<p>Avant d’introduire la bêta perpétuelle, il est nécessaire de revenir sur un pattern classique du monde Open Source : “<strong>Release early, release often</strong>”. Le principe de ce pattern consiste à mettre régulièrement le code à la disposition de la communauté afin de permettre aux développeurs, testeurs, utilisateurs de donner un feedback en continu sur le produit. Cette pratique a été décrite dans “La cathédrale et le bazar” d’Eric Steven Raymond. Elle rejoint le principe d’itération courte des méthodes agiles.</p>
<p><span id="more-30300"></span></p>
<p>Le principe de la “<strong>bêta perpétuelle</strong>” a été introduit dans le manifeste du Web 2.0, écrit par Tim O’Reilly, et où il nous dit la chose suivante :</p>
<p><em>“ Les utilisateurs doivent être considérés comme des co-développeurs, en suivant les principes Open Source (&#8230;). Avec le Web 2.0, ce principe évolue vers une position plus radicale, la bêta perpétuelle, dans laquelle le produit est développé de manière ouverte, avec de nouvelles fonctionnalités offertes sur une base mensuelle, hebdomadaire, ou même quotidienne. ”</em></p>
<p>Le terme « bêta perpétuelle » désigne le fait que l’application n’est jamais finalisée, mais toujours en évolution : il n’y a pas de livraison de nouvelle version à proprement parler. L’enjeu de ce mode de fonctionnement est de réussir à mettre en place le « <a title="Continuous Delivery: How do we deliver in 3 clicks to 7000 machines?" href="http://blog.octo.com/en/continuous-delivery-how-do-we-deliver-in-3-clicks-to-7000-machines/" target="_blank">Continuous Delivery</a> ».</p>
<p>Cette évolution continue est possible car on parle de services en ligne et non de logiciels :</p>
<ul>
<li><strong>Dans le cadre de logiciels</strong>, la gestion de versions suit généralement une roadmap avec des jalons de publication : des « releases ». Ces releases sont espacées dans le temps pour 2 raisons : la nécessité de déployer les versions chez les utilisateurs, et le besoin s’assurer la maintenance et le support des différentes versions déployées chez les utilisateurs. Assurer le support, les mises à jour de sécurité et la maintenance évolutive sur plusieurs versions d’un même logiciel est un terrible casse-tête, et un casse-tête coûteux. Prenons l’exemple de Microsoft : l’éditeur de Redmond a du, à un moment donné, gérer les évolutions de Windows XP, Vista et Seven. On imagine les 3 équipes de développeurs mobilisées pour un seul et même logiciel : une terrible dispersion d‘énergie et un cauchemar pour un éditeur moins fortuné que Microsoft. Ce syndrome est appelé “<strong>perversion des versions</strong>”.<strong></strong></li>
<li><strong>Dans le cadre des services en ligne</strong>, il est possible de ne gérer qu’une seule version de l’application. Et comme les grands du Web se chargent de mettre en ligne et d&#8217;héberger leurs applications, les utilisateurs peuvent bénéficier des nouveautés sans avoir à gérer de déploiement logiciel.<strong></strong></li>
</ul>
<p>Les services en ligne sont donc mis à jour en continu par leurs opérateurs sans que les utilisateurs soient informés de l’existence d’une nouvelle version. Les nouvelles fonctionnalités apparaissent au fil de l’eau et elles sont découvertes par hasard par les usagers. Ce mode de fonctionnement permet un apprentissage progressif des nouveautés applicatives. En règle générale, les problématiques de compatibilité ascendante sont bien gérées (il existe quelques exceptions, comme le support du mode déconnecté dans Gmail suite à l’abandon de Google Gears). Ce modèle est largement utilisé par les acteurs du Cloud Computing.</p>
<p>La « <strong>Customer driven roadmap</strong> » est un élément complémentaire et vertueux de la «bêta perpétuelle». Comme les grands du Web maîtrisent la plateforme de production, ils peuvent faire des statistiques sur l’usage de leur logiciel. Cela leur permet de mesurer l’accueil qui est fait aux nouvelles fonctionnalités offertes. A ce titre, les grands du Web suivent énormément de métriques : on dit d’ailleurs qu’ils ont le « <a title="Les Patterns des Grands du Web – L’obsession de la mesure" href="http://blog.octo.com/les-patterns-des-grands-du-web-lobsession-de-la-mesure/" target="_blank">culte de la mesure</a> ».</p>
<p>De manière plus classique, le fait de maîtriser la plateforme de production permet de lancer des sondages auprès de certains segments de population afin d’obtenir un feedback utilisateurs.</p>
<p>Pour utiliser le pattern bêta perpétuelle, il est indispensable d’avoir les moyens de faire des déploiement réguliers. Les pré-requis sont donc :</p>
<ul>
<li>la mise en oeuvre d’une usine logicielle avec build automatisé</li>
<li>des pratiques de “<a title="Articles du blog OCTO sur DevOps" href="http://blog.octo.com/tag/devops/" target="_blank">continuous delivery</a>”</li>
<li>la capacité à faire un rollback rapide en cas de problème&#8230;</li>
</ul>
<p>Il existe une polémique sur la bêta perpétuelle : certains utilisateurs considèrent que bêta est synonyme de produit non fini, et que les services qui suivent ce pattern ne sont pas assez fiables pour être utilisés. Cette polémique a poussé certains opérateurs de services a supprimer la mention “bêta” de leur site, sans pour autant changer leurs pratiques.</p>
<h2>Chez qui ça fonctionne ?</h2>
<p>La référence était Gmail dont le logo intégrait la mention bêta jusqu&#8217;en 2009 (une fonction &laquo;&nbsp;<a title="GMail: Back to Beta" href="http://gmailblog.blogspot.fr/2009/07/gmail-leaves-beta-launches-back-to-beta.html" target="_blank">back to Beta</a>&nbsp;&raquo; a depuis été ajoutée).</p>
<p>La pratique existe chez de nombreux grands du Web : Facebook, Amazon, Twitter, Flickr, Delicious.com, etc.</p>
<p>Une bonne illustration de la « bêta perpétuelle » est fournie par les Labs de Gmail : ce sont de petites fonctionnalités unitaires que les utilisateurs peuvent décider d’activer ou non. En fonction de leur adoption, Google décide ou non de les intégrer à la version standard de son service.</p>
<p>En France, des services en ligne affichent ou ont affiché le bêta sur leur page d’accueil :</p>
<ul>
<li><a href="http://urbandive.com/">urbandive</a><a href="http://urbandive.com/">.</a><a href="http://urbandive.com/">com</a> : service de navigation en vue piétonne du groupe Pages Jaunes</li>
<li><a href="http://open.sen.se/">sen.se </a>: service de stockage et d’analyse de données personnelles</li>
<li>etc.</li>
</ul>
<h2>Et chez moi ?</h2>
<p>Nous vous engageons à tester ce pattern, en déployant les : continous delivery, A/B testing, développement agile.</p>
<h2>Dépendances à d&#8217;autres patterns</h2>
<p>Pattern “<a title="Continuous Delivery" href="http://blog.octo.com/en/continuous-delivery-how-do-we-deliver-in-3-clicks-to-7000-machines/" target="_blank">continous delivery</a>”</p>
<p>Pattern “<a title="Test A/B" href="http://blog.octo.com/test-ab/" target="_blank">A/B testing</a>” &amp; « <a title="Les Patterns des Grands du Web – L’obsession de la mesure" href="http://blog.octo.com/les-patterns-des-grands-du-web-lobsession-de-la-mesure/" target="_blank">culte de la mesure</a> »</p>
<p>Pattern “développement agile”</p>
<h2>Exceptions!</h2>
<p style="text-align: left;">Certains grands du Web choisissent de continuer à utiliser le principe de coexistence des versions. Il est en particulier utile de maintenir plusieurs versions d’une API afin d’éviter de forcer les développeurs à mettre à jour leur code immédiatement à la sortie d’une nouvelle version de l’API.</p>
<p style="text-align: left;">Voir en particulier <a href="aws.amazon.com/releasenotes/Amazon-EC2/7928597443238862">l’API Amazon Web Services</a></p>
<h2>Sources</h2>
<p style="text-align: left;"><a href="http://oreilly.com/web2/archive/what-is-web-20.html">The Perpetual Beta, manifeste du Web2.0, Tim Oreilly</a></p>
<p style="text-align: left;"><a href="http://en.wikipedia.org/wiki/Perpetual_bêta">La bêta perpétuelle sur Wikipedia</a></p>
<p style="text-align: left;"><a href="http://fr.wikipedia.org/wiki/La_Cath%C3%A9drale_et_le_Bazar">“La cathédrale et le bazar”, Eric Steven Raymond</a></p>
<div></div>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=30300" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/les-patterns-des-grands-du-web-openapi-ou-ecosysteme-ouvert/' rel='bookmark' title='Les Patterns des Grands du Web : « OpenAPI » ou écosystème ouvert'>Les Patterns des Grands du Web : « OpenAPI » ou écosystème ouvert</a></li>
<li><a href='http://blog.octo.com/test-ab/' rel='bookmark' title='Les Patterns des Grands du Web – Test A/B'>Les Patterns des Grands du Web – Test A/B</a></li>
<li><a href='http://blog.octo.com/les-patterns-des-grands-du-web-lobsession-de-la-mesure/' rel='bookmark' title='Les Patterns des Grands du Web &#8211; L&#8217;obsession de la mesure'>Les Patterns des Grands du Web &#8211; L&#8217;obsession de la mesure</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/la-beta-perpetuelle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

