<?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>Fri, 03 Feb 2012 13:46:10 +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>CR du petit-déjeuner OCTO « Tablettes : passons à l’ère post PC »</title>
		<link>http://blog.octo.com/cr-du-petit-dejeuner-octo-tablettes-passons-a-lere-post-pc/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cr-du-petit-dejeuner-octo-tablettes-passons-a-lere-post-pc</link>
		<comments>http://blog.octo.com/cr-du-petit-dejeuner-octo-tablettes-passons-a-lere-post-pc/#comments</comments>
		<pubDate>Fri, 03 Feb 2012 13:46:10 +0000</pubDate>
		<dc:creator>Céline Pageaux</dc:creator>
				<category><![CDATA[Accompagnement de projets]]></category>
		<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[Méthodologie et conduite du changement]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[Mobilité]]></category>
		<category><![CDATA[Petit-Déjeuner OCTO]]></category>
		<category><![CDATA[post-PC]]></category>
		<category><![CDATA[REX]]></category>
		<category><![CDATA[table ronde]]></category>
		<category><![CDATA[Tablettes]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=29855</guid>
		<description><![CDATA[Agenda : Rappel de l’offre mobilité OCTO Les tablettes : quels usages pour quels enjeux ? Les tablettes : quels impacts sur le SI ? Table ronde : retours d’expérience d’Arval, Corsairfly, Axa et BNP Paribas Fortis Questions/réponses Rappel de l’offre mobilité OCTO : OCTO travaille sur la mobilité depuis 3 ans avec une équipe capable d’adresser les projets de l’idée au [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/petit-dejeuner-octo-tablettes-passons-a-lere-du-post-pc-le-26-janvier/' rel='bookmark' title='Petit-déjeuner OCTO – Tablettes : passons à l’ère du post-PC le 26 janvier'>Petit-déjeuner OCTO – Tablettes : passons à l’ère du post-PC le 26 janvier</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/cr-du-petit-dejeuner-organise-par-octo-et-quartet-fs-lanalyse-decisionnelle-en-temps-reel-convergence-entre-big-data-et-complex-event-processing/' rel='bookmark' title='CR du petit-déjeuner organisé par OCTO et Quartet FS « L’analyse décisionnelle en temps réel Convergence entre Big Data et Complex Event Processing »'>CR du petit-déjeuner organisé par OCTO et Quartet FS « L’analyse décisionnelle en temps réel Convergence entre Big Data et Complex Event Processing »</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p><strong>Agenda :</strong></p>
<ul>
<li>Rappel de l’offre mobilité OCTO</li>
<li>Les tablettes : quels usages pour quels enjeux ?</li>
<li>Les tablettes : quels impacts sur le SI ?</li>
<li>Table ronde : retours d’expérience d’Arval, Corsairfly, Axa et BNP Paribas Fortis</li>
<li>Questions/réponses</li>
</ul>
<p><a href="http://blog.octo.com/wp-content/uploads/2012/02/373204_245997012137811_1270198693_n1.jpg"><img class="aligncenter size-full wp-image-29858" title="373204_245997012137811_1270198693_n" src="http://blog.octo.com/wp-content/uploads/2012/02/373204_245997012137811_1270198693_n1.jpg" alt="" width="180" height="66" /></a></p>
<p><strong><span id="more-29855"></span>Rappel de l’offre mobilité OCTO : </strong></p>
<p>OCTO travaille sur la mobilité depuis 3 ans avec une équipe capable d’adresser les projets de l’idée au store (ergonomes, designers, développeurs, experts, architectes) qui permet d’accompagner au mieux ses clients.</p>
<p>OCTO met le focus sur deux types d’activités :</p>
<ul>
<li>Le conseil (réfléchir à l’évolution du SI des clients : quelle stratégie mobile ? pour quels usages ? quelle cible ? quels terminaux ? quels impacts sur le SI ?&#8230;)</li>
<li>La réalisation (les applications sont réalisées de bout en bout soit « clé en main », soit en coréalisation avec nos  clients ; et un réel travail sur l’intégration de ces applications dans le SI est mené (questions autour de la performance, comment sécuriser l’application, la distribuer ?&#8230;)</li>
</ul>
<p>En complément, OCTO propose à ses clients une solution pour distribuer leurs applications en interne, sous forme d’un store privé sur le Cloud : Appaloosa (lien).</p>
<p><strong>Les tablettes : quels usages pour quels enjeux ?</strong></p>
<p>Il s’est vendu cette année plus de tablettes (1,45 millions) que de PC de bureau (1,24 millions) pour les particuliers. 2012 laisse présager 3 millions de tablettes vendues, donc de se rapprocher des ventes de portables (4 millions en 2011)</p>
<p>Pourquoi cet engouement et notamment par les usagers en entreprise ?</p>
<p>Les tablettes présentent de nombreux avantages :</p>
<ul>
<li>Taille : &#8211; de 1kg ; -1 cm d’épaisseur donc faciles à emporter partout avec soi pour une réunion, un briefing, &#8230;</li>
<li>Praticité (facilement ouvertes, immédiatement allumées, ergonomiques et intuitives)</li>
<li>Autonomie de 10h</li>
<li>Prix attractif (– de 500€ neuf et 350€ / an) c&#8217;est moins cher pour une entreprise qu’un PC portable</li>
<li>Connectivité au réseau : 49% des tablettes sont équipées du wifi et de la 3G et peuvent donc être connectées en permanence avec le SI</li>
<li>Géo localisation (utile pour les commerciaux par exemple : quels sont mes clients proximité ?)</li>
<li>Stabilité des produits, soit moins d&#8217;activité de formation et de help desk</li>
</ul>
<p>En moyenne les utilisateurs utilisent une tablette plus de 90 minutes quotidiennement : dans le salon le soir, le matin au petit-déjeuner, lors de temps d’attente ou avant de dormir. Ce sont des moments privilégiés pour capter l’attention de l’utilisateur.</p>
<p>L’utilisateur type de la tablette est un homme, d’environ 35 ans, aisé et plutôt geek.</p>
<p>Un support qui capte l&#8217;attention, un utilisateur aisé, c&#8217;est une excellente opportunité pour capter le consommateur et pour diffuser ses services en B2C. Ainsi, en quelques mois la SNCF a écoulé plus de 100 000 billets par le biais de son application iPad, en valeur c&#8217;est 15% de ses ventes sur applications mobiles.</p>
<p>Le marché des particuliers est donc lancé mais on assiste également à une véritable percée sur le marché professionnel :</p>
<ul>
<li>60% des utilisateurs de tablette l’utilisent sur leur lieu de travail</li>
<li>pour 24% d’entre eux, les iPad sont fournis en entreprise</li>
<li>et 14% n’utilisent plus leur PC</li>
</ul>
<p>En effet le PC fait « écran » entre l’utilisateur et les autres, alors que l&#8217;on ne peut pas cacher derrière une tablette. Elle redéfinit les contours des usages en entreprise : elle devient un outil propice au partage, à la collaboration là où le PC se cantonne désormais à un outil personnel d’analyse, de réflexion et de production.</p>
<p>Quelques exemples d’utilisation en contexte professionnel :</p>
<ul>
<li>La borne interactive CLINIQUE pour les vendeuses : pédagogie avec le client, renforcement de l’engagement du client par rapport à la marque, collecte de données (ex : recommandations faites en magasin…)</li>
<li>Remplacement des caisses traditionnelles par des tablettes (aux US).</li>
<li>Impact dans le secteur médical également : visites pré/post opératoires facilitées (informations sur le patient, visualisation des IRM, radios… possibilité de partager avec le patient sur l’opération qui va être menée…)</li>
<li>Les tablettes deviennent utiles dans des contextes de maintenance de réseaux d’électricité, de canalisations (tablette facilement transportable, géolocalisation, facile de checker des problèmes, envoi de rapports immédiats…)</li>
<li>Indicateurs de pilotage (la plupart ont une application sur les stores)</li>
</ul>
<p>Pour tous ces usages la connexion au SI est primordiale.</p>
<p><strong>Les tablettes : quels impacts sur le SI ?</strong></p>
<p>La volonté du top management de moderniser les processus métiers existants et d’intégrer de nouveaux outils  aura un véritable impact sur la conception de nos SI. Regardons ce que changent les tablettes en comparaison des smartphones et des projets sur un PC traditionnel.</p>
<p>Les tablettes sont-elles équivalentes aux smartphones ?</p>
<ul>
<li>Ils sont identiques au point de vue matériel</li>
<li>Pas de nouveauté non plus concernant le développement d’applications</li>
</ul>
<p>La révolution se trouve en fait  dans le type de projets réalisés. Le périmètre métier n’est plus aussi restreint qu’avec les smartphones (les équipes sont plus larges, les durées de projet plus longues).</p>
<p>Un accent particulier doit être mis sur la qualité, le design et la conception. Une plus grande liberté est rendue possible grâce aux écrans plus grands des tablettes ; écrans conçus comme un mashup.</p>
<p>Il existe des  enjeux propres aux tablettes :</p>
<ul>
<li>Un enjeu de montée en charge (cumul de données)</li>
<li>Un enjeu de mise en cache</li>
<li>Une attention particulière doit être portée sur le fait de ne pas trop multiplier les services proposés et de les maîtriser</li>
</ul>
<p>En conclusion : on assiste à une montée en puissance de nouveaux canaux  (webapps HTML5, tablettes, smartphones, demain télés connectées, réfrigérateurs….) et il est impératif de garder la maîtrise du SI par rapport à tous ces nouveaux besoins.</p>
<p><strong> Table ronde : retours d’expérience de Arval, Corsairfly, Axa et BNP Paribas Fortis</strong></p>
<ul>
<li><strong>Question 1 : En quoi consiste le projet ?</strong></li>
</ul>
<p><span style="text-decoration: underline;">Arval : Sébastien Somchit, Head of Interactive Marketing</span></p>
<p>Le projet a été lancé mi 2011 et est parti d’une question posée : comment améliorer les relations commerciales ? L’iPad s’est présenté comme un élément efficace face aux clients (accès de qualité à une librairie master de docs références, de façon sécurisée et dans un univers brandé Arval).</p>
<p><span style="text-decoration: underline;">Fortis : Yvan Pirenne, Manager Internet &amp; Mobile Banking</span></p>
<p>L’application easy banking  a pour but la gestion quotidienne sur mobile des opérations bancaires..</p>
<p><span style="text-decoration: underline;">Axa : Guillaume Lemêle, Directeur Conseil &amp; Services Distribution Internet &amp; Marketing</span></p>
<p>L’application a pour but d’aider les commerciaux à la vente d’assurance (ou de banque) sur le terrain : documents facilement à portée de main, mise en gestion automatique.</p>
<p><span style="text-decoration: underline;">Corsairfly : Antoine De Kerviler, DSI</span></p>
<p>L’application doit répondre à un enjeu de reporting pour le personnel navigant. Il fallait 15 à 20 jours pour reporter un problème sur un vol. Le but est maintenant de remonter les informations en 24h et de les traiter grâce à une description catégorisée.</p>
<ul>
<li><strong>Question 2 : Pourquoi avez-vous tous choisi l’iPad ?</strong></li>
</ul>
<p><span style="text-decoration: underline;">Fortis </span>: Très bon marketing Apple (affinité au produit) et les critères de sécurité !</p>
<p><span style="text-decoration: underline;">Arval et Corsairfly</span> : des tests ont été menés et l’iPad a répondu aux attentes.</p>
<p><span style="text-decoration: underline;">Axa</span> : le parc applicatif est énorme et la communauté de développeurs est très importante.</p>
<ul>
<li><strong> Question 3 : Quels sont les enjeux de remplacement en interne des PC par les iPad ?</strong></li>
</ul>
<p><span style="text-decoration: underline;">Axa</span> : à terme un remplacement est envisagé (gain de temps et de praticité en épargnant sur les papiers, les temps de remplissage, de saisie post remplissage…)</p>
<p><span style="text-decoration: underline;">Fortis </span>: un remplacement de processus très lourds est envisagé (photocopies, tris, rangements…)</p>
<ul>
<li><strong>Question 4 : Les clients sont-ils satisfaits ? </strong></li>
</ul>
<p><span style="text-decoration: underline;">Axa</span> : Un plan B papier est toujours envisageable si le commercial se heurte à la réticence d’un client. Mais dans l’ensemble ils sont majoritairement ok pour jouer le jeu et franchir le pas du numérique.</p>
<p><span style="text-decoration: underline;">Fortis </span>: ils semblent satisfaits et les gains escomptés sont à mesurer dans deux types d’action : le conseil et les transactions.</p>
<ul>
<li><strong>Question 5 : Question de la sécurité des données clients ?</strong></li>
</ul>
<p><span style="text-decoration: underline;">Axa </span>: Les données collectées ne sont pas gardées sur l’iPad mais sur le Cloud et un outil de MDM est présent pour protéger ces données.</p>
<ul>
<li><strong>Question 6 : vie privée/vie public : vous n’avez pas peur que vos salariés jouent avec ?</strong></li>
</ul>
<p><span style="text-decoration: underline;">Corsairfly</span> : Une liberté assez grande est laissée aux employés pour jouer, tester et s’approprier l’iPad mais un focus est fait sur l’importance de respecter la loi et de faire attention aux vols (aéroport, personnel navigant).</p>
<ul>
<li><strong>Question 7 : Si l’on se place d’un point de vue RH, comment est géré et perçu l’intégration de ces outils en interne ?</strong></li>
</ul>
<p><span style="text-decoration: underline;">Arval</span> : l’iPad reste un élément statutaire à ce jour. Tout le monde n’en a pas dans l’entreprise mais ça ne durera surement pas à long terme.</p>
<p><span style="text-decoration: underline;">Axa </span>: l’iPad est un élément motivant pour les commerciaux : perçu comme un signe de reconnaissance. Mais c’est un outil dont la valeur est intégrée à l’entreprise et qui n’est en aucun cas personnel.</p>
<ul>
<li><strong>Question 8 : Question autour de la conduite du changement dans l’entreprise ?</strong></li>
</ul>
<p><span style="text-decoration: underline;">Arval</span> : c’est un projet pilote donc pour le moment les commerciaux sont formés  Il faudra ensuite s’adapter (question autour du bring your own device, systématisation… ?)</p>
<p><span style="text-decoration: underline;">Corsairfly</span> : il sera démontré individuellement que l’iPad est générateur de valeur</p>
<p><span style="text-decoration: underline;">Fortis</span> : il y aura des changements au niveau réseau. Les employés sont les meilleurs ambassadeurs de ce produit (mais il est essentiel de le maîtriser avant d’en être capable donc un effort sur la formation doit être fait)</p>
<p><span style="text-decoration: underline;">Axa</span> : il y a 4500 commerciaux et tout va tourner autour de l’iPad. Les applications doivent donc être faciles d’utilisation ; permettant ainsi d’éviter des formations longues, nombreuses et coûteuses.</p>
<ul>
<li><strong>Question 9 : Combien coûte un tel projet ?</strong></li>
</ul>
<p><span style="text-decoration: underline;">AXA</span> : plusieurs millions d&#8217;euros.</p>
<p><span style="text-decoration: underline;">Fortis</span> : Le gros du budget est parti dans couche de services, interaction avec le SI.</p>
<p><span style="text-decoration: underline;">Corsairfly</span> : 60K tout compris pour l&#8217;application métier + 350 € par an de TCO pour l’iPad</p>
<ul>
<li><strong>Question 10 : Quels sont les défauts de l’iPad ?</strong></li>
</ul>
<p><span style="text-decoration: underline;">Arval</span> : C’est un outil qui n’est pas conçu à l&#8217;origine pour du B2B. Peu de productivité et de compatibilité avec Office. On doit adapter les documents à la tablette.</p>
<p><span style="text-decoration: underline;">Corsairfly</span> : Les processus d&#8217;Apple sont compliqués : difficile d&#8217;avoir un contrat, difficulté liée au déploiement, aux numéros de carte de crédit, etc.</p>
<p><span style="text-decoration: underline;">Fortis</span> : l’inaccessibilité et la rigidité d’Apple. Nous avons eu de nombreux problèmes pour obtenir une licence, une application en accord avec nos brief et sans beaucoup de possibilités pour interagir.</p>
<ul>
<li><strong>Question 11 : Quels sont les conseils de chacun pour bien mener de tels projets ?</strong></li>
</ul>
<p><span style="text-decoration: underline;">Fortis</span> : toujours garder l’œil sur le produit final.</p>
<p><span style="text-decoration: underline;">Arval</span> : avoir une vision claire de l’objectif à atteindre et intégrer toutes les fonctions clés au projet (IT notamment pour les questions sécurité, synchronisation, data… et le marketing).</p>
<p><span style="text-decoration: underline;">Corsair</span><span>f</span><span style="text-decoration: underline;">ly</span> : Tester en conditions réelles ! Ce qui permettra un REX des personnes concernées.</p>
<p><span style="text-decoration: underline;">Axa</span> : c’est une opportunité pour les DSI de porter l’innovation. Il ne faut pas avoir peur de se tromper, le projet sera enrichi avec les retours d’usage.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=29855" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/petit-dejeuner-octo-tablettes-passons-a-lere-du-post-pc-le-26-janvier/' rel='bookmark' title='Petit-déjeuner OCTO – Tablettes : passons à l’ère du post-PC le 26 janvier'>Petit-déjeuner OCTO – Tablettes : passons à l’ère du post-PC le 26 janvier</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/cr-du-petit-dejeuner-organise-par-octo-et-quartet-fs-lanalyse-decisionnelle-en-temps-reel-convergence-entre-big-data-et-complex-event-processing/' rel='bookmark' title='CR du petit-déjeuner organisé par OCTO et Quartet FS « L’analyse décisionnelle en temps réel Convergence entre Big Data et Complex Event Processing »'>CR du petit-déjeuner organisé par OCTO et Quartet FS « L’analyse décisionnelle en temps réel Convergence entre Big Data et Complex Event Processing »</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/cr-du-petit-dejeuner-octo-tablettes-passons-a-lere-post-pc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Data Grid or nosql? same, same but different…</title>
		<link>http://blog.octo.com/data-grid-or-nosql-same-same-but-different-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=data-grid-or-nosql-same-same-but-different-2</link>
		<comments>http://blog.octo.com/data-grid-or-nosql-same-same-but-different-2/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 08:05:00 +0000</pubDate>
		<dc:creator>Olivier Mallassi</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=29582</guid>
		<description><![CDATA[Depuis trois ans maintenant, NoSQL remet en question le monde centralisé des RDBMS. Les espaces de stockage distribués ne sont pour autant pas nouveaux et les banques, les plateformes de jeux utilisent des &#171;&#160;grilles de données&#160;&#187; pour adresser leurs enjeux de débit et de latence. Quels sont les points communs? les principales différences entre les [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/vers-des-api-haut-niveau-pour-java-et-nosql-avec-spring-data/' rel='bookmark' title='Vers des API haut niveau pour Java et NoSQL avec Spring Data'>Vers des API haut niveau pour Java et NoSQL avec Spring Data</a></li>
<li><a href='http://blog.octo.com/petit-dejeuner-nosql-l%e2%80%99extreme-transaction-processing-devient-une-realite-2/' rel='bookmark' title='Petit-déjeuner NoSQL : &laquo;&nbsp;l’Extreme Transaction Processing&nbsp;&raquo; devient une réalité'>Petit-déjeuner NoSQL : &laquo;&nbsp;l’Extreme Transaction Processing&nbsp;&raquo; devient une réalité</a></li>
<li><a href='http://blog.octo.com/video-du-petit-dejeuner-nosql-l%e2%80%99extreme-transaction-processing-devient-une-realite/' rel='bookmark' title='Vidéo du petit-déjeuner NoSQL : &laquo;&nbsp;l’Extreme Transaction Processing&nbsp;&raquo; devient une réalité'>Vidéo du petit-déjeuner NoSQL : &laquo;&nbsp;l’Extreme Transaction Processing&nbsp;&raquo; devient une réalité</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p>Depuis trois ans maintenant, NoSQL remet en question le monde centralisé des RDBMS. Les espaces de stockage distribués ne sont pour autant pas nouveaux et les banques, les plateformes de jeux utilisent des &laquo;&nbsp;grilles de données&nbsp;&raquo; pour adresser leurs enjeux de débit et de latence. </p>
<p>Quels sont les points communs? les principales différences entre les univers NoSQL et &laquo;&nbsp;data grids&nbsp;&raquo;? </p>
<p><strong><a href="http://blog.octo.com/en/?p=29587">Lire la suite&#8230;</a></strong></p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=29582" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/vers-des-api-haut-niveau-pour-java-et-nosql-avec-spring-data/' rel='bookmark' title='Vers des API haut niveau pour Java et NoSQL avec Spring Data'>Vers des API haut niveau pour Java et NoSQL avec Spring Data</a></li>
<li><a href='http://blog.octo.com/petit-dejeuner-nosql-l%e2%80%99extreme-transaction-processing-devient-une-realite-2/' rel='bookmark' title='Petit-déjeuner NoSQL : &laquo;&nbsp;l’Extreme Transaction Processing&nbsp;&raquo; devient une réalité'>Petit-déjeuner NoSQL : &laquo;&nbsp;l’Extreme Transaction Processing&nbsp;&raquo; devient une réalité</a></li>
<li><a href='http://blog.octo.com/video-du-petit-dejeuner-nosql-l%e2%80%99extreme-transaction-processing-devient-une-realite/' rel='bookmark' title='Vidéo du petit-déjeuner NoSQL : &laquo;&nbsp;l’Extreme Transaction Processing&nbsp;&raquo; devient une réalité'>Vidéo du petit-déjeuner NoSQL : &laquo;&nbsp;l’Extreme Transaction Processing&nbsp;&raquo; devient une réalité</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/data-grid-or-nosql-same-same-but-different-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tous les navigateurs acceptent HTML5 et CSS3</title>
		<link>http://blog.octo.com/tous-les-navigateurs-acceptent-html5-et-css3/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tous-les-navigateurs-acceptent-html5-et-css3</link>
		<comments>http://blog.octo.com/tous-les-navigateurs-acceptent-html5-et-css3/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 15:36:55 +0000</pubDate>
		<dc:creator>Mickaël Morier</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=29488</guid>
		<description><![CDATA[Tous les navigateurs acceptent HTML5 et CSS3 mais tous ne comprennent pas leurs nouvelles fonctionnalités. L&#8217;usage de nouveaux attributs HTML5 ou de nouvelles propriétés CSS3 ne bloquera pas votre navigateur, ce dernier les ignora tout simplement. Un avantage indéniable qui nous permet d&#8217;utiliser dès aujourd&#8217;hui HTML5 et CSS3 même si certains de nos utilisateurs ne [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/osez-renoncer-aux-vieux-navigateurs/' rel='bookmark' title='Osez renoncer aux vieux navigateurs'>Osez renoncer aux vieux navigateurs</a></li>
<li><a href='http://blog.octo.com/octo-a-paris-web-2010-pour-un-atelier-html5/' rel='bookmark' title='OCTO à Paris Web 2010 pour un atelier HTML5'>OCTO à Paris Web 2010 pour un atelier HTML5</a></li>
<li><a href='http://blog.octo.com/html5-offline-et-securite/' rel='bookmark' title='HTML5, offline et sécurité'>HTML5, offline et sécurité</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p>Tous les navigateurs acceptent HTML5 et CSS3 mais tous ne comprennent pas leurs nouvelles fonctionnalités. L&#8217;usage de nouveaux attributs HTML5 ou de nouvelles propriétés CSS3 ne bloquera pas votre navigateur, ce dernier les ignora tout simplement. Un avantage indéniable qui nous permet d&#8217;utiliser dès aujourd&#8217;hui HTML5 et CSS3 même si certains de nos utilisateurs ne disposent pas encore de navigateurs les supportant. Comme je le précisais dans l&#8217;article <a title="Osez renconcer aux vieux navigateurs" href="http://blog.octo.com/osez-renoncer-aux-vieux-navigateurs/">Osez renoncer aux vieux navigateurs</a>, il ne faut pas avoir peur d&#8217;utiliser des fonctionnalités HTML5 et CSS3 car des comportements dégradés natifs existent. Quels sont les comportements dégradés natifs acceptables ? Comment profiter d&#8217;une fonctionnalité HTML5 ou CSS3 si son comportement dégradé n&#8217;est pas acceptable ? Comment pallier l&#8217;absence de support des nouvelles API JavaScript si le navigateur ne les possède pas ?</p>
<p><span id="more-29488"></span></p>
<h2>Les comportements dégradés natifs</h2>
<p>Des comportements dégradés existent nativement pour la majorité des nouveautés HTML5 et CSS3 lorsque celles-ci ne sont pas supportées par le navigateur. Prenons deux exemples pour illustrer comment les vieux navigateurs se comportent.</p>
<h3>HTML5</h3>
<p>Certaines fonctionnalités HTML5 sont des évolutions de fonctionnalités existantes, c&#8217;est notamment le cas pour les formulaires. Prenons l&#8217;exemple des nouveaux types de champs de saisie qui permettent de spécifier un champ de saisie en tant que champ de saisie e-mail, téléphone, date, etc. Cette spécification permet d&#8217;avoir un clavier spécifique sur les mobiles et une validation adéquate coté navigateur. Ci-dessous un exemple d&#8217;un champ de saisie de type email sur Firefox pour Android 4.</p>
<p style="text-align: center; margin-bottom:1em"><img class="wp-image-29545  aligncenter" title="Validation coté client et clavier adapté à un champ de type email sur Firefox Android" src="http://blog.octo.com/wp-content/uploads/2012/01/input-email-firefox-android.png" alt="Validation coté client et clavier adapté sur Firefox Android" width="269" height="251" /></p>
<p>Code original :</p>

<div class="wp_codebox"><table><tr id="p2948810"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p29488code10"><pre class="html" style="font-family:monospace;">&lt;input type=&quot;email&quot;&gt;</pre></td></tr></table></div>

<p>Code compris par un navigateur ne supportant pas les formulaires HTML5 :</p>

<div class="wp_codebox"><table><tr id="p2948811"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p29488code11"><pre class="html" style="font-family:monospace;">&lt;input type=&quot;text&quot;&gt;</pre></td></tr></table></div>

<p>Si le navigateur ne comprends pas le type (email dans notre cas), le type par défaut utilisé sera text. Votre formulaire sera donc totalement fonctionnel sur un ancien navigateur, votre utilisateur ne bénéficiera pas d&#8217;un clavier spécifique ni de la validation coté client mais il pourra soumettre le formulaire. Tout le monde peut utiliser votre formulaire et vos utilisateurs qui utilisent un navigateur récent bénéficieront de fonctionnalités intéressantes sans la moindre charge de développement.</p>
<h3>CSS3</h3>
<p>On bénéficie également de ces comportements natifs sur les CSS3.</p>
<p style="padding: 5px; background: #ddd;margin-bottom:1em; border-radius: 5px; border: 2px solid #777;">Si vous voyez les coins arrondis, vous êtes un utilisateur génial qui utilise un navigateur récent. Sinon mettez à jour votre navigateur.</p>
<p>Style original :</p>

<div class="wp_codebox"><table><tr id="p2948812"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p29488code12"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.boite-arrondie</span> <span style="color: #00AA00;">&#123;</span>
  border-radius<span style="color: #00AA00;">:</span> <span style="color: #933;">5px</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">5px</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#ddd</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #933;">2px</span> <span style="color: #993333;">solid</span> <span style="color: #cc00cc;">#777</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p>Style utilisé par un navigateur ne supportant pas la propriété CSS3 border-radius :</p>

<div class="wp_codebox"><table><tr id="p2948813"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p29488code13"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.boite-arrondie</span> <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">5px</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#ddd</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #933;">2px</span> <span style="color: #993333;">solid</span> <span style="color: #cc00cc;">#777</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p>Si une propriété n&#8217;est pas comprise, elle est tout simplement ignorée par le navigateur et les coins sont rectangulaires. Sans les CSS3, il nous faudrait 1 à 6 images afin de reproduire ce rendu, ce qui en terme de performance n&#8217;est pas anodin ni en terme de complexité de code ajouté. Est-ce inacceptable de se priver des coins arrondis sur les anciens navigateurs ? Est-ce pertinent de passer du temps et augmenter la complexité du code ? Il est important de se poser ces questions pour les nouvelles fonctionnalités CSS3 qui vous intéressent.</p>
<p>Ce comportement est notamment très utilisé par les navigateurs qui préfixent les propriétés lorsque l&#8217;implémentation n&#8217;est pas finale. L&#8217;utilisation des préfixes sur certaines propriétés n&#8217;est pas utile lorsque les navigateurs supportent la propriété sans préfixe depuis plusieurs versions. Des sites comme <a href="http://www.caniuse.com">Can I Use</a> et <a href="http://www.css3generator.com">CSS3 Generator</a> vous permettront de voir si les préfixes sont indispensables. Ils sont inutiles pour <a href="http://www.caniuse.com/#feat=border-radius">border-radius</a> mais impératifs pour les <a href="http://www.caniuse.com/#feat=css-gradients">gradients</a> :</p>

<div class="wp_codebox"><table><tr id="p2948814"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p29488code14"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.fond-degrade</span> <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> -moz-linear-gradient<span style="color: #00AA00;">&#40;</span><span style="color: #000000; font-weight: bold;">top</span><span style="color: #00AA00;">,</span> <span style="color: #cc00cc;">#1e5799</span> <span style="color: #933;">0%</span><span style="color: #00AA00;">,</span> <span style="color: #cc00cc;">#7db9e8</span> <span style="color: #933;">100%</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> -webkit-linear-gradient<span style="color: #00AA00;">&#40;</span><span style="color: #000000; font-weight: bold;">top</span><span style="color: #00AA00;">,</span> <span style="color: #cc00cc;">#1e5799</span> <span style="color: #933;">0%</span><span style="color: #00AA00;">,</span><span style="color: #cc00cc;">#7db9e8</span> <span style="color: #933;">100%</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> -o-linear-gradient<span style="color: #00AA00;">&#40;</span><span style="color: #000000; font-weight: bold;">top</span><span style="color: #00AA00;">,</span> <span style="color: #cc00cc;">#1e5799</span> <span style="color: #933;">0%</span><span style="color: #00AA00;">,</span><span style="color: #cc00cc;">#7db9e8</span> <span style="color: #933;">100%</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> -ms-linear-gradient<span style="color: #00AA00;">&#40;</span><span style="color: #000000; font-weight: bold;">top</span><span style="color: #00AA00;">,</span> <span style="color: #cc00cc;">#1e5799</span> <span style="color: #933;">0%</span><span style="color: #00AA00;">,</span><span style="color: #cc00cc;">#7db9e8</span> <span style="color: #933;">100%</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> linear-gradient<span style="color: #00AA00;">&#40;</span><span style="color: #000000; font-weight: bold;">top</span><span style="color: #00AA00;">,</span> <span style="color: #cc00cc;">#1e5799</span> <span style="color: #933;">0%</span><span style="color: #00AA00;">,</span><span style="color: #cc00cc;">#7db9e8</span> <span style="color: #933;">100%</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<h2>Et si ce comportement dégradé n&#8217;est pas acceptable ?</h2>
<p>Il peut arriver que le comportement dégradé ne soit pas acceptable et qu&#8217;il faille envisager une autre solution. Une approche pourrait être de s&#8217;interdire d&#8217;utiliser une nouvelle fonctionnalité car 30% des navigateurs de vos utilisateurs ne la supportent pas. Une mauvaise approche car on nivelle par le bas et on se prive de fonctionnalités intéressantes pour l&#8217;utilisateur et le développeur. L&#8217;utilisateur profite d&#8217;une meilleure expérience utilisateur. Le développeur simplifie et réduit son code car une partie est implémentée par le navigateur.</p>
<h3>L&#8217;approche <em>Graceful degradation</em></h3>
<p>L&#8217;approche <em>Graceful degradation</em> consiste à profiter des nouvelles fonctionnalités et proposer une solution de contournement lorsqu&#8217;elles ne sont pas disponibles. Pour cela, la librairie JavaScript <a title="Modernizr" href="http://www.modernizr.com" target="_blank">Modernizr</a> expose de nombreuses méthodes permettant de détecter le support d&#8217;une fonctionnalité  HTML5 ou CSS3. On peut ainsi utiliser un <em>Polyfill</em> ou encore, si on décide de ne pas implémenter du tout cette fonctionnalité dans ce cas, alerter l&#8217;utilisateur que la fonctionnalité n’est pas disponible. Un <em>Polyfill</em> est un plugin qui fournit une fonctionnalité que le navigateur devrait posséder nativement. Une longue liste de <em>Polyfill</em> est référencée sur <a title="HTML5 Cross Browser Polyfills" href="https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills" target="_blank">GitHub par Modernizr</a>. Ci-dessous un exemple de champ de saisie textuel avec le nouvel attribut placeholder (texte d&#8217;aide dans le champ de saisie lorsque celui-ci est vide).</p>
<p style="text-align: center;">
<input placeholder="exemple de placeholder" /></p>
<p>Code HTML :</p>

<div class="wp_codebox"><table><tr id="p2948815"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p29488code15"><pre class="html" style="font-family:monospace;">&lt;input type=&quot;text&quot; placeholder=&quot;exemple de placeholder&quot; /&gt;</pre></td></tr></table></div>

<p>Code JavaScript permettant de gérer le non support de l&#8217;attribut placeholder :</p>

<div class="wp_codebox"><table><tr id="p2948816"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p29488code16"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// si le navigateur ne supporte pas placeholder</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>Modernizr.<span style="color: #660066;">input</span>.<span style="color: #660066;">placeholder</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #006600; font-style: italic;">// ajout du comportement avec un plugin jQuery</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'input[placeholder]'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">placeholder</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>L&#8217;avantage de cette technique est d&#8217;isoler le code lié à la solution de contournement. Ceci nous permettra de le supprimer sans crainte lorsque vos utilisateurs n&#8217;utiliseront plus de navigateurs ne supportant pas cet attribut.</p>
<h3>L&#8217;utilisation de la cascade pour les CSS</h3>
<p>En CSS3, certaines propriétés ont de nouvelles valeurs possibles. Il est alors possible de définir deux fois une propriété avec deux valeurs différentes. Prenons par exemple une boite avec un fond semi-transparent :</p>
<p style="background-color: #ff0000;background-color: rgba(0,255,0,0.5);margin-bottom: 1em;">Si votre navigateur est récent, le fond de ce paragraphe est vert et transparent. Sinon il est rouge vif.</p>

<div class="wp_codebox"><table><tr id="p2948817"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p29488code17"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.fond-avec-transparence</span> <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#ff0000</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> rgba<span style="color: #00AA00;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">,</span><span style="color: #cc66cc;">255</span><span style="color: #00AA00;">,</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">,</span><span style="color: #cc66cc;">0.5</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p>Les navigateurs ne supportant pas CSS3 ne comprendront que la première valeur donc le fond sera rouge. Quant aux navigateurs supportant CSS3, ils comprendront les deux valeurs. Ils appliqueront donc la dernière valeur rencontrée pour la propriété ce qui nous donnera un fond vert avec une transparence de 50%.</p>
<h2>Des comportements dégradés pour les nouvelles APIs ?</h2>
<p>HTML5 apporte de nouvelles APIs JavaScript (Web Storage, Geolocation, etc.). Ces APIs sont directement utilisables sans import puisque exposées par le navigateur. Des erreurs JavaScript seront donc levées si vous les utilisez alors que votre navigateur ne les possède pas. Aucun comportement dégradé n&#8217;existe par défaut, c&#8217;est à vous de tester la disponibilité de ces APIs avant de les utiliser. Comme pour les balises HTML5 ou le CSS3, Modernizr permet de tester facilement la disponibilité de ces nouvelles API pour proposer une solution alternative ou non. Un exemple ci-dessous avec l&#8217;API localStorage :</p>

<div class="wp_codebox"><table><tr id="p2948818"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p29488code18"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// si le navigateur supporte le localStorage</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>Modernizr.<span style="color: #660066;">localstorage</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #006600; font-style: italic;">// stockage d'une valeur dans le Web Storage local</span>
  localStorage.<span style="color: #660066;">setItem</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;clé&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;valeur&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h2>Aucune raison de ne plus utiliser HTML5 et CSS3</h2>
<p>Des solutions existent pour pallier l&#8217;absence de support HTML5, parfois simple et fiable, parfois trop complexe ou trop impactant sur les performances du client. C&#8217;est un choix à prendre sur la solution de contournement lorsque vous décidez d&#8217;utiliser HTML5 et CSS3. Le site <a href="http://html5please.us">HTML5 Please</a> pourra vous aider à prendre ces décisions en vous donnant le support des fonctionnalités et en vous conseillant sur leur utilisation. D&#8217;après les statistiques de <a href="http://gs.statcounter.com/#browser_version-FR-monthly-201201-201201-bar" target="_blank">StatCounter du mois de janvier</a>, près de 70% des français utilisent un navigateur récent qui supporte relativement bien HTML5 et CSS3. Profitez des nouvelles fonctionnalités HTML5 et CSS3, des comportements dégradés natifs et ne prévoyez de solution alternative que si c&#8217;est indispensable.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=29488" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/osez-renoncer-aux-vieux-navigateurs/' rel='bookmark' title='Osez renoncer aux vieux navigateurs'>Osez renoncer aux vieux navigateurs</a></li>
<li><a href='http://blog.octo.com/octo-a-paris-web-2010-pour-un-atelier-html5/' rel='bookmark' title='OCTO à Paris Web 2010 pour un atelier HTML5'>OCTO à Paris Web 2010 pour un atelier HTML5</a></li>
<li><a href='http://blog.octo.com/html5-offline-et-securite/' rel='bookmark' title='HTML5, offline et sécurité'>HTML5, offline et sécurité</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/tous-les-navigateurs-acceptent-html5-et-css3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Une base de données purement fonctionnelle</title>
		<link>http://blog.octo.com/une-base-de-donnees-purement-fonctionnelle-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=une-base-de-donnees-purement-fonctionnelle-2</link>
		<comments>http://blog.octo.com/une-base-de-donnees-purement-fonctionnelle-2/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 09:24:44 +0000</pubDate>
		<dc:creator>Sebastian de Bellefon</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[clustering]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[programmation fonctionnelle]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=29640</guid>
		<description><![CDATA[Le modèle relationnel est né à une époque où l&#8217;espace était rare, et fut donc conçu pour minimiser le niveau de redondance des données: il était plus économique de stocker une indirection vers une chaine de caractères que de stocker cette chaine deux fois. Aujourd&#8217;hui, cette contrainte d&#8217;espace ne tient plus. On achète un Teraoctet [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/outiller-un-audit-de-base-de-donnees/' rel='bookmark' title='Outiller un audit de base de données'>Outiller un audit de base de données</a></li>
<li><a href='http://blog.octo.com/industrialisation-des-developpements-automatisez-votre-base-de-donnees/' rel='bookmark' title='Industrialisation des développements : automatisez votre base de données'>Industrialisation des développements : automatisez votre base de données</a></li>
<li><a href='http://blog.octo.com/des-alternatives-aux-bases-de-donnees-relationnelles%e2%80%a6/' rel='bookmark' title='Des alternatives aux bases de données relationnelles…'>Des alternatives aux bases de données relationnelles…</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p><a href="http://blog.octo.com/wp-content/uploads/2012/01/PH33302.jpg"><img class="size-medium wp-image-29629" title="IBM 3330 Merlin" src="http://blog.octo.com/wp-content/uploads/2012/01/PH33302-300x169.jpg" alt="" width="300" height="169" /></a></p>
<p>Le modèle relationnel est né à une époque où l&#8217;espace était rare, et fut donc conçu pour minimiser le niveau de redondance des données: il était plus économique de stocker une indirection vers une chaine de caractères que de stocker cette chaine deux fois.<br />
Aujourd&#8217;hui, cette contrainte d&#8217;espace ne tient plus. On achète un Teraoctet pour 100 dollars, la RAM est abondante, et les disques flash aux performances élevées vont bientôt rejoindre le prix des disques durs rotatifs.</p>
<p>Deux limitations fondamentales du stockage ont donc disparu: le coût de la redondance et le coût de la non-localité pour le traitement de structures de données complexes. Il est maintenant possible de concevoir de nouvelles bases de données plus riches et plus sûres.</p>
<p><span id="more-29640"></span></p>
<blockquote><p>Update in place is a poison apple.<br />
- Jim Gray, Turing Award 1998</p></blockquote>
<p>Le choix d&#8217;une base de données mutables n&#8217;est plus optimal. Les bases de données purement fonctionnelles n&#8217;existent pas encore, mais je pense que les utilisateurs de bases de données auraient déjà intérêt à envisager le stockage read-only et le versioning manuel.</p>
<p>Que veut-on dire par &laquo;&nbsp;base de données mutables&nbsp;&raquo;? Il s&#8217;agit d&#8217;une BDD dans laquelle chaque donnée peut être modifiée à tout moment, et dans laquelle on ne garde pas l&#8217;historique de ses modifications. Les modifications sont faites &laquo;&nbsp;sur place&nbsp;&raquo;, de manière destructive.</p>
<p>Que veut-on dire par &laquo;&nbsp;base de données purement fonctionnelle&nbsp;&raquo;? Il s&#8217;agirait d&#8217;une BDD dans laquelle chaque structure de donnée serait <a href="http://en.wikipedia.org/wiki/Purely_functional">purement fonctionnelle</a>, c&#8217;est-à-dire immuable par défaut et ne ferait référence qu&#8217;à des données immuables. Pour prendre une analogie programmatique, cette BDD serait une interface vers des snapshots versionnés. Une sorte de Git!</p>
<p><strong>Vers une implémentation plus adaptée</strong></p>
<p>Les données d&#8217;une BDD méritent un traitement différencié en fonction de leurs patterns d&#8217;usage. Pourquoi par exemple, chez un grand opérateur téléphonique, devrait-on utiliser le même objet &laquo;&nbsp;table&nbsp;&raquo; pour référencer les monnaies, gérer la liste des clients et la liste des appels? Examinons leurs particularités. A partir de ces trois exemples simplifiés nous allons inférer plusieurs mécanismes fondamentaux d&#8217;une base de données purement fonctionnelle.</p>
<p>La liste de référence des monnaies est peu volumineuse. Elle est mise à jour quelques fois par an, tout au plus.<br />
La liste des clients de l&#8217;opérateur est moyennement volumineuse. Elle est mise à jour quotidiennement, avec quelques ajouts, suppressions et modifications aléatoires.<br />
La liste des appels est très volumineuse. Elle est mise à jour quotidiennement, mais seulement en insertion.</p>
<p>Nous avons donc au moins trois cas d&#8217;usage très différents. Or dans une BDD classique, ces trois données sont stockées de la même manière, c&#8217;est-à-dire sous la forme de listes mutables et indexées.<br />
Beaucoup d&#8217;effort a été investi pour améliorer les performances de ces tables avec le matériel donné, mais les solutions proposées sont encore très génériques.</p>
<p>Revenons à nos trois données. Il est possible de les implémenter autrement, en faisant appel à trois types d&#8217;objets:</p>
<ul>
<li>Des listes immuables (de type homogène, et implémentées par exemple par des hashtables sur la clef primaire)</li>
<li>Des deltas sur ces listes</li>
<li>Quelques métadonnées peu volumineuses qui serviront à articuler l&#8217;ensemble.</li>
</ul>
<p>La table des monnaies est l&#8217;exemple typique d&#8217;une liste simple et immuable. La liste d&#8217;aujourd&#8217;hui s&#8217;appelle la &#8216;v1&#8242;. Si demain une union monétaire est créée en Amérique du sud, nous créerons une copie modifiée qui s&#8217;appellera la &#8216;v2&#8242;. Pour des raisons de performance, la v1 et la v2 devront être copiées intégralement sur tous les noeuds de la base de données. La performance en update de cette implémentation est médiocre, mais toutes les lectures pourront être faites sans aucun mécanisme de synchronisation.</p>
<p>La table des clients est un peu plus volatile. Tous les jours quelques clients arrivent ou s&#8217;en vont, et quelques clients existants peuvent modifier leur adresse postale. Nous pouvons stocker la liste des clients comme une liste immuable &#8216;v1&#8242;, accompagnée par une séquence chronologique de deltas. D&#8217;ici à quelques mois, l&#8217;accumulation des deltas commencera à affecter la vitesse de lecture: il faudra alors matérialiser la liste, la nommer &#8216;v287&#8242; et archiver la v1. Dans le cas d&#8217;une machine seule, nous retrouvons presque exactement la manière dont Git stocke son historique. Dans le cas d&#8217;un cluster, il est bien sûr préférable de partitionner/sharder cette liste sur tous les nœuds.<br />
Selon quelle politique va-t-on vouloir archiver une version, la compresser ou la supprimer? Et selon quelles modalités? Chaque utilisateur doit prendre cette décision en fonction de ses besoins métier. Il est agréable, en tout cas, de remarquer que le <a href="http://searchstorage.techtarget.com/definition/data-life-cycle-management">Data Lifecycle Management</a> est offert sur un plateau par les BDD fonctionnelles.</p>
<p>La table des appels téléphoniques est différente. Chaque jour elle reçoit des milliers de nouvelles lignes, lesquelles sont parfaitement indépendantes des lignes antérieures. Cette liste est segmentable par journée, et chacun des segments quotidiens est une liste immuable. Nous devrions en plus partitionner chaque segment de manière à coller à la liste des clients: l&#8217;ID du client devient alors la clef de partitionnement des appels téléphoniques.</p>
<p>En résumé, à travers ces mécanismes de mise à jour, on accepte de consommer un peu plus d&#8217;espace disque, et de réduire la localité des données (car une nouvelle version ne sera probablement pas écrite à côté de l&#8217;ancienne). Tout cela pour garder une information plus riche.<br />
Remarquez bien que ces trois idées de versioning s&#8217;appliquent aussi bien à l&#8217;implémentation d&#8217;une nouvelle base de données qu&#8217;à une implémentation manuelle, basée sur les outils d&#8217;aujourd&#8217;hui.</p>
<p><strong>Conséquences</strong></p>
<p>Voilà pour les bases. Observons maintenant les conséquences positives de ces nouveaux choix d&#8217;implémentation.</p>
<p>Il devient possible par exemple:</p>
<ul>
<li>d&#8217;attribuer un identifiant unique à une version complète de la BDD, donc d&#8217;exécuter des requêtes de lecture sur une version du passé</li>
<li>d&#8217;effectuer un rollback à tout moment, en reprenant une ancienne version. Pas besoin d&#8217;attendre des heures pour recharger!</li>
<li>de paralléliser le requêtage à l&#8217;infini (car les listes immuables et les deltas sont triviaux à copier)</li>
<li>de hasher cryptographiquement le contenu (à la Git), pour un usage légal ou contractuel</li>
<li>de connaitre la séquence des processus qui ont fait évoluer la base ou une ligne en particulier</li>
<li>de diminuer le coût du backup et du Plan de Reprise d&#8217;Activité. Réaliser trois copies vers des disques sur étagère coûte peu (car les deltas sont copiables via des écritures non-aléatoires, donc rapides, et sans consommer de CPU)</li>
<li>de cacher le résultat de toute sorte de traitements, à la manière de vues matérialisées (filtrage, agrégation..)</li>
<li>de stocker dans la même BDD des objets classiques relationnels, et des objets plus variés (key-value store..)</li>
</ul>
<p>En l&#8217;absence d&#8217; &laquo;&nbsp;état global&nbsp;&raquo;, nous offrons aux processus d&#8217;alimentation et d&#8217;interrogation de la BDD tous les bénéfices de la programmation purement fonctionnelle. Ces processus deviennent <a href="http://fr.wikipedia.org/wiki/Transparence_r%C3%A9f%C3%A9rentielle">référentiellement transparents</a> (donc sans effet de bord), d&#8217;où une meilleure lisibilité pour les équipes de développement et de maintenance, et une diminution du risque d&#8217;erreur. De plus, nous avons la garantie que l&#8217;ordre d&#8217;exécution des processus n&#8217;a plus aucune importance.<br />
La qualité de transparence référentielle nous aide aussi à implémenter proprement le pattern <a href="http://en.wikipedia.org/wiki/Command-query_separation">Command-Query Separation</a> (CQS), qui conseille de séparer les processus de requêtage des processus d&#8217;écriture. Les nombreux &laquo;&nbsp;lecteurs&nbsp;&raquo; opèrent sur des données immuables, éventuellement disséminées dans un cluster, alors que le processus &laquo;&nbsp;modificateur&nbsp;&raquo; agit sur les données de référence pour leurs ajouter des deltas.</p>
<p>Quelles sont les contreparties? Il devient plus couteux de réaliser de nombreuses modifications aléatoires sur une grande table. Une BDD purement fonctionnelle ne serait donc pas adaptée à la table d&#8217;inventaire d&#8217;Amazon, même si l&#8217;usage de disques SSD permettrait d&#8217;annuler une grande partie de la dégradation de performance.</p>
<p>Remarquez encore une fois qu&#8217;une grande partie de ces bénéfices/contreparties s&#8217;applique telle quelle dans le cas d&#8217;un versioning manuel.</p>
<p><strong>Conclusion</strong></p>
<p>Le choix historique d&#8217;implémenter les BDD à l&#8217;aide de données mutables n&#8217;est plus optimal. Le besoin de protéger les mises à jour dans un environnement concurrent nuit à la scalabilité, et l&#8217;absence d&#8217;historique et de points de retour rend toute manipulation périlleuse.<br />
Une base de données purement fonctionnelle serait intrinsèquement plus sûre, et offrirait une meilleure scalabilité pour de nombreuses applications. En outre, ses besoins seraient tout à fait compatibles avec les bénéfices des disques flash.<br />
Mon pari est qu&#8217;une telle base de données va réellement exister dans les années à venir. Le monde académique en parle depuis les années 80; voir notamment la thèse de Phil Trinder qui avait déjà identifié les conséquences de la transparence référentielle dans les bases de données, puis ouvert la voie vers le requêtage monadique (LINQ) avec ses collègues de l&#8217;université de Glasgow. Il ne lui manquait que du matériel plus performant.<br />
Aujourd&#8217;hui, la startup <a href="http://www.rethinkdb.com">RethinkDB</a> et la base in-memory <a href="http://www.sap.com/hana/index.epx">HANA</a> utilisent déjà une partie de cette technologie et atteignent de belles performances.<br />
En attendant l&#8217;arrivée et la maturation de ces nouveaux outils, il est déjà possible d&#8217;enrichir manuellement nos BDD pour bénéficier, en partie, de leurs avantages.</p>
<p><strong>Bibliographie</strong></p>
<p><a href="http://www-03.ibm.com/ibm/history/exhibits/storage/storage_3330.html">http://www-03.ibm.com/ibm/history/exhibits/storage/storage_3330.html</a> (Histoire du disque dur IBM 3330)<br />
<a href="http://www.hpl.hp.com/techreports/Compaq-DEC/SRC-TN-1997-018.pdf">http://www.hpl.hp.com/techreports/Compaq-DEC/SRC-TN-1997-018.pdf</a> (Génèse du SQL)<br />
<a href="http://www.cs.ox.ac.uk/files/3404/PRG82.pdf">www.cs.ox.ac.uk/files/3404/PRG82.pdf</a>: Phil Trinder &laquo;&nbsp;A functional database&nbsp;&raquo;<br />
<a href="http://www.quora.com/What-would-be-the-main-advantages-of-a-(purely-)-functional-database">http://www.quora.com/What-would-be-the-main-advantages-of-a-(purely-)-functional-database</a><br />
<a href="http://nathanmarz.com/blog/how-to-beat-the-cap-theorem.html">http://nathanmarz.com/blog/how-to-beat-the-cap-theorem.html</a><br />
<a href="http://research.microsoft.com/~gray/papers/theTransactionConcept.pdf">http://research.microsoft.com/~gray/papers/theTransactionConcept.pdf</a> (Implémentations d&#8217;une transaction)</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=29640" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/outiller-un-audit-de-base-de-donnees/' rel='bookmark' title='Outiller un audit de base de données'>Outiller un audit de base de données</a></li>
<li><a href='http://blog.octo.com/industrialisation-des-developpements-automatisez-votre-base-de-donnees/' rel='bookmark' title='Industrialisation des développements : automatisez votre base de données'>Industrialisation des développements : automatisez votre base de données</a></li>
<li><a href='http://blog.octo.com/des-alternatives-aux-bases-de-donnees-relationnelles%e2%80%a6/' rel='bookmark' title='Des alternatives aux bases de données relationnelles…'>Des alternatives aux bases de données relationnelles…</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/une-base-de-donnees-purement-fonctionnelle-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Délégation de tâches avec ZeroMQ</title>
		<link>http://blog.octo.com/delegation-de-taches-avec-zeromq/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=delegation-de-taches-avec-zeromq</link>
		<comments>http://blog.octo.com/delegation-de-taches-avec-zeromq/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 11:57:30 +0000</pubDate>
		<dc:creator>David Rousselie</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[fail-over]]></category>
		<category><![CDATA[haute disponibilité]]></category>
		<category><![CDATA[messaging]]></category>
		<category><![CDATA[zeromq]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=28910</guid>
		<description><![CDATA[La délégation de tâches en asynchrone est un moyen efficace d&#8217;alléger la charge que subissent nos systèmes. En effet, de nombreux cas d&#8217;utilisation ne nécessitent pas d&#8217;être exécutés de façon synchrone lorsqu&#8217;un utilisateur effectue une action ou qu&#8217;un événement extérieur intervient. Par exemple, lorsqu&#8217;il n&#8217;est pas nécessaire de restituer la dernière version des données et [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/creer-un-cluster-activemq-hautement-disponible/' rel='bookmark' title='Créer un cluster ActiveMQ hautement disponible'>Créer un cluster ActiveMQ hautement disponible</a></li>
<li><a href='http://blog.octo.com/le-push-web-vu-par-diffusion-partie-1/' rel='bookmark' title='Le push web vu par Diffusion &#8211; Partie 1'>Le push web vu par Diffusion &#8211; Partie 1</a></li>
<li><a href='http://blog.octo.com/le-push-web-avec-pusher/' rel='bookmark' title='Le push web avec Pusher'>Le push web avec Pusher</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p>La délégation de tâches en asynchrone est un moyen efficace d&#8217;alléger la charge que subissent nos systèmes. En effet, <strong>de nombreux cas d&#8217;utilisation ne nécessitent pas d&#8217;être exécutés de façon synchrone</strong> lorsqu&#8217;un utilisateur effectue une action ou qu&#8217;un événement extérieur intervient.</p>
<p>Par exemple, lorsqu&#8217;il n&#8217;est pas nécessaire de restituer la dernière version des données et que le traitement avant restitution est coûteux en ressources, il est possible de renvoyer des données préalablement mises en cache et de déporter en asynchrone une tâche de rafraîchissement de ce cache.</p>
<p>Un autre exemple concerne les systèmes qui mêlent des requêtes fortement consommatrices en ressources (CPU, mémoire, &#8230;) et des requêtes peu consommatrices pour lesquelles on va vouloir garantir une latence faible même lorsque des requêtes consommatrices sont en cours de traitement. Pour cela, déléguer les traitements coûteux à des workers via une file de messages peut aider à garantir des temps de réponse faibles pour les autres requêtes. Cette séparation est d&#8217;autant plus importante sur des systèmes qui s&#8217;appuient sur des technologies monothreadées telles que Ruby ou NodeJS (ce dernier a néanmoins l&#8217;avantage de ne pas consommer de ressources/process lorsqu&#8217;il effectue des I/O).</p>
<p>Pour résoudre cette problématique de délégation de tâches, on utilise habituellement une solution comme ActiveMQ ou RabbitMQ. Seulement, lorsqu&#8217;il est nécessaire :</p>
<ul>
<li>d&#8217;être <strong>tolérant à la panne</strong></li>
<li>d&#8217;être <strong>scalable que ce soit en ajoutant des publishers</strong> (qui soumettent les tâches asynchrones) <strong>ou des workers</strong> (qui consomment et exécutent ces tâches)</li>
<li>de pouvoir <strong>intégrer des systèmes hétérogènes</strong> s&#8217;exécutant sur différentes plateformes (Java, Ruby, NodeJS, C, &#8230;)</li>
</ul>
<p>aucune de ces deux solutions ne permet de satisfaire l&#8217;ensemble de ces critères. Cet article présente une solution possible à base de ZeroMQ, écrite en NodeJS et utilisée pour traiter les deux exemples précédents.<br />
<span id="more-28910"></span></p>
<h3>ZeroMQ : Super sockets</h3>
<p>ZeroMQ est une bibliothèque réseau écrite en C++ et qui offre des bindings dans de nombreux langages. Elle procure une couche d&#8217;abstraction au-dessus des sockets TCP classiques pour ajouter quelques fonctionnalités :</p>
<ul>
<li><strong>une communication par message</strong>. Contrairement à TCP ou UDP, <strong>un message est reçu dans son intégralité ou n&#8217;est pas reçu du tout, jamais partiellement</strong>. En effet, lorsqu&#8217;on utilise des sockets TCP, pour réceptionner des données, il est nécessaire de déterminer la taille des messages ou de rechercher un délimiteur. ZeroMQ le fait pour nous, il nous renvoie le message dans sa globalité. Les messages ZeroMQ sont composés de frames qui permettent de segmenter les informations passées.</li>
<li><strong>la gestion des reconnexions</strong> lors d&#8217;une coupure.</li>
<li><strong>la gestion d&#8217;une file de messages au niveau de la socket</strong>. Ainsi, lors de la perte d&#8217;une connexion, aucun message ne sera perdu, ZeroMQ se chargera de transmettre les messages en file d&#8217;attente lorsque la connexion aura été ré-établie. ZeroMQ offre ainsi la possibilité de créer <strong>un système de messagerie sans broker en connectant les éléments du système en peer-to-peer</strong>. La notion de broker pourra toutefois être réintroduite suivant les besoins.</li>
<li><strong>l&#8217;abstraction du protocole de transport des messages</strong>:
<ul>
<li>TCP pour une communication sur le réseau,</li>
<li>PGM pour une communication en multicast sur le réseau,</li>
<li>IPC pour une communication inter-process au sein d&#8217;un même hôte,</li>
<li>INPROC, pour une communication au sein d&#8217;un même processus (entre plusieurs threads par exemple).</li>
</ul>
</li>
<li><strong>le support de différents patterns de communication</strong> suivant l&#8217;association des types de sockets ZeroMQ :
<ul>
<li><code>PUB-SUB</code> : l&#8217;association des sockets <code>PUB</code> et <code>SUB</code> permet de distribuer des messages d&#8217;un publisher (socket <code>PUB</code>) vers N consommateurs (socket <code>SUB</code>) qui reçoivent tous les mêmes messages,</li>
<li><code>REQ-REP</code> : le pattern classique de requête/réponse (1 publisher, 1 consommateur),</li>
<li><code>PUSH-PULL</code> : la socket de type <code>PUSH</code> distribue les messages en round-robin dans la file de messages des sockets de type <code>PULL</code> connectées : 1 publisher et N consommateurs qui se répartissent la consommation des messages.</li>
</ul>
</li>
</ul>
<p>Pour utiliser ces patterns de communication, <strong>une socket ZeroMQ est capable de se connecter à plusieurs autres sockets ZeroMQ</strong>. Le comportement lors de l&#8217;envoi d&#8217;un message sur une socket ZeroMQ connectée à plusieurs sockets dépendra du type de cette socket.</p>
<h3>Délégation de tâches scalable et tolérante à la panne</h3>
<p>Bien que ZeroMQ fonctionne sans broker, il peut être nécessaire de réintroduire dans l&#8217;architecture un élément de ce type afin de limiter le nombre de connexions réseau. Par exemple, dans une architecture de délégation de tâches, avec 100 publishers et 100 workers, sans broker, il faudra établir 10 000 connexions (100 publishers * 100 workers) qui risquent d&#8217;engorger le réseau. Avec 2 brokers (pour supporter la panne de l&#8217;un d&#8217;entre eux), il faudra 400 connexions (100 publishers * 2 brokers + 100 workers * 2 brokers).</p>
<p>ZeroMQ propose 2 autres types de sockets qui permettent notamment le <strong>routage de messages</strong> :</p>
<ul>
<li><code>ROUTER</code> : cette socket ajoute aux messages entrant l&#8217;identifiant de la socket ZeroMQ source dans une nouvelle frame qui devient la première frame du message. Ensuite, elle utilise cet identifiant des messages sortants (en supprimant la première frame du message) pour sélectionner la socket destination du message (si elle est connectée bien sûr). <strong>En modifiant cette frame, nous sommes capables de personnaliser le routage des messages sortants via cette socket</strong>. L&#8217;identifiant d&#8217;une socket peut être spécifié à la création sinon il sera généré aléatoirement par ZeroMQ.</li>
<li><code>DEALER</code> : cette socket permet de recevoir et envoyer des messages (contrairement à la socket <code>PUSH</code> qui peut seulement en envoyer). L&#8217;envoi de messages se faisant en round-robin aux sockets connectées.</li>
</ul>
<p>Avec ces différents types de sockets nous pouvons les assembler de la façon suivante pour obtenir notre système de délégation de tâches asynchrones avec les caractéristiques suivantes :</p>
<ul>
<li>chaque publisher peut publier une tâche sur n&#8217;importe quel broker,</li>
<li>chaque worker peut récupérer une tâche et publier le résultat sur n&#8217;importe quel broker,</li>
<li>les brokers sont capables de router le résultat d&#8217;une tâche vers le publisher qui l&#8217;a publiée.</li>
</ul>
<p><center><br />
<a href="http://blog.octo.com/wp-content/uploads/2012/01/0mq_tasks_distribution.png"><img src="http://blog.octo.com/wp-content/uploads/2012/01/0mq_tasks_distribution.png" alt="Distribution de tâches avec ZeroMQ" title="Distribution de tâches avec ZeroMQ" width="720" height="540" class="aligncenter size-full wp-image-29704" /></a><br />
</center></p>
<p><em>NB : Nous utilisons ici 3 brokers, pour éviter que les workers envoient systématiquement le même type de message au même broker (ce qui aurait été le cas avec 2 brokers car le worker envoie alternativement un message <code>READY</code> et un message <code>RESULT</code>).</em></p>
<p>Cette architecture permet de supporter la perte de n&#8217;importe quel composant mais aussi d&#8217;ajouter des publishers, des brokers ou des workers suivant la charge de tâches à traiter.</p>
<ul>
<li><center><a href="http://blog.octo.com/wp-content/uploads/2012/01/publish_tasks.png"><img src="http://blog.octo.com/wp-content/uploads/2012/01/publish_tasks.png" alt="Publication des tâches" title="Publication des tâches" width="663" height="298" class="aligncenter size-full wp-image-29705" /></a></center>En utilisant une socket de type <code>DEALER</code> du côté des publishers, celle-ci étant connectée à tous les brokers, <strong>les messages sont envoyés en round-robin (par ZeroMQ) vers les brokers</strong> (étapes 1, 2 et 3 à partir des publishers). <strong>Si un broker venait à disparaitre, la socket <code>DEALER</code> continuerait à dialoguer avec les brokers restants</strong> et lorsque le broker perdu serait de nouveau accessible, <strong>ZeroMQ se chargera de se reconnecter sur ce broker qui réintègrera alors le cycle de round-robin d&#8217;envoi de messages</strong>.<br />
Les messages envoyés ne contiennent qu&#8217;une seule frame contenant les données de la tâche à exécuter :<center><img class="aligncenter size-full wp-image-28943" title="Format du message envoyé par un publisher" src="http://blog.octo.com/wp-content/uploads/2012/01/publisher_task1.png" alt="Format du message envoyé par un publisher" width="115" height="20" /></center>Code du Publisher :</p>

<div class="wp_codebox"><table><tr id="p2891027"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p28910code27"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> broker <span style="color: #339933;">=</span> zeromq.<span style="color: #660066;">createSocket</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'dealer'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;tcp://broker1:5555&quot;</span><span style="color: #339933;">,</span>
 <span style="color: #3366CC;">&quot;tcp://broker2:5555&quot;</span><span style="color: #339933;">,</span>
 <span style="color: #3366CC;">&quot;tcp://broker3:5555&quot;</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">forEach</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>address<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  broker.<span style="color: #660066;">connect</span><span style="color: #009900;">&#40;</span>address<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
...
<span style="color: #660066;">broker</span>.<span style="color: #660066;">send</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;task data&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</li>
<li>Les messages provenant des publishers sont reçus sur une socket <code>ROUTER</code> sur un des brokers. Celle-ci ajoute une frame contenant l&#8217;identifiant de la socket <code>DEALER</code> du publisher qui a envoyé le message. Ceci permettra, si le message est envoyé via une socket <code>ROUTER</code> connectée à ce publisher, de router le message vers le bon publisher.<br />
Le broker a la charge de gérer une file de messages en mémoire, dans un fichier ou dans une base de données selon les besoins (garantie de ne pas perdre de message, performances, &#8230;).<br />
Les messages traités par le broker contiennent donc 2 frames :<center><img class="aligncenter size-full wp-image-28946" title="Format du message traité par le broker" src="http://blog.octo.com/wp-content/uploads/2012/01/publisher_broker_task1.png" alt="Format du message traité par le broker" width="115" height="36" /></center>Code du broker :</p>

<div class="wp_codebox"><table><tr id="p2891028"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code" id="p28910code28"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> publishers <span style="color: #339933;">=</span> zeromq.<span style="color: #660066;">createSocket</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'router'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
publishers.<span style="color: #660066;">on</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'message'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #006600; font-style: italic;">// Process messages from publishers</span>
  <span style="color: #003366; font-weight: bold;">var</span> publisher_id <span style="color: #339933;">=</span> arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
      task_data <span style="color: #339933;">=</span> arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// Store in a queue</span>
  ...
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
publishers.<span style="color: #660066;">bindSync</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;tcp://*:5555&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</li>
<li><center><a href="http://blog.octo.com/wp-content/uploads/2012/01/worker_get_ready.png"><img src="http://blog.octo.com/wp-content/uploads/2012/01/worker_get_ready.png" alt="Notification d&#039;un worker prêt à traiter une tâche" title="Notification d&#039;un worker prêt à traiter une tâche" width="663" height="318" class="aligncenter size-full wp-image-29707" /></a></center>Du côté workers, ces derniers se connectent à tous les brokers via une socket <code>DEALER</code>. Ils envoient un message de type <code>READY</code> (en utilisant une frame) pour récupérer une tâche disponible sur les brokers (étapes 1 et 4 à partir des workers). Le type du message est géré dans le code applicatif et non pas par ZeroMQ. Il permet au code applicatif du broker de différencier les messages en provenance des workers :
<ul>
<li><code>READY</code> pour préciser que le worker est prêt à traiter une tâche,</li>
<li><code>RESULT</code> pour préciser que le message contient le résultat d&#8217;une tâche qui devra être transmis au publisher ayant publié la tâche.</li>
</ul>
<p>En utilisant une socket <code>DEALER</code>, les messages seront donc alternativement envoyés sur l&#8217;un ou l&#8217;autre des brokers et la socket gérera la perte d&#8217;un broker.<br />
Le message envoyé par un worker pour récupérer une tâche ressemble donc à :</p>
<p><center><img class="aligncenter size-full wp-image-28947" title="Format du message READY" src="http://blog.octo.com/wp-content/uploads/2012/01/worker_ready.png" alt="Format du message READY" width="116" height="21" /></center>Le code du worker :</p>

<div class="wp_codebox"><table><tr id="p2891029"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p28910code29"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> broker <span style="color: #339933;">=</span> zeromq.<span style="color: #660066;">createSocket</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'dealer'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
broker.<span style="color: #660066;">on</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'message'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>...<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;tcp://broker1:5555&quot;</span><span style="color: #339933;">,</span>
 <span style="color: #3366CC;">&quot;tcp://broker2:5555&quot;</span><span style="color: #339933;">,</span>
 <span style="color: #3366CC;">&quot;tcp://broker3:5555&quot;</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">forEach</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>address<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  broker.<span style="color: #660066;">connect</span><span style="color: #009900;">&#40;</span>address<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
broker.<span style="color: #660066;">send</span><span style="color: #009900;">&#40;</span>READY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</li>
<li>De la même manière que du côté publisher, un message <code>READY</code> se verra ajouter une frame contenant l&#8217;identifiant du worker qui l&#8217;a envoyé par la socket <code>ROUTER</code> du broker :<center><img class="aligncenter size-full wp-image-28948" title="Format du message READY sur le broker" src="http://blog.octo.com/wp-content/uploads/2012/01/worker_broker_ready.png" alt="Format du message READY sur le broker" width="115" height="35" /></center></li>
<li>Avec un message contenant une tâche à exécuter (provenant d&#8217;un publisher) et d&#8217;un message <code>READY</code> (provenant d&#8217;un worker disponible), <strong>le broker peut constituer un message contenant la tâche en plaçant l&#8217;identifiant d&#8217;un worker disponible dans la première frame afin que le message soit routé vers ce worker par la socket <code>ROUTER</code> (qui supprimera au passage cette première frame)</strong>:<center><img class="aligncenter size-full wp-image-28949" title="Format du message contenant la tâche et envoyé par le broker au worker" src="http://blog.octo.com/wp-content/uploads/2012/01/broker_worker_task1.png" alt="Format du message contenant la tâche et envoyé par le broker au worker" width="115" height="53" /></center>Le code du broker devient alors :

<div class="wp_codebox"><table><tr id="p2891030"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p28910code30"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> workers <span style="color: #339933;">=</span> zeromq.<span style="color: #660066;">createSocket</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'router'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
workers.<span style="color: #660066;">on</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'message'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #006600; font-style: italic;">// Process messages from workers</span>
  <span style="color: #003366; font-weight: bold;">var</span> worker_id <span style="color: #339933;">=</span> arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
      message_type <span style="color: #339933;">=</span> arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// READY</span>
&nbsp;
  <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>message_type <span style="color: #339933;">==</span> READY<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// dequeue tasks</span>
    <span style="color: #003366; font-weight: bold;">var</span> task<span style="color: #339933;">,</span> publisher_id <span style="color: #339933;">=</span> ...<span style="color: #339933;">;</span>
    workers.<span style="color: #660066;">send</span><span style="color: #009900;">&#40;</span>worker_id<span style="color: #339933;">,</span> publisher_id<span style="color: #339933;">,</span> task<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
workers.<span style="color: #660066;">bindSync</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;tcp://*:5555&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</li>
<li><center><a href="http://blog.octo.com/wp-content/uploads/2012/01/worker_get_task.png"><img src="http://blog.octo.com/wp-content/uploads/2012/01/worker_get_task.png" alt="Récupération d&#039;une tâche par un worker prêt" title="Récupération d&#039;une tâche par un worker prêt" width="171" height="321" class="aligncenter size-full wp-image-29708" /></a></center>Le worker (celui qui a envoyé un message <code>READY</code>) reçoit alors le message (étape 2 à partir du broker1) suivant contenant la tâche à exécuter :<center><img class="aligncenter size-full wp-image-28950" title="Format du message reçu par un worker" src="http://blog.octo.com/wp-content/uploads/2012/01/worker_task1.png" alt="Format du message reçu par un worker" width="115" height="36" /></center>Le handler de réception d&#8217;un message sur le worker :

<div class="wp_codebox"><table><tr id="p2891031"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p28910code31"><pre class="javascript" style="font-family:monospace;">broker.<span style="color: #660066;">on</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'message'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #006600; font-style: italic;">// Process task messages from broker</span>
  <span style="color: #003366; font-weight: bold;">var</span> publisher_id <span style="color: #339933;">=</span> arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
      task_data <span style="color: #339933;">=</span> arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #006600; font-style: italic;">// process task</span>
  ...
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</li>
</ul>
<p><strong>Cette architecture permet aux workers de renvoyer une réponse au publisher</strong> si l&#8217;on veut par exemple que le publisher réponde de façon synchrone sans pour autant accaparer le CPU et bloquer les requêtes suivantes (cas de NodeJS ici). Le cheminement inverse s&#8217;effectue alors de la façon suivante :</p>
<ul>
<li><center><a href="http://blog.octo.com/wp-content/uploads/2012/01/worker_send_result.png"><img src="http://blog.octo.com/wp-content/uploads/2012/01/worker_send_result.png" alt="Envoi du résultat d&#039;une tâche par un worker" title="Envoi du résultat d&#039;une tâche par un worker" width="406" height="316" class="aligncenter size-full wp-image-29709" /></a></center>Le worker envoie un message contenant le résultat via sa socket <code>DEALER</code> vers les brokers (toujours en round-robin et suivant la disponibilité de ces derniers) en utilisant une frame pour spécifier un type de message <code>RESULT</code> (étape 3 à partir des workers) :<center><img class="aligncenter size-full wp-image-28952" title="Format d'un message résultat envoyé par un worker" src="http://blog.octo.com/wp-content/uploads/2012/01/worker_result_task1.png" alt="Format d'un message résultat envoyé par un worker" width="115" height="52" /></center>Code du handler de traitement des messages par un worker :

<div class="wp_codebox"><table><tr id="p2891032"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p28910code32"><pre class="javascript" style="font-family:monospace;">broker.<span style="color: #660066;">on</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'message'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #006600; font-style: italic;">// Process task messages from broker</span>
  <span style="color: #003366; font-weight: bold;">var</span> publisher_id <span style="color: #339933;">=</span> arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
      task_data <span style="color: #339933;">=</span> arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #006600; font-style: italic;">// process task</span>
  ...
&nbsp;
  <span style="color: #006600; font-style: italic;">// Send a result to the publisher</span>
  broker.<span style="color: #660066;">send</span><span style="color: #009900;">&#40;</span>RESULT<span style="color: #339933;">,</span> publisher_id<span style="color: #339933;">,</span> result<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #006600; font-style: italic;">// Send READY message to get a new task</span>
  broker.<span style="color: #660066;">send</span><span style="color: #009900;">&#40;</span>READY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</li>
<li>Un des brokers reçoit le message via sa socket <code>ROUTER</code> qui ajoute une frame avec l&#8217;identifiant du worker. Dans ce cas-ci, l&#8217;identifiant nous sera inutile.<center><img class="aligncenter size-full wp-image-28951" title="Format du message de résultat reçu par le broker" src="http://blog.octo.com/wp-content/uploads/2012/01/worker_broker_result_task1.png" alt="Format du message de résultat reçu par le broker" width="115" height="67" /></center>L&#8217;identifiant du publisher à l&#8217;origine de la tâche étant toujours présent dans le message, il est possible de lui envoyer le message suivant sur la socket <code>ROUTER</code> sur laquelle sont connectés les publishers. La socket routera alors le message vers le bon publisher :
<p><center><img class="aligncenter size-full wp-image-28957" title="Format du message résultat envoyé par le broker au publisher" src="http://blog.octo.com/wp-content/uploads/2012/01/broker_publisher_result_task1.png" alt="Format du message résultat envoyé par le broker au publisher" width="115" height="37" /></center>Le handler des messages en provenance des workers devient alors :</p>

<div class="wp_codebox"><table><tr id="p2891033"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code" id="p28910code33"><pre class="javascript" style="font-family:monospace;">workers.<span style="color: #660066;">on</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'message'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #006600; font-style: italic;">// Process messages from workers</span>
  <span style="color: #003366; font-weight: bold;">var</span> worker_id <span style="color: #339933;">=</span> arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
      message_type <span style="color: #339933;">=</span> arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #006600; font-style: italic;">// READY or RESULT</span>
      publisher_id <span style="color: #339933;">=</span> arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
      result <span style="color: #339933;">=</span> arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>message_type <span style="color: #339933;">==</span> READY<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// dequeue tasks</span>
    <span style="color: #003366; font-weight: bold;">var</span> task<span style="color: #339933;">,</span> publisher_id <span style="color: #339933;">=</span> ...<span style="color: #339933;">;</span>
    workers.<span style="color: #660066;">send</span><span style="color: #009900;">&#40;</span>worker_id<span style="color: #339933;">,</span> publisher_id<span style="color: #339933;">,</span> task<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>message_type <span style="color: #339933;">==</span> RESULT<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    publishers.<span style="color: #660066;">send</span><span style="color: #009900;">&#40;</span>publisher_id<span style="color: #339933;">,</span> result<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</li>
<li><center><a href="http://blog.octo.com/wp-content/uploads/2012/01/broker_send_result.png"><img src="http://blog.octo.com/wp-content/uploads/2012/01/broker_send_result.png" alt="Transmission du résultat d&#039;une tâche au publisher" title="Transmission du résultat d&#039;une tâche au publisher" width="381" height="303" class="aligncenter size-full wp-image-29710" /></a></center>le publisher reçoit alors le message contenant le résultat sur sa socket <code>DEALER</code> (étape 4 à partir du broker2) :<center><img class="aligncenter size-full wp-image-28955" title="Format du message de résultat reçu par un publisher" src="http://blog.octo.com/wp-content/uploads/2012/01/publisher_result_task1.png" alt="Format du message de résultat reçu par un publisher" width="115" height="20" /></center>Le handler de messages d&#8217;un publisher :

<div class="wp_codebox"><table><tr id="p2891034"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p28910code34"><pre class="javascript" style="font-family:monospace;">broker.<span style="color: #660066;">on</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'message'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #006600; font-style: italic;">// Process messages from broker</span>
  <span style="color: #003366; font-weight: bold;">var</span> result <span style="color: #339933;">=</span> arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  ...
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</li>
</ul>
<h3>Conclusion</h3>
<p>Comme nous avons pu le constater, ZeroMQ permet d&#8217;élaborer une solution adaptée à ses besoins en combinant les différents types de sockets disponibles (d&#8217;autres exemples sont accessibles dans le <a href="http://zguide.zeromq.org/page:all">guide ZeroMQ</a>). Cette souplesse vient tout de même au prix d&#8217;une certaine complexité puisqu&#8217;il faut élaborer son propre protocole (en utilisant les frames des messages ZeroMQ) et traiter quelques sujets qui n&#8217;ont pas été abordés dans cet article comme la gestion des timeouts. Par exemple, lorsqu&#8217;un broker reçoit avec succès un message <code>READY</code> mais ne peut répondre au worker en raison d&#8217;une coupure réseau ou d&#8217;un crash du broker, dans ce cas là, sans timeout, le worker pourrait attendre indéfiniment que le broker lui renvoie une tâche à exécuter.<br />
ZeroMQ offre aussi de <a href="http://www.zeromq.org/results:ib-tests-v206">très bons résultats concernant les performances</a>, que ce soit la latence ou le débit de transmission des messages. Ceci en fait une bonne solution pour les systèmes devant traiter de gros volumes de messages (en nombre ou en taille). Il est cependant moins adapté lorsque l&#8217;on ne peut pas se permettre de perdre des messages : dans l&#8217;exemple de cet article, la file de messages est n&#8217;est pas persisté sur le broker et ZeroMQ ne gère pas de transaction; un message envoyé aux brokers n&#8217;est donc pas garantir d&#8217;atteindre un worker ou un publisher si un broker crash.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=28910" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/creer-un-cluster-activemq-hautement-disponible/' rel='bookmark' title='Créer un cluster ActiveMQ hautement disponible'>Créer un cluster ActiveMQ hautement disponible</a></li>
<li><a href='http://blog.octo.com/le-push-web-vu-par-diffusion-partie-1/' rel='bookmark' title='Le push web vu par Diffusion &#8211; Partie 1'>Le push web vu par Diffusion &#8211; Partie 1</a></li>
<li><a href='http://blog.octo.com/le-push-web-avec-pusher/' rel='bookmark' title='Le push web avec Pusher'>Le push web avec Pusher</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/delegation-de-taches-avec-zeromq/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Thrift et Protocol Buffers : compacité du message sérialisé dans le monde Java</title>
		<link>http://blog.octo.com/thrift-protobuf-compacite/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=thrift-protobuf-compacite</link>
		<comments>http://blog.octo.com/thrift-protobuf-compacite/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 10:15:49 +0000</pubDate>
		<dc:creator>Borémi Toch</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[IDL]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[protobuf]]></category>
		<category><![CDATA[sérialisation]]></category>
		<category><![CDATA[Thrift]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=28819</guid>
		<description><![CDATA[Un précédent article a exposé les grands principes de la sérialisation avec Thrift et Procotol Buffers. Ces deux frameworks promettent notamment une représentation des messages optimisée en termes de taille, ce qui est avéré dans le benchmark JVM Serializers : Thrift et Protocol Buffers y obtiennent une réduction de taille du message de 73% par [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/serialisation-thrift-et-protocol-buffers/' rel='bookmark' title='Sérialisation : Thrift et Protocol Buffers, principes et aperçu'>Sérialisation : Thrift et Protocol Buffers, principes et aperçu</a></li>
<li><a href='http://blog.octo.com/socle-technique-des-applications-java-ee-dans-le-war-ou-dans-le-serveur/' rel='bookmark' title='Socle technique des applications Java EE : dans le WAR ou dans le serveur ?'>Socle technique des applications Java EE : dans le WAR ou dans le serveur ?</a></li>
<li><a href='http://blog.octo.com/les-nouveautes-du-langage-dans-java-7/' rel='bookmark' title='Les nouveautés du langage dans Java 7'>Les nouveautés du langage dans Java 7</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p><a href="http://blog.octo.com/serialisation-thrift-et-protocol-buffers/">Un précédent article</a> a exposé les grands principes de la sérialisation avec <a href="http://thrift.apache.org/">Thrift</a> et <a href="http://code.google.com/p/protobuf/">Procotol Buffers</a>. Ces deux frameworks promettent notamment une <strong>représentation des messages optimisée en termes de taille</strong>, ce qui est avéré dans le benchmark <a href="https://github.com/eishay/jvm-serializers/wiki/">JVM Serializers</a> : Thrift et Protocol Buffers y obtiennent une réduction de taille du message de 73% par rapport à la sérialisation native Java. Ce benchmark regroupe par ailleurs de nombreux autres frameworks de sérialisation du monde Java, mais se limite toutefois à l&#8217;utilisation d&#8217;un <a href="https://github.com/eishay/jvm-serializers/wiki/TestValue">unique message de test</a>. </p>
<p>Le présent article analyse l&#8217;<strong>influence de la structure</strong> (nombre et taille des objets, complexité de la grappe) <strong>sur la compacité du message sérialisé pour Thrift et Protocol Buffers</strong>. La comparaison est réalisée en Java, son protocole de sérialisation standard servant de référence.<br />
<span id="more-28819"></span></p>
<h2>Conditions du test</h2>
<p>Afin d&#8217;évaluer diverses structures de messages, le prototype utilise une <a href="http://fr.wikipedia.org/wiki/Arbre_enracin%C3%A9">structure arborescente</a>. Traditionnellement, ce type de structure est récursif. Cependant, il n&#8217;est pas compatible avec la limitation de Thrift sur la <a href="http://fr.wikipedia.org/wiki/D%C3%A9claration_avanc%C3%A9e">déclaration avancée</a> abordée <a href="http://blog.octo.com/serialisation-thrift-et-protocol-buffers/#recursion">dans le précédent article</a>.<br />
La profondeur a donc été arbitrairement limitée au niveau 6, soit 127 nœuds au maximum pour un arbre binaire complet. Il y a un type différent par profondeur, de Node0 pour la racine à Node6 pour les feuilles les plus basses. Les arbres générés le sont selon <strong>trois paramètres</strong> :</p>
<ul>
<li><strong>le nombre total de nœuds</strong>, qui permet de faire varier le nombre d&#8217;objets du message,</li>
<li><strong>la cardinalité des fratries </strong>, qui joue sur la complexité : plus cette cardinalité est faible pour un nombre de nœuds donné, plus les fratries sont petites et nombreuses, donc plus le message est complexe,</li>
<li>et <strong>la taille des nœuds</strong>, qui est fonction du champ &laquo;&nbsp;description&nbsp;&raquo;. Son contenu est une chaîne de caractères différente pour chacun d&#8217;eux et générée par décalage des valeurs <a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a> des caractères.</li>
</ul>
<p>La construction des arbres se fait récursivement et équitablement entre les fils d&#8217;un nœud. Ci-dessous trois exemples d&#8217;arbre à 5 nœuds avec, de gauche à droite, des tailles de fratries de 1, 2 et 3. Les numéros sont présents à titre indicatif et indiquent l&#8217;ordre de création des nœuds par l&#8217;algorithme de construction.<br />
<a href="http://blog.octo.com/wp-content/uploads/2012/01/5nodeN-Tree_Colours.png"><img src="http://blog.octo.com/wp-content/uploads/2012/01/5nodeN-Tree_Colours.png" alt="" title="5nodeN-Tree_Colours" width="500" height="183" class="aligncenter size-full wp-image-29188" /></a></p>
<p>Les déclarations dans les IDLs Thrift IDL et Protocol Buffers language sont disponibles <a href="#annexe">en fin d&#8217;article</a>. Les versions utilisées sont 0.8.0 pour Thrift, 2.4.1 pour Protocol Buffers et HotSpot 1.6.0_29 pour la JVM.</p>
<h2>Impact du nombre d&#8217;objets du message</h2>
<p>Dans un premier temps, la complexité est fixée au minimum : </p>
<ul>
<li>La longueur des descriptions de chaque nœud est constante (32 caractères),</li>
<li>le nombre de nœuds est variable,</li>
<li>la structure choisie est le 1024-tree qui équivaut à un arbre à deux niveaux dans cette étude.</li>
</ul>
<p>En effet, si la cardinalité des fratries est supérieure au nombre de nœuds n, on obtient un arbre à deux niveaux, une racine Node0 et n-1 enfants Node1. Les 1024-trees de cet article ont tous cette structure car n est toujours inférieur à 1024.<br />
<img src="http://blog.octo.com/wp-content/uploads/2012/01/nnode1024-tree.png" alt="" title="nnode1024-tree" width="498" height="177" class="aligncenter size-full wp-image-29200" /></p>
<p>Tracer la taille du message sérialisé en fonction du nombre de nœuds donne le graphe suivant :<br />
<img class="aligncenter size-full wp-image-28852" title="List_ByteSizeVsNodeCount" src="http://blog.octo.com/wp-content/uploads/2012/01/List_ByteSizeVsNodeCount.png" alt="" width="500" height="362" /><br />
Aussi bien sur cet histogramme que sur les suivants, une <strong>barre plus basse</strong> correspond systématiquement à un <strong>meilleur résultat</strong> et l&#8217;ordre des barres (de gauche à droite) correspond à celui de la légende (de haut en bas).<br />
Sur ce premier graphique, on retrouve un constat du benchmark Java Serializers, mais dans un contexte de message plus complexe : <strong>Thrift et protobuf ont des performances très proches</strong>.</p>
<p>Le graphique ci-dessous rapporte leurs résultats à ceux de la sérialisation Java. On constate que <strong>leur avantage en termes de taille de message s&#8217;amenuise à mesure que l&#8217;arbre grossit</strong>.<br />
<img class="aligncenter size-full wp-image-28853" title="List_RelativeSizeVsNodeCount" src="http://blog.octo.com/wp-content/uploads/2012/01/List_RelativeSizeVsNodeCount.png" alt="" width="500" height="380" /></p>
<p>Sur le graphique suivant, on observe que la taille moyenne d&#8217;un nœud décroît rapidement pour la sérialisation Java. En effet, le <a href="http://docs.oracle.com/javase/7/docs/platform/serialization/spec/protocol.html">protocole de sérialisation Java</a> ajoute aux informations du message lui-même la description des classes sérialisées. Ce surcoût, important pour un petit message, devient négligeable pour des messages constitués de nombreux objets du même type.<br />
<img class="aligncenter size-full wp-image-28857" title="List_avgNodeSize" src="http://blog.octo.com/wp-content/uploads/2012/01/List_avgNodeSize.png" alt="" width="500" height="360" /><br />
Les protocoles de protobuf et Thrift, quant à eux, contiennent très peu d&#8217;information de structure : uniquement un identifiant de champ et un type. Ainsi ils voient la taille moyenne d&#8217;un nœud croître légèrement, car les listes d&#8217;enfants augmentent en nombre et taille quand l&#8217;arbre grossit.</p>
<h2>Impact de la taille des objets</h2>
<p>Pour ce second test, on fige la structure du message pour mesurer l&#8217;influence de la quantité d&#8217;information contenue dans chaque nœud :</p>
<ul>
<li>Un 1024-tree est considéré comme dans le test précédent,</li>
<li>sa taille est fixée à 31 nœuds,</li>
<li>la taille du champ &laquo;&nbsp;description&nbsp;&raquo; est utilisé comme variable.</li>
</ul>
<p><img class="aligncenter size-full wp-image-28859" title="Desc_ByteSizeVsDescLength" src="http://blog.octo.com/wp-content/uploads/2012/01/Desc_ByteSizeVsDescLength.png" alt="" width="500" height="371" /><br />
Les résultats concernant la taille du message sont similaires au test précédent, Thrift et protobuf sont très proches et font mieux que la sérialisation Java surtout pour de petits objets.<br />
<img src="http://blog.octo.com/wp-content/uploads/2012/01/Desc_SizeDifferenceVsDescLength2.png" alt="" title="Desc_SizeDifferenceVsDescLength" width="500" height="284" class="aligncenter size-full wp-image-28867" /><br />
Figer la structure du message montre que la différence de taille par rapport au protocole de sérialisation Java est quasi-constante. Ceci est dû au fait que <strong>protobuf et Thrift n&#8217;apportent aucun gain notable lorsqu&#8217;on fait varier la taille de la chaîne de caractères</strong>.<br />
En effet, les trois protocoles en jeu la sérialisent sous forme de chaîne en UTF8 précédée de sa longueur. La différence est que le protocole Java utilise 2 octets pour la longueur des chaînes de moins de 2^16 caractères, tandis que les deux frameworks ont recours à un <a href="http://code.google.com/apis/protocolbuffers/docs/encoding.html#varints">varint</a>. Le saut entre 64 et 128 caractères est dû au fait que le format varint n&#8217;utilise qu&#8217;un octet pour coder les entiers entre 0 et 127, puis deux de 128 à 2^14.</p>
<h2>Impact de la structure du message</h2>
<p>Pour évaluer l&#8217;influence de la structure du message :</p>
<ul>
<li>la description de chaque nœud est fixée à 32 caractères,</li>
<li>le nombre de nœuds est variable,</li>
<li>la cardinalité des fratries prend trois valeurs : 2, 4 et 1024.</li>
</ul>
<p>Par exemple, voici les trois variations considérées de l&#8217;arbre à 7 nœuds :<br />
<a href="http://blog.octo.com/wp-content/uploads/2012/01/7node241024-Trees.png"><img src="http://blog.octo.com/wp-content/uploads/2012/01/7node241024-Trees.png" alt="" title="7node241024-Trees" width="500" height="105" class="aligncenter size-full wp-image-29205" /></a></p>
<p>Le graphique qui suit recense les tailles des messages sérialisés.<br />
<img src="http://blog.octo.com/wp-content/uploads/2012/01/Tree_ByteSizeVsNodeCount.png" alt="" title="Tree_ByteSizeVsNodeCount" width="500" height="321" class="aligncenter size-full wp-image-28871" /><br />
Pour tous les protocoles de sérialisation, le comportement est similaire : <strong>plus de complexité conduit à un message sérialisé moins compact</strong>.<br />
Cela est dû au fait que plus de complexité se traduit par un plus grand nombre de listes de noeuds-enfants. Cependant, <strong>la variation reste négligeable (environ 1%) pour Thrift et protobuf</strong>. </p>
<p>Le protocole de sérialisation Java est lui plus fortement influencé (jusqu&#8217;à 13%). En effet la quantité d&#8217;information utilisée par les descripteurs de classes est liée au nombre de types de classes mises en jeu. Plus les fratries sont grandes, moins on utilise de classes différentes. Par exemple, pour 63 nœuds, le 2-tree utilise toutes les classes de Node0 à Node5, le 4-tree s&#8217;arrête à Node3, et le 1024-tree à Node1.<br />
Le résultat particulièrement bon du 2-tree de taille 127 est lié au fait que Node6 n&#8217;a pas de liste d&#8217;enfants et est donc plus compact que les autres types de Nodes. Dans cet arbre, la majorité des nœuds (64) est de type Node6.  </p>
<p>Les tailles moyennes par nœud sont représentées dans l&#8217;histogramme ci-dessous :<br />
<img src="http://blog.octo.com/wp-content/uploads/2012/01/Tree_AvgNodeSizeVsNodeCount.png" alt="" title="Tree_AvgNodeSizeVsNodeCount" width="500" height="334" class="aligncenter size-full wp-image-28873" /><br />
L&#8217;évolution est conforme aux observations du premier test : <strong>l&#8217;écart entre Java et les deux frameworks s&#8217;amenuise lorsqu&#8217;on augmente la taille du graphe</strong> sans pour autant être négligeable.</p>
<p>En traçant le gain apporté par les deux frameworks par rapport à la sérialisation Java on obtient :<br />
<img src="http://blog.octo.com/wp-content/uploads/2012/01/Tree_RelativeSizeVsNodeCount1.png" alt="" title="Tree_RelativeSizeVsNodeCount" width="500" height="320" class="aligncenter size-full wp-image-28874" /></p>
<p>Par exemple, en considérant le message du 4-tree à 63 nœuds et un système devant soutenir une charge de 10000 requêtes/s, le remplacement de la sérialisation Java par Thrift permet de diminuer le besoin de bande passante de 75.45 Mo/s à 40.68Mo/s, soit un gain de 46%.</p>
<h2>Conclusion</h2>
<p>Cet article a présenté une comparaison portant sur la taille de sérialisation avec des messages complexes. Par rapport au benchmark JVM-serializers, l&#8217;avantage de Thrift et protobuf sur la sérialisation native Java est moins décisif en termes de compacité, même s&#8217;il reste intéressant.</p>
<p><strong>La taille du message sérialisé par Thrift ou Protocol Buffers n&#8217;est pas influencée par la structure même du message. C&#8217;est surtout son volume qui a un impact</strong> : les deux frameworks offrent une sérialisation bien plus compacte que celle de Java surtout sur de petits messages. Cette observation rejoint le fait que Protocol Buffers n&#8217;est <a href="http://code.google.com/apis/protocolbuffers/docs/techniques.html#large-data">pas particulièrement adapté aux volumes de données importants</a>.</p>
<p>Il faut rappeler qu&#8217;employer la sérialisation native Java comme référence n&#8217;est légitime que parce que cet article se limite aux protocoles de sérialisation.  Thrift et Protocol Buffers offrent d&#8217;autres avantages tels l&#8217;interopérabilité avec plusieurs langages et la compatibilité ascendante et descendante des messages. Ils sont abordés dans l&#8217;<a href="http://blog.octo.com/serialisation-thrift-et-protocol-buffers/">article précédent</a>. </p>
<p>Pour aller plus loin, on pourrait analyser les temps de sérialisation, l&#8217;empreinte mémoire, l&#8217;intégration aux processus de build&#8230;</p>
<h3 id="annexe">Annexes</h3>
<p>Voici la déclaration des objets en <strong>Thrift IDL</strong> : tree.thrift</p>
<pre class="brush:plain ; collapse: false">namespace java com.octo.example.serialization.model.thrift

enum RoomType {
        SINGLE =0,
        DOUBLE =1,
        SUITE =2
}
struct Node6 {
    1: optional i32 number,
    2: optional bool even,
    3: optional double rate,
    4: optional RoomType type,
    5: optional string description,
}
struct Node5 {
    1: optional i32 number,
    2: optional bool even,
    3: optional double rate,
    4: optional RoomType type,
    5: optional string description,
    6: list children,
}
[...]</pre>
<p>et ainsi de suite jusqu&#8217;au Node0, qui correspond la racine de l&#8217;arbre. L&#8217;ordre employé évite le recours à la déclaration avancée.</p>
<p>Ci-dessous, l&#8217;équivalent en <strong>Protocol Buffers language</strong> : tree.proto</p>
<pre class="brush:plain ; collapse: false">package serialization;

option java_package = "com.octo.example.serialization.model";
option java_outer_classname = "LimitedTreeProto";

enum RoomType {
    SINGLE =0;
    DOUBLE =1;
    SUITE =2;
}
message Node0 {
    optional int32 number =1;
    optional bool even =2;
    optional double rate =3;
    optional RoomType type =4;
    optional string description = 5;
    repeated Node1 children = 6;
}
[...]
message Node6 {
    optional int32 number =1;
    optional bool even =2;
    optional double rate =3;
    optional RoomType type =4;
    optional string description = 5;
}</pre>
<p>L&#8217;ordre des nœuds plus naturel est supporté par le compilateur Protobuf.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=28819" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/serialisation-thrift-et-protocol-buffers/' rel='bookmark' title='Sérialisation : Thrift et Protocol Buffers, principes et aperçu'>Sérialisation : Thrift et Protocol Buffers, principes et aperçu</a></li>
<li><a href='http://blog.octo.com/socle-technique-des-applications-java-ee-dans-le-war-ou-dans-le-serveur/' rel='bookmark' title='Socle technique des applications Java EE : dans le WAR ou dans le serveur ?'>Socle technique des applications Java EE : dans le WAR ou dans le serveur ?</a></li>
<li><a href='http://blog.octo.com/les-nouveautes-du-langage-dans-java-7/' rel='bookmark' title='Les nouveautés du langage dans Java 7'>Les nouveautés du langage dans Java 7</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/thrift-protobuf-compacite/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Open Space OCTO : nouvelle session praticiens agiles le 14 Février</title>
		<link>http://blog.octo.com/open-space-octo-nouvelle-session-praticiens-agiles-le-14-fevrier/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=open-space-octo-nouvelle-session-praticiens-agiles-le-14-fevrier</link>
		<comments>http://blog.octo.com/open-space-octo-nouvelle-session-praticiens-agiles-le-14-fevrier/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 14:27:07 +0000</pubDate>
		<dc:creator>Jean-Fabien Hennequin</dc:creator>
				<category><![CDATA[Méthodologie et conduite du changement]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=29523</guid>
		<description><![CDATA[Suite de notre cycle d’ateliers dédiés aux praticiens agiles, avec une nouvelle session au format Open Space le 14 Février de 14h à 18h dans les locaux d’OCTO. 3 bonnes raisons d’y participer :   1.Un rendez-vous dédié aux acteurs des DSI : Le calendrier IT agile est déjà plutôt chargé, mais il se compose pour [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/retour-sur-la-premiere-session-open-space-praticiens-agiles/' rel='bookmark' title='Retour sur la première session Open Space praticiens agiles'>Retour sur la première session Open Space praticiens agiles</a></li>
<li><a href='http://blog.octo.com/open-space-pour-les-praticiens-agiles-le-24-novembre-chez-octo/' rel='bookmark' title='Open Space pour les praticiens agiles le 24 novembre chez OCTO'>Open Space pour les praticiens agiles le 24 novembre chez OCTO</a></li>
<li><a href='http://blog.octo.com/open-space-la-pilule-rouge-comment-faciliter-la-collaboration-distante-dans-nos-organisations-a-octo-le-17-septembre/' rel='bookmark' title='Open Space &laquo;&nbsp;La Pilule Rouge &#8211; Comment faciliter la collaboration distante dans nos organisations ?&nbsp;&raquo;'>Open Space &laquo;&nbsp;La Pilule Rouge &#8211; Comment faciliter la collaboration distante dans nos organisations ?&nbsp;&raquo;</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p><a href="http://blog.octo.com/wp-content/uploads/2012/01/bandeau-pub.png"><img class="aligncenter size-full wp-image-29524" title="bandeau-pub" src="http://blog.octo.com/wp-content/uploads/2012/01/bandeau-pub.png" alt="" width="580" height="206" /></a></p>
<p>Suite de notre cycle d’ateliers dédiés aux praticiens agiles, avec une nouvelle session au format Open Space le 14 Février de 14h à 18h dans les locaux d’OCTO. 3 bonnes raisons d’y participer :</p>
<p><strong> <span id="more-29523"></span></strong></p>
<p><strong>1.Un rendez-vous dédié aux acteurs des DSI :</strong></p>
<p>Le calendrier IT agile est déjà plutôt chargé, mais il se compose pour majeure partie de rendez-vous réservés aux &laquo;&nbsp;experts&nbsp;&raquo; de l’agile : gourous, coachs, formateurs, etc. Aucun n’est dédié à ceux qui font au quotidien, c’est à dire aux équipes internes au sein des DSI. Or Product Owner, ScrumMaster, MOA, Tech Lead, PMO, tous sont confrontés à des problématiques récurrentes au sein de leurs projets agiles.</p>
<p>&nbsp;</p>
<p><strong>2.De nouvelles pistes pour continuer à progresser :</strong></p>
<p>L’objectif des Open Spaces est de partager entre pairs vos questions, vos problématiques, vos doutes, vos convictions et vos retours d’expérience :</p>
<ul>
<li>Comment intégrer les équipes UX ou Webdesign dans le process agile ?</li>
<li>Comment donner de la visibilité à long terme à sa hiérarchie ?</li>
<li>Comment diffuser la culture de l’amélioration continue ?</li>
<li>Comment garantir le pérennité des rituels ?</li>
<li>Comment mieux coopérer avec les équipes d’exploitation ?</li>
</ul>
<p>Après plusieurs mois, voire plusieurs années de pratiques agiles au sein de ses équipes, il est primordial de lever de temps en temps la tête du guidon et de considérer au-dehors les choix que d’autres ont faits.</p>
<p>&nbsp;</p>
<p><strong>3.Un support illustré retraçant les échanges :</strong></p>
<p>Comme lors de la première session cet automne, <a href="http://tk3.mail54.com/sy/ev?3&amp;2623-422&amp;3&amp;%2FjRdhqP6azyEP8mS14Iv7w">Véronique Olivier-Martin </a>revient pour capter la substantifique moelle de nos échanges et la restituer sous forme d’illustrations sur une <a href="http://mailings.octo.com/2012-01-25/img/fresque-octo.jpg">fresque murale véléda.</a> Chaque participant repartira avec une version numérisée du croquis d’ensemble retraçant l’évolution des échanges au fil de la session et quelques zooms en bonus sur les croquis les plus percutants !</p>
<p>&nbsp;</p>
<p><strong>A l’issue de cet atelier, vous aurez pu :</strong></p>
<ul>
<li>Proposer des sujets au coeur de vos problématiques et les traiter avec vos pairs sous d’autres angles</li>
<li>Partager votre propre expérience d’agiliste sur des questions que se posent d’autres praticiens, au sein d’autres organisations</li>
<li>Découvrir des pratiques agiles, des process et des organisations en place dans d’autres DSI</li>
<li>Etendre votre réseau au sein de la communauté agile</li>
</ul>
<p><strong>Animateurs :</strong></p>
<p>Christophe Thibaut &amp; Mathieu Gandin : Consultants Seniors et Coachs Agile OCTO</p>
<p><strong>Progamme :</strong></p>
<ul>
<li>14h : Accueil</li>
<li>14h00-14h15 : proposition des sujets</li>
<li>14h15-17h45 : Open Space ( 2 à 3 sessions d&#8217;ateliers suivis de restitutions)</li>
<li>17h45-18h : Restitution finale</li>
</ul>
<div></div>
<p style="text-align: center;"><a href="https://docs.google.com/a/octo.com/spreadsheet/viewform?formkey=dEVfNkhnczBsZjhxb3N3Q2NELTJXeGc6MQ&amp;utm_source=pdj250112&amp;utm_medium=email&amp;utm_term=jfhennequin@octo.com&amp;utm_campaign=pdj250112">Cliquez ici pour vous inscrire à l&#8217;Open Space du 14 Février</a></p>
<p style="text-align: center;">

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=29523" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/retour-sur-la-premiere-session-open-space-praticiens-agiles/' rel='bookmark' title='Retour sur la première session Open Space praticiens agiles'>Retour sur la première session Open Space praticiens agiles</a></li>
<li><a href='http://blog.octo.com/open-space-pour-les-praticiens-agiles-le-24-novembre-chez-octo/' rel='bookmark' title='Open Space pour les praticiens agiles le 24 novembre chez OCTO'>Open Space pour les praticiens agiles le 24 novembre chez OCTO</a></li>
<li><a href='http://blog.octo.com/open-space-la-pilule-rouge-comment-faciliter-la-collaboration-distante-dans-nos-organisations-a-octo-le-17-septembre/' rel='bookmark' title='Open Space &laquo;&nbsp;La Pilule Rouge &#8211; Comment faciliter la collaboration distante dans nos organisations ?&nbsp;&raquo;'>Open Space &laquo;&nbsp;La Pilule Rouge &#8211; Comment faciliter la collaboration distante dans nos organisations ?&nbsp;&raquo;</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/open-space-octo-nouvelle-session-praticiens-agiles-le-14-fevrier/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CR du petit-déjeuner organisé par OCTO et Quartet FS « L’analyse décisionnelle en temps réel Convergence entre Big Data et Complex Event Processing »</title>
		<link>http://blog.octo.com/cr-du-petit-dejeuner-organise-par-octo-et-quartet-fs-lanalyse-decisionnelle-en-temps-reel-convergence-entre-big-data-et-complex-event-processing/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cr-du-petit-dejeuner-organise-par-octo-et-quartet-fs-lanalyse-decisionnelle-en-temps-reel-convergence-entre-big-data-et-complex-event-processing</link>
		<comments>http://blog.octo.com/cr-du-petit-dejeuner-organise-par-octo-et-quartet-fs-lanalyse-decisionnelle-en-temps-reel-convergence-entre-big-data-et-complex-event-processing/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 10:52:36 +0000</pubDate>
		<dc:creator>Céline Pageaux</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[ActivePivot Sentinel]]></category>
		<category><![CDATA[analyse décisionnelle]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[CEP]]></category>
		<category><![CDATA[Complex event processing]]></category>
		<category><![CDATA[compte-rendu]]></category>
		<category><![CDATA[Esper]]></category>
		<category><![CDATA[OCTO Technology]]></category>
		<category><![CDATA[Petit-Déjeuner OCTO]]></category>
		<category><![CDATA[QuartetFS]]></category>
		<category><![CDATA[temps réel]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=29501</guid>
		<description><![CDATA[Agenda : Introduction aux enjeux d’analyse de données en temps réel Présentation des architectures d’analyse de données Présentation de la solution Open Source ESPER Présentation de la solution ActivePivot Sentinel (Quartet FS) Questions/Réponses Définition : « Un système d’analyse de données temps réel est un système évènementiel disponible, scalable et stable capable de prendre des décisions (actions) avec [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/lanalyse-decisionnelle-en-temps-reel-convergence-entre-big-data-et-complex-event-processing/' rel='bookmark' title='L&#8217;analyse décisionnelle en temps réel Convergence entre Big Data et Complex Event Processing'>L&#8217;analyse décisionnelle en temps réel Convergence entre Big Data et Complex Event Processing</a></li>
<li><a href='http://blog.octo.com/octo-organise-un-petit-dejeuner-sur-le-theme-usability-le-09-octobre-a-paris/' rel='bookmark' title='OCTO organise un petit-déjeuner sur le thème &laquo;&nbsp;Usability&nbsp;&raquo; le 09 octobre à Paris'>OCTO organise un petit-déjeuner sur le thème &laquo;&nbsp;Usability&nbsp;&raquo; le 09 octobre à Paris</a></li>
<li><a href='http://blog.octo.com/video-du-petit-dejeuner-%c2%ab-comment-batir-votre-cloud-%c2%bb-organise-par-octo-technology/' rel='bookmark' title='Vidéo du petit-déjeuner « Comment bâtir votre Cloud ? » organisé par OCTO Technology'>Vidéo du petit-déjeuner « Comment bâtir votre Cloud ? » organisé par OCTO Technology</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p><em>Agenda :</em></p>
<ul>
<li>Introduction aux enjeux d’analyse de données en temps réel</li>
<li>Présentation des architectures d’analyse de données</li>
<li>Présentation de la solution Open Source ESPER</li>
<li>Présentation de la solution ActivePivot Sentinel (Quartet FS)</li>
<li>Questions/Réponses</li>
</ul>
<div></div>
<div><a href="http://blog.octo.com/wp-content/uploads/2012/01/Sans-titre2.png"><img class="size-medium wp-image-29506 aligncenter" title="Sans titre" src="http://blog.octo.com/wp-content/uploads/2012/01/Sans-titre2-300x96.png" alt="" width="300" height="96" /></a></div>
<div><span id="more-29501"></span></div>
<p><strong>Définition </strong>: « Un système d’analyse de données temps réel est un système évènementiel disponible, scalable et stable capable de prendre des décisions (actions) avec une latence inférieure à 100ms »</p>
<p>100ms est l&#8217;ordre de grandeur retenu lorsque l&#8217;on parle de &laquo;&nbsp;temps réel&nbsp;&raquo;. Cette valeur permet de prendre les décisions dans un temps adapté au business.</p>
<p><em>Quelles différences avec l’analyse traditionnelle ?</em></p>
<ul>
<li>Les systèmes décisionnels sont construits sur des mécanismes qui imposent la duplication des données… donc avec un temps de latence importants.</li>
<li>Notion de reporting opérationnel c’est à dire sur des données vivantes : on dépasse rapidement les 1000 TPS (transactions par secondes), ce qui est une limite au-delà de laquelle la latence des SGBDR explose (source : TPC.org).</li>
<li>La prise de décision ne peut pas être prise dans la zone de stockage à cause de la latence, mais doit l&#8217;être idéalement en amont (à l’extérieur) pour une meilleure réactivité.</li>
</ul>
<p><em>Quels intérêts pour les entreprises ?</em></p>
<p>Les entreprises sont déjà aujourd’hui confrontées aux problématiques de volumétrie. A cela s’y ajoute 3 nouveaux facteurs majeurs entraînant toujours plus de données dans nos systèmes :</p>
<ul>
<li>Une multiplication des appareils connectés, entraînant une augmentation des évènements qui devront être traités, et l’augmentation des sources d’évènements</li>
<li>Une fusion des poches d’utilisateurs et une augmentation de leur nombre.</li>
<li>Une forte volatilité du trafic (pic de connexion / utilisation) qui suit le rythme du métier (ex : saisonnalités dans le e-Commerce).</li>
</ul>
<p><em>Pourquoi CEP ?</em></p>
<p><strong>Définition </strong>: Le  Complex Event Processing (CEP) est une technique permettant de manipuler des événements au fur et à mesure de leur prise en compte, d&#8217;identifier des relations entre ces événements (corrélation, causalité, patterns), et d&#8217;en tirer de l&#8217;information sous forme de nouveaux événements dits &laquo;&nbsp;dérivés&nbsp;&raquo; ou &laquo;&nbsp;complexes&nbsp;&raquo;.</p>
<p>Le CEP apparaît être une opportunité pour l’analyse et la prise de décision en <strong>temps réel</strong> là ou même le stockage sur cache/grille de données seul peut montrer ses limites :</p>
<ul>
<li>la synchronisation cache/stock sur disque devient un problème sur de gros volumes de données</li>
<li>Le décisionnel implique des requêtes complexes sur des volumes de données importants</li>
</ul>
<p><em>Pourquoi faire converger Big Data et CEP ?</em></p>
<ul>
<li>Pour mieux tirer profit de l’augmentation des volumes de données : les SI ont besoin d’infos de plus en plus détaillées.</li>
<li>Pour permettre des analyses de plus en plus complexes (systèmes de scoring, détection de comportement, machine learning…).</li>
<li>Pour traiter efficacement de nouvelles sources de données (sociales, peu structurées…)</li>
<li>Pour permettre, et c’est un point fondamental, de faire des expérimentations (ie. pouvoir interroger le système, découvrir de nouvelles règles, les tester, les mettre en place et les adapter si besoin).</li>
</ul>
<p>L’intérêt principal du CEP réside dans le traitement en mémoire de l’événement avant son stockage, afin de conserver une<strong> forte réactivité</strong>.</p>
<p><em>Détails sur l’analyse en temps réel :</em></p>
<ul>
<li>Traitement évènementiel à faible latence</li>
<li>Traitement en mémoire</li>
<li>Fonctionnalités de traitement des évènements (jointure de flux corrélés, pattern matching, règles)</li>
<li>Historisation des évènements traités</li>
<li>Simulation sur des données historiques (backtesting)</li>
<li>Des IHM sont présentes et répondent aux questions des données historiques et des données en temps réel (que s’est-il passé/que se passe-t-il ?). Permet de visualiser et d’explorer les données</li>
<li>Il existe des IHM d’édition des règles utilisable directement par les métier / les analystes et sans besoin de développements particuliers.</li>
</ul>
<p><em>Enjeux de l’analyse en temps réel :</em></p>
<ul>
<li>Latence</li>
<li>Débit</li>
<li>Consommation de mémoire</li>
<li>Répartition sur plusieurs nœuds</li>
<li>Reprise sur panne</li>
<li>Initialisation à partir de l’historique</li>
<li>Richesse des interfaces pour l’analyse des données temps-réel et historique</li>
<li>Possibilité de modifier facilement les règles d’analyse et de les valider rapidement</li>
</ul>
<p><em>L’approche peut se faire par :</em></p>
<ul>
<li>des outils de pur <strong>CEP </strong>: (ex : Streambase, Tibco Business Events, Microsoft StreamInsight, ESPER…) : particulièrement performants sur l’analyse des évènements sur des échelles de temps courtes, il faudra leur adjoindre des systèmes de stockage des données historiques, et d’IHM évoluée</li>
<li>des outils de <strong>datagrid </strong>: (ex : SQLFire, GigaSpaces) : très adapté au stockage à fort débit d’écriture, et fournissant des possibilités de traitement des données à chaud (type trigger), ces outils devront être secondés d’IHM évoluées pour répondre au besoin</li>
<li>des outils <strong>OLAP en mémoire </strong>: (ex QuartetFS) : outils très adaptés au cas des analyses multidimensionnelles en temps-réel</li>
</ul>
<div></div>
<div>Démo ESPER (moteur CEP Java) : nous ne sommes pas en mesure de vous proposer les vidéos aujourd&#8217;hui ; nous vous proposons de retrouver les démos en vidéos plus tard.</div>
<p>Démo ActivePivot Sentinel : nous ne sommes pas en mesure de vous proposer les vidéos aujourd&#8217;hui ; nous vous proposons de retrouver les démos en vidéos plus tard.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=29501" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/lanalyse-decisionnelle-en-temps-reel-convergence-entre-big-data-et-complex-event-processing/' rel='bookmark' title='L&#8217;analyse décisionnelle en temps réel Convergence entre Big Data et Complex Event Processing'>L&#8217;analyse décisionnelle en temps réel Convergence entre Big Data et Complex Event Processing</a></li>
<li><a href='http://blog.octo.com/octo-organise-un-petit-dejeuner-sur-le-theme-usability-le-09-octobre-a-paris/' rel='bookmark' title='OCTO organise un petit-déjeuner sur le thème &laquo;&nbsp;Usability&nbsp;&raquo; le 09 octobre à Paris'>OCTO organise un petit-déjeuner sur le thème &laquo;&nbsp;Usability&nbsp;&raquo; le 09 octobre à Paris</a></li>
<li><a href='http://blog.octo.com/video-du-petit-dejeuner-%c2%ab-comment-batir-votre-cloud-%c2%bb-organise-par-octo-technology/' rel='bookmark' title='Vidéo du petit-déjeuner « Comment bâtir votre Cloud ? » organisé par OCTO Technology'>Vidéo du petit-déjeuner « Comment bâtir votre Cloud ? » organisé par OCTO Technology</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/cr-du-petit-dejeuner-organise-par-octo-et-quartet-fs-lanalyse-decisionnelle-en-temps-reel-convergence-entre-big-data-et-complex-event-processing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Génial ! Vous avez encore 6 jours pour proposer votre session !</title>
		<link>http://blog.octo.com/genial-vous-avez-encore-6-jours-pour-proposer-votre-session/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=genial-vous-avez-encore-6-jours-pour-proposer-votre-session</link>
		<comments>http://blog.octo.com/genial-vous-avez-encore-6-jours-pour-proposer-votre-session/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 08:52:26 +0000</pubDate>
		<dc:creator>Céline Pageaux</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[2012]]></category>
		<category><![CDATA[call for paper]]></category>
		<category><![CDATA[proposition]]></category>
		<category><![CDATA[session]]></category>
		<category><![CDATA[USIEvents]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=29474</guid>
		<description><![CDATA[Une date à retenir ? Oui !  Le mardi 31/01/2012 pour nous faire part de vos idées sur les sujets IT, techniques, métiers ou liés aux aspects managériaux de la DSI ! Pas d&#8217;idée de session ? Aucun problème ! Vous pouvez élire votre session préférée en votant pour elle !  D&#8217;ailleurs vous pouvez aussi la partager  pour augmenter le nombre de [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/appel-a-candidature-proposez-votre-session-a-usi-2012/' rel='bookmark' title='Appel à candidature : proposez votre session à USI 2012 !'>Appel à candidature : proposez votre session à USI 2012 !</a></li>
<li><a href='http://blog.octo.com/avez-vous-la-culture-cloud-sur-tv4it-net/' rel='bookmark' title='Avez vous la culture Cloud ? sur tv4it.net'>Avez vous la culture Cloud ? sur tv4it.net</a></li>
<li><a href='http://blog.octo.com/derniers-jours-pour-profiter-de-votre-place-usi-2011-a-20-les-2829-juin-prochains/' rel='bookmark' title='Derniers jours pour profiter de votre place USI 2011 à -20%, les 28&amp;29 juin prochains !'>Derniers jours pour profiter de votre place USI 2011 à -20%, les 28&#038;29 juin prochains !</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p>Une date à retenir ? Oui <strong>!  Le mardi 31/01/2012</strong> pour nous faire part de vos idées sur les sujets IT, techniques, métiers ou liés aux aspects managériaux de la DSI !</p>
<p>Pas d&#8217;idée de session ? Aucun problème ! Vous pouvez <strong>élire</strong><strong> </strong>votre session préférée en votant pour elle !  D&#8217;ailleurs vous pouvez aussi la <strong>partager  pour augmenter le nombre de vote !</strong></p>
<p>Pour rappel : la <strong>qualité du résumé de session proposé</strong> (fond et forme) sera le critère de sélection principal pour l&#8217;équipe USI. Merci donc d’en tenir compte lors du remplissage de ce formulaire.</p>
<p>L’équipe programme étudiera toutes les propositions et sélectionnera les sessions qui lui paraîtront les plus intéressantes. Vous serez peut-être invité à venir présenter votre session lors d’une journée dédiée : mi février et nous informerons de notre décision finale fin mars 2012.</p>
<p><span style="text-decoration: underline;"><a href="http://www.usievents.com/fr/user/edit?cfp=true" target="_blank">Cliquez ici pour soumettre votre session à l’USI</a></span></p>
<p>On attend vos candidatures avec impatience !<span id="more-29474"></span></p>
<p style="text-align: center;"><a href="http://blog.octo.com/wp-content/uploads/2012/01/Sans-titre1.png"><img class="aligncenter size-medium wp-image-29475" title="Sans titre" src="http://blog.octo.com/wp-content/uploads/2012/01/Sans-titre1-300x277.png" alt="" width="300" height="277" /></a></p>
<p>&nbsp;</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=29474" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/appel-a-candidature-proposez-votre-session-a-usi-2012/' rel='bookmark' title='Appel à candidature : proposez votre session à USI 2012 !'>Appel à candidature : proposez votre session à USI 2012 !</a></li>
<li><a href='http://blog.octo.com/avez-vous-la-culture-cloud-sur-tv4it-net/' rel='bookmark' title='Avez vous la culture Cloud ? sur tv4it.net'>Avez vous la culture Cloud ? sur tv4it.net</a></li>
<li><a href='http://blog.octo.com/derniers-jours-pour-profiter-de-votre-place-usi-2011-a-20-les-2829-juin-prochains/' rel='bookmark' title='Derniers jours pour profiter de votre place USI 2011 à -20%, les 28&amp;29 juin prochains !'>Derniers jours pour profiter de votre place USI 2011 à -20%, les 28&#038;29 juin prochains !</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/genial-vous-avez-encore-6-jours-pour-proposer-votre-session/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Petit-déjeuner OCTO &#8211; L&#8217;agilité à grande échelle : Retour d&#8217;experience avec Strator</title>
		<link>http://blog.octo.com/petit-dejeuner-octo-lagilite-a-grande-echelle-retour-dexperience-avec-strator/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=petit-dejeuner-octo-lagilite-a-grande-echelle-retour-dexperience-avec-strator</link>
		<comments>http://blog.octo.com/petit-dejeuner-octo-lagilite-a-grande-echelle-retour-dexperience-avec-strator/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 13:35:35 +0000</pubDate>
		<dc:creator>Lina Benhalouche</dc:creator>
				<category><![CDATA[Général -- NE PAS UTILISER CETTE CATEGORIE]]></category>
		<category><![CDATA[Agilité]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[MOA]]></category>
		<category><![CDATA[Petit-Déjeuner OCTO]]></category>
		<category><![CDATA[retour d'experience]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=29461</guid>
		<description><![CDATA[OCTO organise le mardi 07 février 2012 à partir de 8h45 un petit-déjeuner gratuit, aux Salons Wagram  « L&#8217;agilité à grande échelle » : retour d’expérience en partenariat avec Strator. &#160; Un projet de développement logiciel impliquant 80 personnes, distribuées sur 9 équipes réparties dans 4 pays. Un produit devant soutenir une activité de plus [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/video-du-petit-dejeuner-%c2%ab-comment-batir-votre-cloud-%c2%bb-organise-par-octo-technology/' rel='bookmark' title='Vidéo du petit-déjeuner « Comment bâtir votre Cloud ? » organisé par OCTO Technology'>Vidéo du petit-déjeuner « Comment bâtir votre Cloud ? » organisé par OCTO Technology</a></li>
<li><a href='http://blog.octo.com/octo-organise-un-petit-dejeuner-gestion-des-identites-le-27-janvier-temoignage-d-air-liquide/' rel='bookmark' title='OCTO organise un petit-déjeuner Gestion des Identités le 27 janvier &#8211; Témoignage d&#8217;Air Liquide'>OCTO organise un petit-déjeuner Gestion des Identités le 27 janvier &#8211; Témoignage d&#8217;Air Liquide</a></li>
<li><a href='http://blog.octo.com/octo-organise-un-petit-dejeuner-sur-lagilite-jeudi-12-novembre/' rel='bookmark' title='OCTO organise un petit-déjeuner sur l&#8217;agilité, jeudi 12 novembre'>OCTO organise un petit-déjeuner sur l&#8217;agilité, jeudi 12 novembre</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<p><a title="L'agilité à grande échelle " href="http://www.octo.com/Lagilite-a-grande-echelle.80/Evenements"><img class="aligncenter size-full wp-image-29462" title="bandeau-p-com-strator" src="http://blog.octo.com/wp-content/uploads/2012/01/bandeau-p-com-strator.png" alt="" width="485" height="171" /></a></p>
<p>OCTO organise le mardi 07 février 2012 à partir de 8h45 un <strong>petit-déjeuner gratuit</strong>, aux Salons Wagram  « L&#8217;agilité à grande échelle » : retour d’expérience en partenariat avec Strator.</p>
<p>&nbsp;</p>
<p>Un projet de développement logiciel impliquant <strong>80 personnes</strong>, distribuées sur <strong>9 équipes</strong> réparties dans <strong>4 pays</strong>.<br />
Un produit devant soutenir une activité de <strong>plus de 5 000 000 de transactions de vente par jour</strong>.<br />
Une <strong>première mise en production au bout de 6 mois</strong>.<br />
Et <strong>de nouvelles fonctionnalités tous les deux mois</strong>.</p>
<p>&nbsp;</p>
<p><strong>Qui a dit que l’agile n’était pas adapté aux gros projets ?</strong></p>
<p>Strator et OCTO Technology se proposent de partager avec vous un retour d’expérience sur la mise en place de méthodes agiles à large échelle : feature-teams, communautés de pratique, interactions avec des équipes off-shore, livraisons fréquentes et mises en production par un simple clic, prise de décisions collaboratives&#8230;</p>
<p><span id="more-29461"></span></p>
<p><strong>A l’issue de ce séminaire nous aurons partagé avec vous :</strong></p>
<ul>
<li>Nos Do’s &amp; Don’t à propos des méthodes agiles lorsqu’elles sont appliquées à de gros projets</li>
<li>Les modèles d’organisation que nous avons mis en oeuvre</li>
<li>Nos meilleures pratiques pour diriger des équipes projets géographiquement distribuées</li>
<li>Les outils et les compétences clés pour démarrer un tel projet</li>
</ul>
<p>&nbsp;</p>
<p><strong>Ce petit-déjeuner s’adresse aux :</strong></p>
<ul>
<li>DSI</li>
<li>Chefs de projets</li>
<li>Responsables Innovation / e-business / Internet</li>
<li>Responsables MOA / MOE</li>
<li>Architectes</li>
</ul>
<p>&nbsp;</p>
<p><strong>Intervenant(s) :</strong><br />
Philippe Chevalier &#8211; Strator, Directeur Technique<br />
Hervé Lourdin &#8211; OCTO, Delivery Manager<br />
Mathieu Despriee &#8211; OCTO, Manager</p>
<p>&nbsp;</p>
<p><span style="color: #585858; font-family: Arial,Helvetica; font-size: xx-small;"><em>Ce petit-déjeuner est à destination de nos clients et prospects en priorité.</em></span></p>
<h4 style="text-align: center;"><a href="http://www.octo.com/Lagilite-a-grande-echelle.80/Evenements">Cliquez ici pour vous inscrire au petit-déjeuner : Agilité</a></h4>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=29461" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/video-du-petit-dejeuner-%c2%ab-comment-batir-votre-cloud-%c2%bb-organise-par-octo-technology/' rel='bookmark' title='Vidéo du petit-déjeuner « Comment bâtir votre Cloud ? » organisé par OCTO Technology'>Vidéo du petit-déjeuner « Comment bâtir votre Cloud ? » organisé par OCTO Technology</a></li>
<li><a href='http://blog.octo.com/octo-organise-un-petit-dejeuner-gestion-des-identites-le-27-janvier-temoignage-d-air-liquide/' rel='bookmark' title='OCTO organise un petit-déjeuner Gestion des Identités le 27 janvier &#8211; Témoignage d&#8217;Air Liquide'>OCTO organise un petit-déjeuner Gestion des Identités le 27 janvier &#8211; Témoignage d&#8217;Air Liquide</a></li>
<li><a href='http://blog.octo.com/octo-organise-un-petit-dejeuner-sur-lagilite-jeudi-12-novembre/' rel='bookmark' title='OCTO organise un petit-déjeuner sur l&#8217;agilité, jeudi 12 novembre'>OCTO organise un petit-déjeuner sur l&#8217;agilité, jeudi 12 novembre</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/petit-dejeuner-octo-lagilite-a-grande-echelle-retour-dexperience-avec-strator/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

