SlideShare une entreprise Scribd logo
1  sur  71
Télécharger pour lire hors ligne
{theme:”API”, subject:”cache”}
Ippon Technologies © 2014
Présentation
Ippon Technologies © 2014
/ippon/dmartin
David MARTIN…
… Ippon Technologies
… Directeur du Pôle Conseil et Formation
… Développeur depuis … quelques années :)
… Intéressé par les API Web, le style d’architecture REST…
Ippon Technologies © 2014
Parlons vrai, parlons cache !
Ippon Technologies © 2014
Let’s start
“La plus performante requête…
… est celle qu’on n’a pas à faire”
Un inconnu
Ippon Technologies © 2014
{subject:”cache”}
Parlons un peu de vous…
… vous allez créer une API Web
… vous avez créé une API Web
Ippon Technologies © 2014
{subject:”cache”}
Dans le premier cas, vous vous posez quelques questions
AVANT → C’est BIEN
Dans le second cas, vous vous posez des questions
PENDANT/APRÈS → C’est toujours mieux que de ne pas se
poser de question ;) Mais certains de vos choix seront peut être
bloquants
Ippon Technologies © 2014
Les constats
Quelques constats…
Les ressources ne partagent pas toutes le même cycle de
vie...
Certaines changent vraiment très peu...
Et pourtant elles peuvent être très demandées…
Et induire une forte charge sur le serveur...
Ippon Technologies © 2014
Les constats
On peut identifier des cycles de vie macroscopiques, associés
à des types d’entités…
Exemple : Une ressource représentant une cotation boursière
évolue à un rythme différent d’une ressource représentant l’
entreprise cotée.
Ippon Technologies © 2014
Les constats
Mais deux ressources de même nature peuvent aussi avoir des
cycles de vie radicalement éloignés…
Tout le monde n’actualise pas sa page Facebook à la même
fréquence...
Ippon Technologies © 2014
Les questions
La question évidente que tout le monde se pose…
… peut on économiser du traitement, de la bande passante,
... sur la lecture des données ?
Ippon Technologies © 2014
Les questions
Ou, dit autrement...
… Comment mettre en place du cache sur mon API ?
Ippon Technologies © 2014
Flashback
Avant toute chose, quelques rappels…
Sur ce qu’est/devrait être une API Web...
Ippon Technologies © 2014
Flashback
Pour cela, commençons par ce que ce n’est pas…
Une API Web n’est pas…
… la réincarnation des Web Services SOAP en JSON
… un énième hommage au RPC
… un simple service qui retourne du JSON
… une histoire de jolies URLs
Ippon Technologies © 2014
Flashback
Une API Web est (DOIT ETRE)…
… un service orienté ressource et non méthode/action
… appelée à être consommée par un client HTTP
… construite pour tirer profit du protocole HTTP
… autant que possible respectueuse des principes du style d’
architecture REST
… idéalement construite autour des relations hypermédia
Ippon Technologies © 2014
REST - piqure de rappel
N’est pas API REST qui veut…
… Et chaque service - ou API Web - n'atteint pas le même
niveau de conformité :
Niveau 0 : RPC like… WS-* style...
Niveau 1 : Notion de ressources
Niveau 2 : Utilisation à bon escient des verbes HTTP
Niveau 3 : Hypertext As The Engine Of Application State
Maturity Model par Leonard Richardson
Ippon Technologies © 2014
So what?
L’API Web doit donc tirer profit du protocole HTTP …
… Et pour le cache, qu’en dit la RFC 2616 (Hypertext Transfer
Protocol - HTTP/1.1) ?
… Le cache est au coeur du protocole et son usage est plus
que conseillé, d’autant qu’il présumé transparent, selon cette
définition :
[...]A cache behaves in a "semantically transparent" manner,
with respect to a particular response, when its use affects
neither the requesting client nor the origin server,
except to improve performance.[...]
Ippon Technologies © 2014
Et les caches applicatifs ?
Le protocole HTTP propose donc une solution pour mettre en
cache de l’information…
… Mais il existe d’autres solutions de cache (applicatif par
exemple) très faciles à intégrer au code d’une API…
… Alors pourquoi se soucier du cache HTTP ?
Ippon Technologies © 2014
Et les caches applicatifs ?
Parce que le cache HTTP va travailler avec des
représentations sérialisées, permettant l’économie de la (dé)
sérialisation des requêtes et réponses
Et la sérialisation/désérialisation est coûteuse !
Ajoutons à cela qu’un cache HTTP peut être très facilement
ajouté et à tout moment, sans impact sur le code de votre API
Ippon Technologies © 2014
Allons-y pour le cache HTTP
Essayons de comprendre maintenant comment cela
fonctionne…
… et ce que cela peut apporter à une API Web
Ippon Technologies © 2014
Vocabulaire...
Avant tout chose, entendons nous sur certains termes...
Ippon Technologies © 2014
Caches HTTP : private / shared
Un cache peut être :
● privé (non partagé, “non-shared”)
○ Accessible par un seul utilisateur. Le cache de votre navigateur est
présumé privé.
● partagé (“shared”)
○ Tout autre cache. Ce sera le cas d’un système dédié dans une
infrastructure.
Ippon Technologies © 2014
Caches HTTP : origin server
Notion de serveur d’origine…
… sera le serveur d’où provient à l’origine la donnée
potentiellement mise en cache
Ippon Technologies © 2014
Caches HTTP : validator
Notion de validateur…
… sera un élément du protocole utilisé pour déterminer si une
entité est bien identique à une autre
Ippon Technologies © 2014
Étudions ce que HTTP propose
Principe général d’un cache : stocker une entité éventuellement
associée à une information de validité…
… HTTP propose plusieurs “outils” pour contrôler le
comportement du cache…
● Time To Live (Expires…)
● Cache-Control et ses nombreuses directives...
● ETags (ou entity tags)
Ippon Technologies © 2014
Comment gérer le cycle de vie ?
L’approche la plus simple repose sur le Time To Live…
… donner au cache une information de péremption concernant
la réponse
… HTTP 1.1 permet à un serveur d’exprimer cette notion de
différentes façons via les headers :
● Expires
● Cache-Control (max-age)
… Mais un serveur de cache peut aussi gérer cela “seul” en l’
absence d’information coté serveur (“Expiration heuristique”)
● En se basant sur Last-Modified par exemple
Ippon Technologies © 2014
Zoom sur Expires
Expires (depuis HTTP 1.0)
Permet de spécifier la date, au format RFC 1123, à partir de
laquelle la ressource est présumée obsolète
Expires: Tue, 18 Nov 2014 18:15:11 GMT
Ippon Technologies © 2014
Zoom sur Cache-Control
Cache-Control(max-age)
Permet de spécifier en secondes le temps de validité de la
ressource retournée (maximum autorisé : 1 année)
Cache-Control: max-age=120
En cas de présence d’Expires et de Cache-Control(max-age),
c’est ce dernier qui est retenu
Ippon Technologies © 2014
Zoom sur Cache-Control
Cache-Control...
… C’est aussi beaucoup d’autres
directives
… Pas abordées toutes ici
… Assez nébuleuses lors d’une
première lecture
Ippon Technologies © 2014
Zoom sur Cache-Control
Cache-Control…
… Pour s’y retrouver, Google
propose ce diagramme assez
utile
https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching#defining-optimal-cache-control-policy
Ippon Technologies © 2014
Retour au cache
Revenons au cache HTTP de façon plus générale...
Ippon Technologies © 2014
Comment ça fonctionne ?
Le fonctionnement est ensuite relativement simple…
… pour toute requête, une correspondance en cache est
recherchée (si pas de contre ordre)
… si elle est trouvée et qu’elle est “encore fraîche”, elle est
retournée,
… si elle est trouvée mais “n’est plus très fraîche”, une
demande auprès du serveur d’origine est émise,
… si elle n’est pas trouvée, elle est demandée au serveur d’
origine
Ippon Technologies © 2014
Retour au cache
Tout repose donc sur cette notion de fraîcheur…
… Une entité sera présumée “fraîche” si son âge (pouvant être
défini de plusieurs façons) est en conformité par rapport à la
règle d’expiration (exprimée ou heuristique)
… Au delà, elle est présumée périmée !
… Mais peut être ne l’est elle pas ? Comment savoir ?
… En allant vérifier !
Ippon Technologies © 2014
Vérifications optimisées
Les requêtes conditionnelles
Un cache HTTP revalidera une ressource auprès du serveur d’
origine en utilisant une requête conditionnelle
Kécécé ?
Il s’agit d’une requête qui ne retournera une représentation
QUE si nécessaire, et un 304 Not Modified sans corps sinon
Exemple : un GET avec un header If-Modified-Since valorisé
avec le Last-Modified de l’entité en cache
Ippon Technologies © 2014
Attention aux limites...
Les limites de la validation avec une date
Revalider une entité avec une date, dont la précision est la
seconde, ne garantit pas d’obtenir la donnée plus récente.
Un cache intermédiaire peut avoir récupéré la ressource à T et
celle-ci avoir été modifiée sur le serveur d’origine à T+0.1
seconde.
Sa ressource est vue comme “fraîche”, et pourtant...
Le validateur utilisé ici est considéré comme “faible”
Ippon Technologies © 2014
Valider “fortement” une entité : ETag
ETag : le validateur fort
Le protocole a donc prévu ce cas…
… en permettant de retourner une “clef” identifiant l’état d’une
ressource : un tag décrivant l’entité (ie: entity tag ou ETag)
Cette valeur peut être alors utilisée pour demander au serveur
si cette version de ressource est toujours “fraîche” ou non
GET + (If-(None-)Match) + Etag
Note : la spec HTTP conseille de retourner un ETag, sauf si par
exemple le calcul de celui-ci impose un coût trop important
Ippon Technologies © 2014
Allons plus loin encore...
Tout ceci est pas mal, mais il y a mieux…
… Le cache HTTP est aussi prévu pour être invalidé
… Les requêtes dites “unsafe” : PUT, DELETE et POST (ou
toute autre inconnue) vont marquer les entités du cache
comme invalides
Ippon Technologies © 2014
Allons plus loin encore, en images...
GET /people/lucy
Cache Origin
PUT /people/lucy
Cache Origin
Ippon Technologies © 2014
Que peut on tirer de ceci dans une API Web ?
… plus qu’on ne pense !
… Voici quelques exemples concrets
Et les API là dedans ?
Plein d’exemples ici
Ippon Technologies © 2014
Et les API là dedans ?
La requête :
POST /people
… va invalider la représentation en cache de /people
… mais si combinée avec une réponse du type
[303 - See Other] + Location: /people/lucy ?
… ou encore (mieux) avec une réponse :
[20X] + Content-Location: /people/lucy ?
Ceci représente toujours Lucy
Ippon Technologies © 2014
Et les API là dedans ?
La requête :
DELETE /people/lucy
… va invalider la représentation en cache de /people/lucy
… mais si combinée avec une réponse du type
[303 - See Other] + Location: /people ?
… ou :
[20X] + Content-Location: /people ?
Ippon Technologies © 2014
Tout ceci est valable si...
Attention / Warning / Achtung / 關注
Condition importante pour que cela fonctionne...
… L’URL ne doit pas servir à décrire la modification de l’état d’
une ressource :
● POST /people/lucy/smile
● POST /people
Ippon Technologies © 2014
Quid des collections ?
Plusieurs façons d’envisager les collections :
● Full hypermédia : la collection est un ensemble de liens vers
les entités
● Embarquées : les états des entités sont retournés dans la
réponse
Les stratégies de cache devront considérer ces cas en fonction
de différents paramètres
Ippon Technologies © 2014
Content Negotiation
Négociation de contenu…
… Une Web API peut proposer de retourner une représentation
sous différents formats (JSON, XML, HTML…)
Différentes façons le permettent :
● GET /resources/res1.json, GET /resources/res1.xml
● GET /resources/res1?format=json (xml)
● GET /resources/res1 + Accept: application/json (xml)
Ippon Technologies © 2014
Content Negotiation
● GET /resources/res1.json, GET /resources/res1.xml
○ L’URL sert de clef pour le cache. Pas de risque de recevoir une
réponse JSON si res1.xml est demandée
○ Par contre, l’invalidation ne concernera qu’une seule
représentation...
● GET /resources/res1?format=json (xml)
○ Mêmes remarques qu’au dessus
Ippon Technologies © 2014
Content Negotiation
● GET /resources/res1 + Accept: application/json (xml)
○ A première vue, c’est mal engagé… une même URL, plusieurs
représentations selon la valeur d’un header…
○ Mais c’est sans compter sur Vary
■ Vary est un header positionné sur les réponses
■ Il informe les caches des données à considérer pour choisir une
représentation alternative
■ Vary: Accept dans notre cas serait donc apprécié!
Encore une fois, tout existe déjà dans la spécification
Ippon Technologies © 2014
Oui mais..., encore...
Mais les choses ne sont jamais simples…
Ippon Technologies © 2014
Un cache, deux caches, n caches...
Et le chemin qu’emprunte une requête peut très bien ne pas
être le même que la requête suivante…
Ce qui signifie que si une requête “unsafe” a invalidé un
ensemble de caches, le prochain GET n’en bénéficiera peut
être pas…
Il faut donc apprendre à vivre avec des représentations
potentiellement obsolètes
Ippon Technologies © 2014
Accepter l’obsolescence
En utilisant les headers de pré-condition…
… Pour rappel If-None-Match, If-Match (et à défaut If-Modified-
Since, If-Unmodified-Since)
… Sur une action réputée “unsafe”
… Permet sur une réponse :
412 Precondition Failed
de réagir en conséquence
No more race condition!
Antisèche
Ippon Technologies © 2014
Accepter l’obsolescence
Demander une ressource au serveur d’origine en by-passant
les caches ?
C’est possible !
no-cache ou max-age=0 (Cache-Control) permettent de
traverser tous les caches jusqu’au serveur d’origine
● no-cache : la réponse ne pourra pas être utilisée par les
caches pour les prochaines requêtes
● max-age=0 : va aussi permettre de mettre à jour les entités
en cache
Ippon Technologies © 2014
...
2 secondes de pause pour digérer tout ça
Ippon Technologies © 2014
...
1 seconde...
Ippon Technologies © 2014
Subtilités… toujours...
Tout est ok pour activer le cache, n’est-ce pas ?
Ce n’est malheureusement pas si simple…
… Il existe des subtilités à connaître, comme :
“Note that Authorization normally prevents a shared cache
from saving and returning a response to a previous request
if that request included an Authorization header.”
http://pretty-rfc.herokuapp.com/RFC2616#response.cacheability
Ippon Technologies © 2014
Authorization, mon ennemi ?
Pourquoi utiliser Authorization ?
Pour permettre au “user-agent” de s’authentifier auprès du
serveur d’origine…
… Pour pouvoir restreindre l’accès aux ressources ou à
certaines données des ressources
… Pour mesurer et contrôler les accès au serveur (quotas, …)
Ippon Technologies © 2014
Authorization, mon ennemi ?
Quelles solutions ?
A étudier selon les cas d’utilisation :
● Forcer la mise en cache avec éviction de certaines données
(Cache-Control(no-cache=QQCHOSE))
● Ne pas utiliser Authorization sur l’ensemble des ressources
accédées
● Utiliser un reverse proxy qui se chargera des contrôles d’
authentification, vérification des quotas, ... et permettra l’
utilisation d’un cache pour la requête sortante
Ippon Technologies © 2014
Subtilités… toujours...
Ok pour Authorization, mais si mon API est accédée en
HTTPS ?
Alors certaines contraintes vont aussi s’appliquer…
… Les caches partagés ne pourront pas être utilisés
… Les caches privés éventuellement
Ippon Technologies © 2014
Et si le client n’est pas un browser
Une API Web peut être consommée par autre chose d’une
application AngularJS…
… Heureusement :)
… Et si le client est une autre application Java, peut on
bénéficier d’un cache privé ?
… Oui! Enfin, si le client HTTP utilisé en propose un :)
Ippon Technologies © 2014
Apache HttpClient Cache
Apache HttpClient dispose d’un mécanisme de cache privé
avec 3 implémentations disponibles :
● simple/simpliste : stockage dans une LinkedHashMap
● A base de EHCache
● Avec des morceaux de memcached
Ippon Technologies © 2014
Coté développeur
Tant coté serveur que coté client, la manipulation des headers
va donc être importante…
… Coté serveur : Response/CacheControl (JAX-RS),
HttpEntity/HttpHeaders (Spring MVC) permettront de travailler
les valeurs transmises au client
… Coté client : une requête Ajax aura accès aux headers tout
comme Apache HttpClient pour un client Java
Ippon Technologies © 2014
Coté développeur
Quelques règles utiles :
● Cache HTTP et cache applicatif ne sont pas exclusifs
● ETags : Définissez une stratégie économique pour produire
un ETag
Ippon Technologies © 2014
Un mot pour les Ops
Quels sont les serveurs de cache web ?
Pour n’en citer que quelques uns :
● Varnish
● Nginx (proxy_cache)
● Apache (mod_cache)
● Squid
● ...
Ippon Technologies © 2014
Un mot pour les Ops
Comment effectuer la rupture SSL ?
Quelques solutions :
● Nginx
● Apache (mod_ssl)
● Pound
● Stunnel
● ...
Ippon Technologies © 2014
...
Beaucoup de choses ont été dites, la conclusion va s’imposer
Ippon Technologies © 2014
Conclusion !
Ippon Technologies © 2014
Concluons
HTTP 1.1 propose depuis 1999 (...) un ensemble de possibilités
très étendues mais trop souvent sous exploitées
Ippon Technologies © 2014
Concluons
Le développeur d’une API Web peut (doit) s’appuyer sur ce
potentiel, en connaissant précisément ses limites (*)
(*) : autant les limites du potentiel que celles du développeur ;)
Ippon Technologies © 2014
Concluons
Parcourez la RFC 2616, le contenu est accessible et riche en
enseignements
Parcourez aussi les RFC produites depuis pour clarifier la 2616
:
● RFC7230 - HTTP/1.1: Message Syntax and Routing
● RFC7231 - HTTP/1.1: Semantics and Content
● RFC7232 - HTTP/1.1: Conditional Requests
● RFC7233 - HTTP/1.1: Range Requests
● RFC7234 - HTTP/1.1: Caching
● RFC7235 - HTTP/1.1: Authentication
Ippon Technologies © 2014
Concluons
Et surtout…
Ippon Technologies © 2014
{/references}
{
"references": [
{"name": "RFC 2616", "url": "http://pretty-rfc.herokuapp.com/RFC2616"},
{"name": "Google: HTTP Caching", "url": "https://developers.google.com/[...]/http-caching"},
{"name": "Apache HC: HTTP Caching", "url": "http://hc.apache.org/[...]/caching.html"},
{"name": "Key Diff HTTP 1.0 & 1.1", "url": "http://www8.org/w8-papers/[...]/key.html"},
{"name": "Make the web faster", "url": "https://developers.google.com/[...]/caching"},
{"name": "Industry-wide misunderstandings of HTTPS", "url": "securityevaluators.com[...]"},
{"name": "Google", "url": "https://www.google.com"}
]
}
Ippon Technologies © 2014
3-2-1 Contact (& Questions)
Quelques minutes pour vos questions
Pour me contacter :
dmartin@ippon.fr
@_dmartin_
Envie d’apprendre et de
partager ?
Ippon recrute :
recrutement@ippon.fr
blog.ippon.frippon.fr atomes.com
@ippontech contact@ippon.fr

