{"id":10038,"date":"2013-10-28T08:07:02","date_gmt":"2013-10-28T07:07:02","guid":{"rendered":"http:\/\/flaven.fr\/?p=10038"},"modified":"2013-11-12T05:59:28","modified_gmt":"2013-11-12T04:59:28","slug":"performance-web-api-les-bonnes-pratiques-pour-optimiser-les-performances-dun-site-ou-dune-webapp","status":"publish","type":"post","link":"https:\/\/flaven.fr\/2013\/10\/performance-web-api-les-bonnes-pratiques-pour-optimiser-les-performances-dun-site-ou-dune-webapp\/","title":{"rendered":"Performance, Web, API &#8211; Les bonnes pratiques pour optimiser les performances d&#8217;un site ou d&#8217;une webapp"},"content":{"rendered":"\n<p><!--  Performance, Web, API - Les bonnes pratiques pour optimiser les performances d'un site ou d'une webapp --><br \/>\n\t<!--  Performance, Web, API, H\u00e9bergement, Coud, d\u00e9di\u00e9, mutualis\u00e9, Yslow, bonnes pratiques, Steve Souders, Cache, Amazon, Azure, Akamai, Andrew G King, Website Optimization --><\/p>\n<p>\tQue l&#8217;on soit \u00e0 la t\u00eate d&#8217;un site important ou de taille modeste, c&#8217;est \u00e0 dire d\u00e9j\u00e0 avec une grosse volum\u00e9trie de donn\u00e9es. La question de la performance et de la vitesse d&#8217;accession aux donn\u00e9es est cl\u00e9. Cette pr\u00e9occupation est encore plus vraie lorsque vous vous appr\u00eatez ou que vous \u00eates en train de travailler sur le dimensionnent d&#8217;une API qui va par exemple fournir des flux de donn\u00e9es non pas seulement \u00e0 un site web mais \u00e0 plusieurs sites web, \u00e0 des applications mobiles et tablettes \u00e0 des applications de TV connect\u00e9e et le tout par exemple en plusieurs langues.<br \/>\n  Dans ce cas, il va falloir avant de se lancer dans le d\u00e9veloppement d&#8217;une tel API, avoir en t\u00eate la performance en-user constamment en ligne de mire sinon vous risquez la catastrophe.<\/p>\n\t\t\t\t\t<div class=\"textwidget-unique text\">\n\n\t\t\t\t\t        <div class=\"textwidget-photo\">\n\t\t\t\t\t                <a href=\"https:\/\/flaven.fr\/books\/high-performance-web-sites-essential-knowledge-for-frontend-engineers\/\" class=\"photo\" title=\"High Performance Web Sites: Essential Knowledge for Frontend Engineers\"><img loading=\"lazy\" decoding=\"async\" alt=\"High Performance Web Sites: Essential Knowledge for Frontend Engineers\" src=\"http:\/\/ecx.images-amazon.com\/images\/I\/5169mD4idJL._SL160_.jpg\" width=\"122\" height=\"160\"><\/a>\n\t\t\t\t\t            <\/div>\n\t\t\t\t\t\t<div class=\"info half\">\n\t\t\t\t\t\t\t<h2 class=\"product-title\"><a class=\"head\" href=\"https:\/\/flaven.fr\/books\/high-performance-web-sites-essential-knowledge-for-frontend-engineers\/\" title=\"High Performance Web Sites: Essential Knowledge for Frontend Engineers\">High Performance Web Sites: Essential Knowledge for Frontend Engineers<\/a><\/h2>\n\t\t\t\t\t\t\t\n\t\t\t\t\t        <p class=\"product-excerpt\">Un livre succinct mais bien fait, pas long, tout ce qu'il faut savoir sur l'optimalisation d'un site, d'une API (gzip activ\u00e9, http request minimis\u00e9...etc.). Un compte-rendu est disponible sur ce site avec quelques retours d'usage maison.<\/p>\n\t\t\t\t\t\t\t\tGenre(s) : <a href=\"https:\/\/flaven.fr\/book-type\/ajax\/\" rel=\"tag\">Ajax<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/amazon\/\" rel=\"tag\">Amazon<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/analyse-medias-digital-storytelling\/\" rel=\"tag\">Analyse<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/apache-serveur\/\" rel=\"tag\">Apache<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/api\/\" rel=\"tag\">API<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/apis\/\" rel=\"tag\">APIs<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/applications\/\" rel=\"tag\">Applications<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/azure-platform\/\" rel=\"tag\">Azure Platform<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/cloud\/\" rel=\"tag\">Cloud<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/developpement-open-source\/\" rel=\"tag\">D\u00e9veloppement<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/direction-de-projet-agile\/\" rel=\"tag\">Direction de projet<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/google-tv\/\" rel=\"tag\">Google TV<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/html5\/\" rel=\"tag\">HTML5<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/hypermedia-2\/\" rel=\"tag\">Hypermedia<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/memcached\/\" rel=\"tag\">Memcached<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/marketing-multicanal\/\" rel=\"tag\">Multicanal<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/open-source-agile-developpement\/\" rel=\"tag\">Open Source<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/pratique\/\" rel=\"tag\">Pratique<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/referencement\/\" rel=\"tag\">R\u00e9f\u00e9rencement<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/roi-roiste\/\" rel=\"tag\">ROI<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/savoirs\/\" rel=\"tag\">Savoirs<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/social-tv\/\" rel=\"tag\">Social TV<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/tablette\/\" rel=\"tag\">Tablette<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/television\/\" rel=\"tag\">T\u00e9l\u00e9vision<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/web-storytelling-digital\/\" rel=\"tag\">Web<\/a>, <a href=\"https:\/\/flaven.fr\/book-type\/web-apps\/\" rel=\"tag\">Web Apps<\/a><br>Auteur(s) : <a href=\"https:\/\/flaven.fr\/book-author\/steve-souders\/\" rel=\"tag\">Steve Souders<\/a><br>Edition(s) : <a href=\"https:\/\/flaven.fr\/book-description\/oreilly-media\/\" rel=\"tag\">O'Reilly Media<\/a><br>\n\t\t\t\t\t<div class=\"but-wrap\"><a href=\"http:\/\/www.amazon.fr\/High-Performance-Web-Sites-Essential\/dp\/0596529309%3FSubscriptionId%3DAKIAJYB2QGGQOTHQLRPA%26tag%3Dhecubenet-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0596529309\" class=\"button\"><span><i class=\"more\"><\/i>+ d'infos<\/span><\/a><\/div>\n\t\t\t\t\t\t<\/div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\n<p>  Voici donc un tr\u00e8s\/trop r\u00e9sum\u00e9 les 14 &#8220;guidelines&#8221; qui doivent \u00eatre comprises et pr\u00e9sentes lorsque on se lance dans le d\u00e9veloppement d&#8217;un site mais aussi et plus encore d&#8217;une API sinon c&#8217;est un peu comme se lancer dans la plong\u00e9e sous-marine sans bouteille d&#8217;oxyg\u00e8ne, l&#8217;apn\u00e9e n&#8217;est pas \u00e0 la port\u00e9e du premier venu.<\/p>\n<p>  Ces recommandations sont tir\u00e9es d&#8217;un livre d\u00e9j\u00e0 ancien mais qui reste malgr\u00e9 tout d&#8217;actualit\u00e9 <code>High Performance Web Sites<\/code> de Steve Souders.<br \/>\n  <i>Source : http:\/\/stevesouders.com\/<\/i><\/p>\n<p>  Pour ceux qui douteraient de la v\u00e9racit\u00e9 des r\u00e8gles \u00e9nonc\u00e9es ci-dessous, une petite biographie de Steve Souders suffira \u00e0 faire taire les esprits les plus dubitatifs. Pour information, Steve Souders est monsieur Performance chez Google (excusez du peu). Chez Google, il est le grand manitou qui travaille sur les performances Web et les initiatives open source. Au vu des r\u00e9sultats, je veux parler des performances de google comme webservice et non d&#8217;un point de vue financier, il est fort \u00e0 parier que ce monsieur connait son affaire. Il la connait d&#8217;autant mieux qu&#8217;il occupait le m\u00eame poste chez Yahoo ! Il est qui plus est la cr\u00e9ateur de <code>YSlow<\/code> qui doit faire parti avec <code>FireBug<\/code> des add-ons Firefox indispensables \u00e0 tout personne qui s&#8217;int\u00e9resse de pr\u00e8s ou de loin au web.<\/p>\n<p>  Ceux qui doutent encore me jettent la premi\u00e8re pierre&#8230;. Bon les bonnes pratiques maintenant en mati\u00e8re de performances. Pour certaines de ces r\u00e8gles, il est mentionn\u00e9 <code>trivial<\/code> car elles ont la force de \u00e9vidence et ne demande pas \u00eatre expliqu\u00e9, une recherche sur Google est suffisante.<\/p>\n<ul class=\"sf-list list-star_bw\">\n<li>1 &#8211; Faire moins de requ\u00eates HTTP<br \/>\n<code>Trivial<\/code> que ce soit avec un CMS ou avec un framework les requ\u00eates HTTP sont une ressource rare \u00e0 pr\u00e9server et \u00e0 utiliser avec parcimonie et son acolyte arm\u00e9nien &#8220;\u00e0 bon escient&#8221;.\n<\/li>\n<li>2 &#8211; Utiliser un Content Delivery Network<br \/>\n  Trivial si on en a les moyens mais Akamai co\u00fbte cher comme les solutions Cloud Amazon ou Windows Azure d&#8217;ailleurs qui peuvent \u00e0 leur mani\u00e8re \u00eatre utilis\u00e9 comme solution de caching, nous avons pratiqu\u00e9 la question avec 3WDOC.\n<\/li>\n<li>3 &#8211; Ajouter un en-t\u00eate Expires<br \/>\n  Ajouter un en-t\u00eate Expire lointain dans le temps pour les \u00e9l\u00e9ments de contenu. On s&#8217;appuie \u00e0 fond sur le cache du navigateur.<\/p>\n<li>4 &#8211; Utiliser les Composants gzip<br \/>\n  Il faut activer un bon mode <code>mod_gzip<\/code>, <code>mod_deflate<\/code> selon la version d&#8217;Apache sur votre serveur. Il est aussi vivement conseiller de virer l&#8217;indentation des flux JSON si vous avez recours \u00e0 ce format dans le cas d&#8217;une API qui distribue du contenu. Une sorte de minification du transport de donn\u00e9es.<br \/>\n  <b>Ce qui se dit c&#8217;est que si on &#8220;Gzippe&#8221; tous les \u00e9l\u00e9ments d&#8217;une page. On peut arriver \u00e0 diminuer de 70% le poids moyen d&#8217;une page et de facto r\u00e9duire de 50% le temps de chargement de ladite page. Int\u00e9ressant.<\/b>\n  <\/li>\n<li>5 &#8211; Mettre les feuilles de style en top<br \/>\n  <code>Trivial<\/code>. Une bonne pratique tout simplement.\n  <\/li>\n<li>6 &#8211; Mettre Scripts en bottom<br \/>\n    <code>Trivial<\/code>. Une autre bonne pratique tout simplement.\n  <\/li>\n<li>7 &#8211; \u00c9viter les expressions CSS<br \/>\n  <code>Trivial<\/code>. De toutes les fa\u00e7ons, on est en Less (<a href=\"http:\/\/lesscss.org\/\" target=\"_blank\">http:\/\/lesscss.org\/<\/a>) ou on s&#8217;appuie sur des solutions type Boilerplate (<a href=\"http:\/\/html5boilerplate.com\/\" target=\"_blank\">http:\/\/html5boilerplate.com\/<\/a>) ou Bootstrap (<a href=\"http:\/\/getbootstrap.com\" target=\"_blank\">http:\/\/getbootstrap.com<\/a>). Pourquoi r\u00e9inviter la roue&#8230;.\n  <\/li>\n<li>8 &#8211; Placer le JavaScript et les CSS en appel externe<br \/>\n  Embedder dans les pages, pour debugger ou d\u00e9velopper, mais lorsque on le passe \u00e0 la mise en production, il est bien conseill\u00e9 de faire des appels externes de sorte que ces composants CSS ou\/et Javascript peuvent \u00eatre mis en caches dont toutes les pages qui seront vues apr\u00e8s le premier appel seront plus rapides. Cela est vrai si vous \u00eates chez h\u00e9bergeur &#8220;cheap&#8221; ou vous avez pris une Ferrari comme environnement de production.<\/p>\n<p>  Dans un article pr\u00e9c\u00e8dent, nous nous sommes l\u00e9g\u00e8rement pencher sur la question. Voir <a href=\"https:\/\/flaven.fr\/2013\/04\/memcached-varnish-la-problematique-du-caching-pour-des-sites-a-fort-trafic\/\" target=\"_blank\">Memcached, Varnish \u2013 La probl\u00e9matique du caching pour des sites \u00e0 fort trafic<\/a>\n  <\/li>\n<li>9 &#8211; R\u00e9duire les recherches DNS<br \/>\n  Il faut r\u00e9duire  au maximum les recherches DNS en utilisant la fonction de maintien en activit\u00e9 du protocole HTTP <code>Keep-Alive<\/code> et surtout limiter autant que possible le nombre de domaines. Il existe le jeu perilleux de jouer avec les &#8220;time-to-live&#8221; (TTL) mais dans ce cas pr\u00e9sent, il faut mieux faire appel \u00e0 un administrateur r\u00e9seau, il doit bien servir \u00e0 quelques chose.\n  <\/li>\n<li>10 &#8211; Minifier le JavaScript<br \/>\n  <code>Trivial<\/code>. Une excellente pratique.\n  <\/li>\n<li>11 &#8211; Eviter les redirections<br \/>\n  Eviter autant que faire se peut de faire des redirections dans tous les sens.\n  <\/li>\n<li>12 &#8211; Supprimer les doublons de Scripts<br \/>\n  <code>Trivial<\/code>. Eviter les redondances comme charger n fois jQuery par exemple, pas toujours \u00e9vident \u00e0 faire respecter lorsque vous faites appel des solutions tierces genre tracking, solution video&#8230; puisque tous ces braves prestataires vous impose parfois d&#8217;embarquer leur version jQuery par exemple donc inclure tous les scripts en une seule fois n&#8217;est pas forcement chose ais\u00e9e.\n  <\/li>\n<li>13 &#8211; Configurer les ETags<br \/>\n  Jamais bien compris mais bon, le dilemme est simple soit les ETagss sont \u00e0 reconfigurer ou carr\u00e9ment \u00e0 enlever les ETags.\n  <\/li>\n<li>14 &#8211; Faire en sorte que l&#8217;Ajax soit cach\u00e9<br \/>\n  Conseil nettement plus int\u00e9ressant que le precedent. L&#8217;usage veut que les IHM, tr\u00e8s UX, soient gav\u00e9s d&#8217;Ajax. Il faut donc s&#8217;assurer que les requ\u00eates Ajax, puissent \u00eatre cach\u00e9s par exemple et suivent vraiment des directives de performance, en particulier en ayant en-t\u00eate Expire lointain\n  <\/li>\n<\/ul>\n<p>  <b>Conclusion : si vous avez appliqu\u00e9 \u00e0 la lettre ces bonnes pratiques, vous minimisez les chances d&#8217;avoir de tr\u00e8s mauvaise surprises en terme de performance et donc d&#8217;affichage. Vous pouvez d&#8217;ailleurs mesurer concr\u00e8tement le ROI de chacune de ces mesures avec l&#8217;aide de l&#8217;utilitaire de monsieur Souders, YSLOW. Merci Steve.<\/b><\/p>\n<h2>En savoir plus<\/h2>\n<ul>\n<li>Steve Souders &#8211; High Performance Web Sites, la voix du maitre<br \/><a href=\"http:\/\/stevesouders.com\/\" target=\"_blank\">http:\/\/stevesouders.com\/<\/a><\/li>\n<li>High Performance Web Sites<br \/><a href=\"http:\/\/stevesouders.com\/hpws\/\" target=\"_blank\">http:\/\/stevesouders.com\/hpws\/<\/a><\/li>\n<li>YSlow pour Chrome<br \/><a href=\"https:\/\/chrome.google.com\/webstore\/detail\/yslow\/ninejjcohidippngpapiilnmkgllmakh\" target=\"_blank\">https:\/\/chrome.google.com\/webstore\/detail\/yslow\/ninejjcohidippngpapiilnmkgllmakh<\/a><\/li>\n<li>YSlow pour Firefox<br \/><a href=\"https:\/\/addons.mozilla.org\/fr\/firefox\/addon\/yslow\/\" target=\"_blank\">https:\/\/addons.mozilla.org\/fr\/firefox\/addon\/yslow\/<\/a><\/li>\n<li>Un autre opus de Steve Souders<br \/><a href=\"http:\/\/www.amazon.com\/dp\/0596522304?tag=stevsoud-20&#038;camp=213381&#038;creative=390973&#038;linkCode=as4&#038;creativeASIN=0596522304&#038;adid=09TZDJ7Z5GDMJPAM6XC6&#038;\" target=\"_blank\">Even Faster Web Sites: Performance Best Practices for Web Developers<\/a><\/li>\n<li>Un autre sp\u00e9cialiste de la question Andrew G King de Website Optimization<br \/><a href=\"http:\/\/www.websiteoptimization.com\/\" target=\"_blank\">http:\/\/www.websiteoptimization.com\/<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Que l&#8217;on soit \u00e0 la t\u00eate d&#8217;un site important ou de taille modeste, c&#8217;est \u00e0 dire d\u00e9j\u00e0 avec une grosse volum\u00e9trie de donn\u00e9es. La question&hellip; <\/p>\n<p class=\"text-center\"><a href=\"https:\/\/flaven.fr\/2013\/10\/performance-web-api-les-bonnes-pratiques-pour-optimiser-les-performances-dun-site-ou-dune-webapp\/\" class=\"more-link\">Continue reading &rarr; <span class=\"screen-reader-text\">Performance, Web, API &#8211; Les bonnes pratiques pour optimiser les performances d&#8217;un site ou d&#8217;une webapp<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":10040,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"bf_ai_meta_description":"Optimisez les performances de votre site ou webapp avec des pratiques \u00e9prouv\u00e9es. Utilisez les bons outils pour des r\u00e9sultats concrets.","bf_ai_og_title":"Optimiser performances Web, API","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[3439,3440,3441,3444,3447,3448,3450,3451],"tags":[1918,478,1919,2183,1917,1910,582,1904,1905,2215,1906,589,1915,2182,1920,1916],"class_list":["post-10038","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apis-integration","category-cloud-infrastructure","category-data-analytics","category-programming-databases","category-technology-trends","category-tools-productivity","category-ux-product-design","category-web-design-front-end","tag-akamai","tag-amazon","tag-andrew-g-king","tag-api","tag-azure","tag-bonnes-pratiques","tag-cache","tag-coud","tag-dedie","tag-hebergement","tag-mutualise","tag-performance","tag-steve-souders","tag-web","tag-website-optimization","tag-yslow"],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p3Vuhl-2BU","jetpack_featured_media_url":"https:\/\/flaven.fr\/wp-content\/uploads\/2013\/10\/regles_haute_performances_website_bf.jpg","_links":{"self":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/comments?post=10038"}],"version-history":[{"count":5,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10038\/revisions"}],"predecessor-version":[{"id":10123,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10038\/revisions\/10123"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/media\/10040"}],"wp:attachment":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/media?parent=10038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/categories?post=10038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/tags?post=10038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}