Contenu connexe

Tendances

JPA avec Cassandra, grâce à Achilles
JPA avec Cassandra, grâce à AchillesJPA avec Cassandra, grâce à Achilles
JPA avec Cassandra, grâce à AchillesIppon
 
Quoi de neuf pour JHipster en 2016
Quoi de neuf pour JHipster en 2016Quoi de neuf pour JHipster en 2016
Quoi de neuf pour JHipster en 2016Ippon
 
Formation Usine Logicielle gratuite par Ippon 2014
Formation Usine Logicielle gratuite par Ippon 2014Formation Usine Logicielle gratuite par Ippon 2014
Formation Usine Logicielle gratuite par Ippon 2014Ippon
 
HTML5, Spring, NoSQL et mobilité
HTML5, Spring, NoSQL et mobilitéHTML5, Spring, NoSQL et mobilité
HTML5, Spring, NoSQL et mobilitéJulien Dubois
 
Hibernate vs le Cloud computing
Hibernate vs le Cloud computingHibernate vs le Cloud computing
Hibernate vs le Cloud computingJulien Dubois
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPjulien pauli
 
Breizhjug spring batch 2011
Breizhjug spring batch 2011Breizhjug spring batch 2011
Breizhjug spring batch 2011Olivier BAZOUD
 
Nouveau look pour une nouvelle vie, version spéciale Ippon
Nouveau look pour une nouvelle vie, version spéciale IpponNouveau look pour une nouvelle vie, version spéciale Ippon
Nouveau look pour une nouvelle vie, version spéciale IpponJulien Dubois
 
Spring 3 en production
Spring 3 en productionSpring 3 en production
Spring 3 en productionJulien Dubois
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Julien Jakubowski
 
Forum PHP 2010 - Les frameworks, essentiels dans-l-ecosysteme-php-xavier-laco...
Forum PHP 2010 - Les frameworks, essentiels dans-l-ecosysteme-php-xavier-laco...Forum PHP 2010 - Les frameworks, essentiels dans-l-ecosysteme-php-xavier-laco...
Forum PHP 2010 - Les frameworks, essentiels dans-l-ecosysteme-php-xavier-laco...Xavier Lacot
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileIppon
 
Agilité, n’oublions pas les valeurs
Agilité, n’oublions pas les valeursAgilité, n’oublions pas les valeurs
Agilité, n’oublions pas les valeursIppon
 
Formation GIT gratuite par ippon 2014
Formation GIT gratuite par ippon 2014Formation GIT gratuite par ippon 2014
Formation GIT gratuite par ippon 2014Ippon
 
Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10Jean-Michel Doudoux
 
Présentation du retour d'expérience sur Git
Présentation du retour d'expérience sur GitPrésentation du retour d'expérience sur Git
Présentation du retour d'expérience sur GitIppon
 
Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !VISEO
 

Tendances (20)

JPA avec Cassandra, grâce à Achilles
JPA avec Cassandra, grâce à AchillesJPA avec Cassandra, grâce à Achilles
JPA avec Cassandra, grâce à Achilles
 
Quoi de neuf pour JHipster en 2016
Quoi de neuf pour JHipster en 2016Quoi de neuf pour JHipster en 2016
Quoi de neuf pour JHipster en 2016
 
Formation Usine Logicielle gratuite par Ippon 2014
Formation Usine Logicielle gratuite par Ippon 2014Formation Usine Logicielle gratuite par Ippon 2014
Formation Usine Logicielle gratuite par Ippon 2014
 
HTML5, Spring, NoSQL et mobilité
HTML5, Spring, NoSQL et mobilitéHTML5, Spring, NoSQL et mobilité
HTML5, Spring, NoSQL et mobilité
 
Hibernate vs le Cloud computing
Hibernate vs le Cloud computingHibernate vs le Cloud computing
Hibernate vs le Cloud computing
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHP
 
Breizhjug spring batch 2011
Breizhjug spring batch 2011Breizhjug spring batch 2011
Breizhjug spring batch 2011
 
Nouveau look pour une nouvelle vie, version spéciale Ippon
Nouveau look pour une nouvelle vie, version spéciale IpponNouveau look pour une nouvelle vie, version spéciale Ippon
Nouveau look pour une nouvelle vie, version spéciale Ippon
 
Spring 3 en production
Spring 3 en productionSpring 3 en production
Spring 3 en production
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
 
Spring Batch - concepts de base
Spring Batch - concepts de baseSpring Batch - concepts de base
Spring Batch - concepts de base
 
Forum PHP 2010 - Les frameworks, essentiels dans-l-ecosysteme-php-xavier-laco...
Forum PHP 2010 - Les frameworks, essentiels dans-l-ecosysteme-php-xavier-laco...Forum PHP 2010 - Les frameworks, essentiels dans-l-ecosysteme-php-xavier-laco...
Forum PHP 2010 - Les frameworks, essentiels dans-l-ecosysteme-php-xavier-laco...
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
 
Presentation JPA
Presentation JPAPresentation JPA
Presentation JPA
 
Agilité, n’oublions pas les valeurs
Agilité, n’oublions pas les valeursAgilité, n’oublions pas les valeurs
Agilité, n’oublions pas les valeurs
 
Formation GIT gratuite par ippon 2014
Formation GIT gratuite par ippon 2014Formation GIT gratuite par ippon 2014
Formation GIT gratuite par ippon 2014
 
Tutoriel java
Tutoriel javaTutoriel java
Tutoriel java
 
Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10
 
Présentation du retour d'expérience sur Git
Présentation du retour d'expérience sur GitPrésentation du retour d'expérience sur Git
Présentation du retour d'expérience sur Git
 
Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !
 

En vedette

Offre 2015 numeriq_ippon
Offre 2015 numeriq_ipponOffre 2015 numeriq_ippon
Offre 2015 numeriq_ipponIppon
 
Stateful is beautiful
Stateful is beautifulStateful is beautiful
Stateful is beautifulIppon
 
Présentation Ippon DGA Liferay Symposium 2011
Présentation Ippon DGA Liferay Symposium 2011Présentation Ippon DGA Liferay Symposium 2011
Présentation Ippon DGA Liferay Symposium 2011Ippon
 
Mule ESB Summit 2010 avec Ippon
Mule ESB Summit 2010 avec IpponMule ESB Summit 2010 avec Ippon
Mule ESB Summit 2010 avec IpponIppon
 
Atelier TDD (Test Driven Development)
Atelier TDD (Test Driven Development)Atelier TDD (Test Driven Development)
Atelier TDD (Test Driven Development)Ippon
 
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014Ippon
 
One Web (API?) – Alexandre Bertails - Ippevent 10 juin 2014
One Web (API?) – Alexandre Bertails - Ippevent 10 juin 2014One Web (API?) – Alexandre Bertails - Ippevent 10 juin 2014
One Web (API?) – Alexandre Bertails - Ippevent 10 juin 2014Ippon
 
Multi criteria queries on a cassandra application
Multi criteria queries on a cassandra applicationMulti criteria queries on a cassandra application
Multi criteria queries on a cassandra applicationIppon
 
Cassandra Java Driver : vers Cassandra 1.2 et au-delà
Cassandra Java Driver : vers Cassandra 1.2 et au-delàCassandra Java Driver : vers Cassandra 1.2 et au-delà
Cassandra Java Driver : vers Cassandra 1.2 et au-delàIppon
 
Système d’Information à l’Apec : un nouveau coeur de métier mis en place avec...
Système d’Information à l’Apec : un nouveau coeur de métier mis en place avec...Système d’Information à l’Apec : un nouveau coeur de métier mis en place avec...
Système d’Information à l’Apec : un nouveau coeur de métier mis en place avec...Ippon
 
Démystifions le machine learning avec spark par David Martin pour le Salon B...
Démystifions le machine learning avec spark par David Martin pour le Salon B...Démystifions le machine learning avec spark par David Martin pour le Salon B...
Démystifions le machine learning avec spark par David Martin pour le Salon B...Ippon
 
CDI par la pratique
CDI par la pratiqueCDI par la pratique
CDI par la pratiqueIppon
 
Scrum et forfait
Scrum et forfaitScrum et forfait
Scrum et forfaitIppon
 
Five Tuning Tips For Your Datawarehouse
Five Tuning Tips For Your DatawarehouseFive Tuning Tips For Your Datawarehouse
Five Tuning Tips For Your DatawarehouseJeff Moss
 

En vedette (14)

Offre 2015 numeriq_ippon
Offre 2015 numeriq_ipponOffre 2015 numeriq_ippon
Offre 2015 numeriq_ippon
 
Stateful is beautiful
Stateful is beautifulStateful is beautiful
Stateful is beautiful
 
Présentation Ippon DGA Liferay Symposium 2011
Présentation Ippon DGA Liferay Symposium 2011Présentation Ippon DGA Liferay Symposium 2011
Présentation Ippon DGA Liferay Symposium 2011
 
Mule ESB Summit 2010 avec Ippon
Mule ESB Summit 2010 avec IpponMule ESB Summit 2010 avec Ippon
Mule ESB Summit 2010 avec Ippon
 
Atelier TDD (Test Driven Development)
Atelier TDD (Test Driven Development)Atelier TDD (Test Driven Development)
Atelier TDD (Test Driven Development)
 
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
 
One Web (API?) – Alexandre Bertails - Ippevent 10 juin 2014
One Web (API?) – Alexandre Bertails - Ippevent 10 juin 2014One Web (API?) – Alexandre Bertails - Ippevent 10 juin 2014
One Web (API?) – Alexandre Bertails - Ippevent 10 juin 2014
 
Multi criteria queries on a cassandra application
Multi criteria queries on a cassandra applicationMulti criteria queries on a cassandra application
Multi criteria queries on a cassandra application
 
Cassandra Java Driver : vers Cassandra 1.2 et au-delà
Cassandra Java Driver : vers Cassandra 1.2 et au-delàCassandra Java Driver : vers Cassandra 1.2 et au-delà
Cassandra Java Driver : vers Cassandra 1.2 et au-delà
 
Système d’Information à l’Apec : un nouveau coeur de métier mis en place avec...
Système d’Information à l’Apec : un nouveau coeur de métier mis en place avec...Système d’Information à l’Apec : un nouveau coeur de métier mis en place avec...
Système d’Information à l’Apec : un nouveau coeur de métier mis en place avec...
 
Démystifions le machine learning avec spark par David Martin pour le Salon B...
Démystifions le machine learning avec spark par David Martin pour le Salon B...Démystifions le machine learning avec spark par David Martin pour le Salon B...
Démystifions le machine learning avec spark par David Martin pour le Salon B...
 
CDI par la pratique
CDI par la pratiqueCDI par la pratique
CDI par la pratique
 
Scrum et forfait
Scrum et forfaitScrum et forfait
Scrum et forfait
 
Five Tuning Tips For Your Datawarehouse
Five Tuning Tips For Your DatawarehouseFive Tuning Tips For Your Datawarehouse
Five Tuning Tips For Your Datawarehouse
 

Similaire à Web API & Cache, the HTTP way - Ippevent 10 Juin 2014

La mise en cache et ses secrets
La mise en cache et ses secretsLa mise en cache et ses secrets
La mise en cache et ses secretsAymeric Bouillat
 
Formation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPFormation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPkemenaran
 
Introduction dans la Programmation Web Course 1
Introduction dans la Programmation Web Course 1Introduction dans la Programmation Web Course 1
Introduction dans la Programmation Web Course 1Vlad Posea
 
Optimiser WordPress
Optimiser WordPressOptimiser WordPress
Optimiser WordPressChi Nacim
 
Enrichir vos contenus Wordpress avec les API - WPTech 2015
Enrichir vos contenus Wordpress avec les API - WPTech 2015Enrichir vos contenus Wordpress avec les API - WPTech 2015
Enrichir vos contenus Wordpress avec les API - WPTech 2015PXNetwork
 
Rencontre mensuelle Montreal - juillet 2012 - kerberos
Rencontre mensuelle Montreal - juillet 2012 - kerberosRencontre mensuelle Montreal - juillet 2012 - kerberos
Rencontre mensuelle Montreal - juillet 2012 - kerberosNicolas Georgeault
 
Procédure ocs glpi_jeremy_chatel_2012_final
Procédure ocs glpi_jeremy_chatel_2012_finalProcédure ocs glpi_jeremy_chatel_2012_final
Procédure ocs glpi_jeremy_chatel_2012_finalcisco7878
 
Un serveur rest en moins de 5 minutes
Un serveur rest en moins de 5 minutesUn serveur rest en moins de 5 minutes
Un serveur rest en moins de 5 minutesOlivier ETIENNE
 
Installation configuration OpenERP 7 - Windows
Installation   configuration OpenERP 7 - WindowsInstallation   configuration OpenERP 7 - Windows
Installation configuration OpenERP 7 - WindowsSanae BEKKAR
 
Les performances sur des développements PhP
Les performances sur des développements PhPLes performances sur des développements PhP
Les performances sur des développements PhPneuros
 
Présentation de CakePHP, 22/04/2010
Présentation de CakePHP, 22/04/2010Présentation de CakePHP, 22/04/2010
Présentation de CakePHP, 22/04/2010Guillaume Sautereau
 
S51 vos projets web services ibm i a l aide de php
S51   vos projets web services ibm i a l aide de phpS51   vos projets web services ibm i a l aide de php
S51 vos projets web services ibm i a l aide de phpGautier DUMAS
 
CocoaHeads Lyon - Mode Déconnecté dans une app iOS
CocoaHeads Lyon - Mode Déconnecté dans une app iOSCocoaHeads Lyon - Mode Déconnecté dans une app iOS
CocoaHeads Lyon - Mode Déconnecté dans une app iOSClaire Reynaud
 
Scalabilité et haute performance d'application PHP légacy
Scalabilité et haute performance d'application PHP légacy Scalabilité et haute performance d'application PHP légacy
Scalabilité et haute performance d'application PHP légacy Arnaud LEMAIRE
 
Prez -chtijug-29032016-(micro)services, loadbalancing et gestion des erreurs ...
Prez -chtijug-29032016-(micro)services, loadbalancing et gestion des erreurs ...Prez -chtijug-29032016-(micro)services, loadbalancing et gestion des erreurs ...
Prez -chtijug-29032016-(micro)services, loadbalancing et gestion des erreurs ...Christophe Furmaniak
 
Softshake 2015 - Comment tester et optimiser la performance d'un SI ?
Softshake 2015 - Comment tester et optimiser la performance d'un SI ?Softshake 2015 - Comment tester et optimiser la performance d'un SI ?
Softshake 2015 - Comment tester et optimiser la performance d'un SI ?cyrilpicat
 

Similaire à Web API & Cache, the HTTP way - Ippevent 10 Juin 2014 (20)

La mise en cache et ses secrets
La mise en cache et ses secretsLa mise en cache et ses secrets
La mise en cache et ses secrets
 
Hibernate jpa
Hibernate jpaHibernate jpa
Hibernate jpa
 
Formation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPFormation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHP
 
Mysql
MysqlMysql
Mysql
 
Introduction dans la Programmation Web Course 1
Introduction dans la Programmation Web Course 1Introduction dans la Programmation Web Course 1
Introduction dans la Programmation Web Course 1
 
Optimiser WordPress
Optimiser WordPressOptimiser WordPress
Optimiser WordPress
 
Optimiser wordpress
Optimiser wordpressOptimiser wordpress
Optimiser wordpress
 
Enrichir vos contenus Wordpress avec les API - WPTech 2015
Enrichir vos contenus Wordpress avec les API - WPTech 2015Enrichir vos contenus Wordpress avec les API - WPTech 2015
Enrichir vos contenus Wordpress avec les API - WPTech 2015
 
Rencontre mensuelle Montreal - juillet 2012 - kerberos
Rencontre mensuelle Montreal - juillet 2012 - kerberosRencontre mensuelle Montreal - juillet 2012 - kerberos
Rencontre mensuelle Montreal - juillet 2012 - kerberos
 
Procédure ocs glpi_jeremy_chatel_2012_final
Procédure ocs glpi_jeremy_chatel_2012_finalProcédure ocs glpi_jeremy_chatel_2012_final
Procédure ocs glpi_jeremy_chatel_2012_final
 
Promises Javascript
Promises JavascriptPromises Javascript
Promises Javascript
 
Un serveur rest en moins de 5 minutes
Un serveur rest en moins de 5 minutesUn serveur rest en moins de 5 minutes
Un serveur rest en moins de 5 minutes
 
Installation configuration OpenERP 7 - Windows
Installation   configuration OpenERP 7 - WindowsInstallation   configuration OpenERP 7 - Windows
Installation configuration OpenERP 7 - Windows
 
Les performances sur des développements PhP
Les performances sur des développements PhPLes performances sur des développements PhP
Les performances sur des développements PhP
 
Présentation de CakePHP, 22/04/2010
Présentation de CakePHP, 22/04/2010Présentation de CakePHP, 22/04/2010
Présentation de CakePHP, 22/04/2010
 
S51 vos projets web services ibm i a l aide de php
S51   vos projets web services ibm i a l aide de phpS51   vos projets web services ibm i a l aide de php
S51 vos projets web services ibm i a l aide de php
 
CocoaHeads Lyon - Mode Déconnecté dans une app iOS
CocoaHeads Lyon - Mode Déconnecté dans une app iOSCocoaHeads Lyon - Mode Déconnecté dans une app iOS
CocoaHeads Lyon - Mode Déconnecté dans une app iOS
 
Scalabilité et haute performance d'application PHP légacy
Scalabilité et haute performance d'application PHP légacy Scalabilité et haute performance d'application PHP légacy
Scalabilité et haute performance d'application PHP légacy
 
Prez -chtijug-29032016-(micro)services, loadbalancing et gestion des erreurs ...
Prez -chtijug-29032016-(micro)services, loadbalancing et gestion des erreurs ...Prez -chtijug-29032016-(micro)services, loadbalancing et gestion des erreurs ...
Prez -chtijug-29032016-(micro)services, loadbalancing et gestion des erreurs ...
 
Softshake 2015 - Comment tester et optimiser la performance d'un SI ?
Softshake 2015 - Comment tester et optimiser la performance d'un SI ?Softshake 2015 - Comment tester et optimiser la performance d'un SI ?
Softshake 2015 - Comment tester et optimiser la performance d'un SI ?
 

Web API & Cache, the HTTP way - Ippevent 10 Juin 2014

  • 2. Ippon Technologies © 2014 Présentation
  • 3. Ippon Technologies © 2014 /ippon/dmartin David MARTIN… … Ippon Technologies … Directeur du Pôle Conseil et Formation … Développeur depuis … quelques années :) … Intéressé par les API Web, le style d’architecture REST…
  • 4. Ippon Technologies © 2014 Parlons vrai, parlons cache !
  • 5. Ippon Technologies © 2014 Let’s start “La plus performante requête… … est celle qu’on n’a pas à faire” Un inconnu
  • 6. Ippon Technologies © 2014 {subject:”cache”} Parlons un peu de vous… … vous allez créer une API Web … vous avez créé une API Web
  • 7. Ippon Technologies © 2014 {subject:”cache”} Dans le premier cas, vous vous posez quelques questions AVANT → C’est BIEN Dans le second cas, vous vous posez des questions PENDANT/APRÈS → C’est toujours mieux que de ne pas se poser de question ;) Mais certains de vos choix seront peut être bloquants
  • 8. Ippon Technologies © 2014 Les constats Quelques constats… Les ressources ne partagent pas toutes le même cycle de vie... Certaines changent vraiment très peu... Et pourtant elles peuvent être très demandées… Et induire une forte charge sur le serveur...
  • 9. Ippon Technologies © 2014 Les constats On peut identifier des cycles de vie macroscopiques, associés à des types d’entités… Exemple : Une ressource représentant une cotation boursière évolue à un rythme différent d’une ressource représentant l’ entreprise cotée.
  • 10. Ippon Technologies © 2014 Les constats Mais deux ressources de même nature peuvent aussi avoir des cycles de vie radicalement éloignés… Tout le monde n’actualise pas sa page Facebook à la même fréquence...
  • 11. Ippon Technologies © 2014 Les questions La question évidente que tout le monde se pose… … peut on économiser du traitement, de la bande passante, ... sur la lecture des données ?
  • 12. Ippon Technologies © 2014 Les questions Ou, dit autrement... … Comment mettre en place du cache sur mon API ?
  • 13. Ippon Technologies © 2014 Flashback Avant toute chose, quelques rappels… Sur ce qu’est/devrait être une API Web...
  • 14. Ippon Technologies © 2014 Flashback Pour cela, commençons par ce que ce n’est pas… Une API Web n’est pas… … la réincarnation des Web Services SOAP en JSON … un énième hommage au RPC … un simple service qui retourne du JSON … une histoire de jolies URLs
  • 15. Ippon Technologies © 2014 Flashback Une API Web est (DOIT ETRE)… … un service orienté ressource et non méthode/action … appelée à être consommée par un client HTTP … construite pour tirer profit du protocole HTTP … autant que possible respectueuse des principes du style d’ architecture REST … idéalement construite autour des relations hypermédia
  • 16. Ippon Technologies © 2014 REST - piqure de rappel N’est pas API REST qui veut… … Et chaque service - ou API Web - n'atteint pas le même niveau de conformité : Niveau 0 : RPC like… WS-* style... Niveau 1 : Notion de ressources Niveau 2 : Utilisation à bon escient des verbes HTTP Niveau 3 : Hypertext As The Engine Of Application State Maturity Model par Leonard Richardson
  • 17. Ippon Technologies © 2014 So what? L’API Web doit donc tirer profit du protocole HTTP … … Et pour le cache, qu’en dit la RFC 2616 (Hypertext Transfer Protocol - HTTP/1.1) ? … Le cache est au coeur du protocole et son usage est plus que conseillé, d’autant qu’il présumé transparent, selon cette définition : [...]A cache behaves in a "semantically transparent" manner, with respect to a particular response, when its use affects neither the requesting client nor the origin server, except to improve performance.[...]
  • 18. Ippon Technologies © 2014 Et les caches applicatifs ? Le protocole HTTP propose donc une solution pour mettre en cache de l’information… … Mais il existe d’autres solutions de cache (applicatif par exemple) très faciles à intégrer au code d’une API… … Alors pourquoi se soucier du cache HTTP ?
  • 19. Ippon Technologies © 2014 Et les caches applicatifs ? Parce que le cache HTTP va travailler avec des représentations sérialisées, permettant l’économie de la (dé) sérialisation des requêtes et réponses Et la sérialisation/désérialisation est coûteuse ! Ajoutons à cela qu’un cache HTTP peut être très facilement ajouté et à tout moment, sans impact sur le code de votre API
  • 20. Ippon Technologies © 2014 Allons-y pour le cache HTTP Essayons de comprendre maintenant comment cela fonctionne… … et ce que cela peut apporter à une API Web
  • 21. Ippon Technologies © 2014 Vocabulaire... Avant tout chose, entendons nous sur certains termes...
  • 22. Ippon Technologies © 2014 Caches HTTP : private / shared Un cache peut être : ● privé (non partagé, “non-shared”) ○ Accessible par un seul utilisateur. Le cache de votre navigateur est présumé privé. ● partagé (“shared”) ○ Tout autre cache. Ce sera le cas d’un système dédié dans une infrastructure.
  • 23. Ippon Technologies © 2014 Caches HTTP : origin server Notion de serveur d’origine… … sera le serveur d’où provient à l’origine la donnée potentiellement mise en cache
  • 24. Ippon Technologies © 2014 Caches HTTP : validator Notion de validateur… … sera un élément du protocole utilisé pour déterminer si une entité est bien identique à une autre
  • 25. Ippon Technologies © 2014 Étudions ce que HTTP propose Principe général d’un cache : stocker une entité éventuellement associée à une information de validité… … HTTP propose plusieurs “outils” pour contrôler le comportement du cache… ● Time To Live (Expires…) ● Cache-Control et ses nombreuses directives... ● ETags (ou entity tags)
  • 26. Ippon Technologies © 2014 Comment gérer le cycle de vie ? L’approche la plus simple repose sur le Time To Live… … donner au cache une information de péremption concernant la réponse … HTTP 1.1 permet à un serveur d’exprimer cette notion de différentes façons via les headers : ● Expires ● Cache-Control (max-age) … Mais un serveur de cache peut aussi gérer cela “seul” en l’ absence d’information coté serveur (“Expiration heuristique”) ● En se basant sur Last-Modified par exemple
  • 27. Ippon Technologies © 2014 Zoom sur Expires Expires (depuis HTTP 1.0) Permet de spécifier la date, au format RFC 1123, à partir de laquelle la ressource est présumée obsolète Expires: Tue, 18 Nov 2014 18:15:11 GMT
  • 28. Ippon Technologies © 2014 Zoom sur Cache-Control Cache-Control(max-age) Permet de spécifier en secondes le temps de validité de la ressource retournée (maximum autorisé : 1 année) Cache-Control: max-age=120 En cas de présence d’Expires et de Cache-Control(max-age), c’est ce dernier qui est retenu
  • 29. Ippon Technologies © 2014 Zoom sur Cache-Control Cache-Control... … C’est aussi beaucoup d’autres directives … Pas abordées toutes ici … Assez nébuleuses lors d’une première lecture
  • 30. Ippon Technologies © 2014 Zoom sur Cache-Control Cache-Control… … Pour s’y retrouver, Google propose ce diagramme assez utile https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching#defining-optimal-cache-control-policy
  • 31. Ippon Technologies © 2014 Retour au cache Revenons au cache HTTP de façon plus générale...
  • 32. Ippon Technologies © 2014 Comment ça fonctionne ? Le fonctionnement est ensuite relativement simple… … pour toute requête, une correspondance en cache est recherchée (si pas de contre ordre) … si elle est trouvée et qu’elle est “encore fraîche”, elle est retournée, … si elle est trouvée mais “n’est plus très fraîche”, une demande auprès du serveur d’origine est émise, … si elle n’est pas trouvée, elle est demandée au serveur d’ origine
  • 33. Ippon Technologies © 2014 Retour au cache Tout repose donc sur cette notion de fraîcheur… … Une entité sera présumée “fraîche” si son âge (pouvant être défini de plusieurs façons) est en conformité par rapport à la règle d’expiration (exprimée ou heuristique) … Au delà, elle est présumée périmée ! … Mais peut être ne l’est elle pas ? Comment savoir ? … En allant vérifier !
  • 34. Ippon Technologies © 2014 Vérifications optimisées Les requêtes conditionnelles Un cache HTTP revalidera une ressource auprès du serveur d’ origine en utilisant une requête conditionnelle Kécécé ? Il s’agit d’une requête qui ne retournera une représentation QUE si nécessaire, et un 304 Not Modified sans corps sinon Exemple : un GET avec un header If-Modified-Since valorisé avec le Last-Modified de l’entité en cache
  • 35. Ippon Technologies © 2014 Attention aux limites... Les limites de la validation avec une date Revalider une entité avec une date, dont la précision est la seconde, ne garantit pas d’obtenir la donnée plus récente. Un cache intermédiaire peut avoir récupéré la ressource à T et celle-ci avoir été modifiée sur le serveur d’origine à T+0.1 seconde. Sa ressource est vue comme “fraîche”, et pourtant... Le validateur utilisé ici est considéré comme “faible”
  • 36. Ippon Technologies © 2014 Valider “fortement” une entité : ETag ETag : le validateur fort Le protocole a donc prévu ce cas… … en permettant de retourner une “clef” identifiant l’état d’une ressource : un tag décrivant l’entité (ie: entity tag ou ETag) Cette valeur peut être alors utilisée pour demander au serveur si cette version de ressource est toujours “fraîche” ou non GET + (If-(None-)Match) + Etag Note : la spec HTTP conseille de retourner un ETag, sauf si par exemple le calcul de celui-ci impose un coût trop important
  • 37. Ippon Technologies © 2014 Allons plus loin encore... Tout ceci est pas mal, mais il y a mieux… … Le cache HTTP est aussi prévu pour être invalidé … Les requêtes dites “unsafe” : PUT, DELETE et POST (ou toute autre inconnue) vont marquer les entités du cache comme invalides
  • 38. Ippon Technologies © 2014 Allons plus loin encore, en images... GET /people/lucy Cache Origin PUT /people/lucy Cache Origin
  • 39. Ippon Technologies © 2014 Que peut on tirer de ceci dans une API Web ? … plus qu’on ne pense ! … Voici quelques exemples concrets Et les API là dedans ? Plein d’exemples ici
  • 40. Ippon Technologies © 2014 Et les API là dedans ? La requête : POST /people … va invalider la représentation en cache de /people … mais si combinée avec une réponse du type [303 - See Other] + Location: /people/lucy ? … ou encore (mieux) avec une réponse : [20X] + Content-Location: /people/lucy ? Ceci représente toujours Lucy
  • 41. Ippon Technologies © 2014 Et les API là dedans ? La requête : DELETE /people/lucy … va invalider la représentation en cache de /people/lucy … mais si combinée avec une réponse du type [303 - See Other] + Location: /people ? … ou : [20X] + Content-Location: /people ?
  • 42. Ippon Technologies © 2014 Tout ceci est valable si... Attention / Warning / Achtung / 關注 Condition importante pour que cela fonctionne... … L’URL ne doit pas servir à décrire la modification de l’état d’ une ressource : ● POST /people/lucy/smile ● POST /people
  • 43. Ippon Technologies © 2014 Quid des collections ? Plusieurs façons d’envisager les collections : ● Full hypermédia : la collection est un ensemble de liens vers les entités ● Embarquées : les états des entités sont retournés dans la réponse Les stratégies de cache devront considérer ces cas en fonction de différents paramètres
  • 44. Ippon Technologies © 2014 Content Negotiation Négociation de contenu… … Une Web API peut proposer de retourner une représentation sous différents formats (JSON, XML, HTML…) Différentes façons le permettent : ● GET /resources/res1.json, GET /resources/res1.xml ● GET /resources/res1?format=json (xml) ● GET /resources/res1 + Accept: application/json (xml)
  • 45. Ippon Technologies © 2014 Content Negotiation ● GET /resources/res1.json, GET /resources/res1.xml ○ L’URL sert de clef pour le cache. Pas de risque de recevoir une réponse JSON si res1.xml est demandée ○ Par contre, l’invalidation ne concernera qu’une seule représentation... ● GET /resources/res1?format=json (xml) ○ Mêmes remarques qu’au dessus
  • 46. Ippon Technologies © 2014 Content Negotiation ● GET /resources/res1 + Accept: application/json (xml) ○ A première vue, c’est mal engagé… une même URL, plusieurs représentations selon la valeur d’un header… ○ Mais c’est sans compter sur Vary ■ Vary est un header positionné sur les réponses ■ Il informe les caches des données à considérer pour choisir une représentation alternative ■ Vary: Accept dans notre cas serait donc apprécié! Encore une fois, tout existe déjà dans la spécification
  • 47. Ippon Technologies © 2014 Oui mais..., encore... Mais les choses ne sont jamais simples…
  • 48. Ippon Technologies © 2014 Un cache, deux caches, n caches... Et le chemin qu’emprunte une requête peut très bien ne pas être le même que la requête suivante… Ce qui signifie que si une requête “unsafe” a invalidé un ensemble de caches, le prochain GET n’en bénéficiera peut être pas… Il faut donc apprendre à vivre avec des représentations potentiellement obsolètes
  • 49. Ippon Technologies © 2014 Accepter l’obsolescence En utilisant les headers de pré-condition… … Pour rappel If-None-Match, If-Match (et à défaut If-Modified- Since, If-Unmodified-Since) … Sur une action réputée “unsafe” … Permet sur une réponse : 412 Precondition Failed de réagir en conséquence No more race condition! Antisèche
  • 50. Ippon Technologies © 2014 Accepter l’obsolescence Demander une ressource au serveur d’origine en by-passant les caches ? C’est possible ! no-cache ou max-age=0 (Cache-Control) permettent de traverser tous les caches jusqu’au serveur d’origine ● no-cache : la réponse ne pourra pas être utilisée par les caches pour les prochaines requêtes ● max-age=0 : va aussi permettre de mettre à jour les entités en cache
  • 51. Ippon Technologies © 2014 ... 2 secondes de pause pour digérer tout ça
  • 52. Ippon Technologies © 2014 ... 1 seconde...
  • 53. Ippon Technologies © 2014 Subtilités… toujours... Tout est ok pour activer le cache, n’est-ce pas ? Ce n’est malheureusement pas si simple… … Il existe des subtilités à connaître, comme : “Note that Authorization normally prevents a shared cache from saving and returning a response to a previous request if that request included an Authorization header.” http://pretty-rfc.herokuapp.com/RFC2616#response.cacheability
  • 54. Ippon Technologies © 2014 Authorization, mon ennemi ? Pourquoi utiliser Authorization ? Pour permettre au “user-agent” de s’authentifier auprès du serveur d’origine… … Pour pouvoir restreindre l’accès aux ressources ou à certaines données des ressources … Pour mesurer et contrôler les accès au serveur (quotas, …)
  • 55. Ippon Technologies © 2014 Authorization, mon ennemi ? Quelles solutions ? A étudier selon les cas d’utilisation : ● Forcer la mise en cache avec éviction de certaines données (Cache-Control(no-cache=QQCHOSE)) ● Ne pas utiliser Authorization sur l’ensemble des ressources accédées ● Utiliser un reverse proxy qui se chargera des contrôles d’ authentification, vérification des quotas, ... et permettra l’ utilisation d’un cache pour la requête sortante
  • 56. Ippon Technologies © 2014 Subtilités… toujours... Ok pour Authorization, mais si mon API est accédée en HTTPS ? Alors certaines contraintes vont aussi s’appliquer… … Les caches partagés ne pourront pas être utilisés … Les caches privés éventuellement
  • 57. Ippon Technologies © 2014 Et si le client n’est pas un browser Une API Web peut être consommée par autre chose d’une application AngularJS… … Heureusement :) … Et si le client est une autre application Java, peut on bénéficier d’un cache privé ? … Oui! Enfin, si le client HTTP utilisé en propose un :)
  • 58. Ippon Technologies © 2014 Apache HttpClient Cache Apache HttpClient dispose d’un mécanisme de cache privé avec 3 implémentations disponibles : ● simple/simpliste : stockage dans une LinkedHashMap ● A base de EHCache ● Avec des morceaux de memcached
  • 59. Ippon Technologies © 2014 Coté développeur Tant coté serveur que coté client, la manipulation des headers va donc être importante… … Coté serveur : Response/CacheControl (JAX-RS), HttpEntity/HttpHeaders (Spring MVC) permettront de travailler les valeurs transmises au client … Coté client : une requête Ajax aura accès aux headers tout comme Apache HttpClient pour un client Java
  • 60. Ippon Technologies © 2014 Coté développeur Quelques règles utiles : ● Cache HTTP et cache applicatif ne sont pas exclusifs ● ETags : Définissez une stratégie économique pour produire un ETag
  • 61. Ippon Technologies © 2014 Un mot pour les Ops Quels sont les serveurs de cache web ? Pour n’en citer que quelques uns : ● Varnish ● Nginx (proxy_cache) ● Apache (mod_cache) ● Squid ● ...
  • 62. Ippon Technologies © 2014 Un mot pour les Ops Comment effectuer la rupture SSL ? Quelques solutions : ● Nginx ● Apache (mod_ssl) ● Pound ● Stunnel ● ...
  • 63. Ippon Technologies © 2014 ... Beaucoup de choses ont été dites, la conclusion va s’imposer
  • 64. Ippon Technologies © 2014 Conclusion !
  • 65. Ippon Technologies © 2014 Concluons HTTP 1.1 propose depuis 1999 (...) un ensemble de possibilités très étendues mais trop souvent sous exploitées
  • 66. Ippon Technologies © 2014 Concluons Le développeur d’une API Web peut (doit) s’appuyer sur ce potentiel, en connaissant précisément ses limites (*) (*) : autant les limites du potentiel que celles du développeur ;)
  • 67. Ippon Technologies © 2014 Concluons Parcourez la RFC 2616, le contenu est accessible et riche en enseignements Parcourez aussi les RFC produites depuis pour clarifier la 2616 : ● RFC7230 - HTTP/1.1: Message Syntax and Routing ● RFC7231 - HTTP/1.1: Semantics and Content ● RFC7232 - HTTP/1.1: Conditional Requests ● RFC7233 - HTTP/1.1: Range Requests ● RFC7234 - HTTP/1.1: Caching ● RFC7235 - HTTP/1.1: Authentication
  • 68. Ippon Technologies © 2014 Concluons Et surtout…
  • 69. Ippon Technologies © 2014 {/references} { "references": [ {"name": "RFC 2616", "url": "http://pretty-rfc.herokuapp.com/RFC2616"}, {"name": "Google: HTTP Caching", "url": "https://developers.google.com/[...]/http-caching"}, {"name": "Apache HC: HTTP Caching", "url": "http://hc.apache.org/[...]/caching.html"}, {"name": "Key Diff HTTP 1.0 & 1.1", "url": "http://www8.org/w8-papers/[...]/key.html"}, {"name": "Make the web faster", "url": "https://developers.google.com/[...]/caching"}, {"name": "Industry-wide misunderstandings of HTTPS", "url": "securityevaluators.com[...]"}, {"name": "Google", "url": "https://www.google.com"} ] }
  • 70. Ippon Technologies © 2014 3-2-1 Contact (& Questions) Quelques minutes pour vos questions Pour me contacter : dmartin@ippon.fr @_dmartin_ Envie d’apprendre et de partager ? Ippon recrute : recrutement@ippon.fr