Upload
jb-ingold
View
2.678
Download
0
Embed Size (px)
DESCRIPTION
Citation preview
Optimiser la gestion du cache d'un site webfortement identifié et dynamique
Jean SEMERE
Présentation du projet
Mettre en relation des prêteurs et des micro-entrepreneurs
Drupal : catalogue de projets, stockage des infos perso, gestion du ”panier”, ...
Flexcube : gestion des comptes prêteurs, des prêts, et des remboursements
Drupal ↔ Flexcube : webservices SOAP
Politique de cache
Cache de page : 90% du trafic en mode connecté
Politique de cache
Cache de page : 90% du trafic en mode connecté
Cache de blocs : soulage la DB mais granularité pas toujours suffisante
Politique de cache
Cache de page : 90% du trafic en mode connecté
Cache de blocs : soulage la DB mais granularité pas toujours suffisante
cache_get / cache_set / cache_clear_all : politique de cache custom pour compléter le dispositif
Cache de pages via Varnish
Varnish : reverse proxy HTTP Apache : ~50 req/s | Varnish : ~ 3000 req/s
Apache
Drupal(bootstrap partiel)
Drupal(bootstrap full)
req
resp
resphit
miss
Varnish
Apache
Drupal(bootstrap full)
req
resp
resp
miss
hit
Pressflow
Drupal 6 : un cookie pour chaque visiteur (même anonyme) => pas de cache de page Varnish possible
Pressflow 6 : collection de patches pour D6
Objectif : performance et scalabilité
Entre autres : Compatibilité Varnish Support complet de la réplication SQL Optimisation des requêtes pour MySQL
Cache de blocs via Varnish ?
Bloc menu / par rôle / TTL quasi infini
Bloc filtres/ global
/ TTL infini
Bloc statistiques/ global
/ TTL long
Bloc projets/ global
/ TTL court
Bloc statut / par rôle/ TTL infini
Bloc panier/ par session/ TTL court
Varnish
<esi:include>
<esi:include src=”/esi/4” />
<esi:includesrc=”/esi/2” /> <esi:include src=”/esi/1” />
<esi:include src=”/esi/3” />
<esi:include src=”esi/6” /><esi:include src=”/esi/5” />
/esi/1 /esi/2 /esi/3
Caching D6 des blocs
theme_blocks($region)
block_list($region)
Bloc 1NO_CACHE
Bloc 2PER_ROLE
HTML Bloc 1généré
cache_get
Bloc 2Cache ID
HTML Bloc 2 lu depuis le cache
HTML Bloc 2généré
cache_set
Caching ESI des blocs
theme_blocks($region)
block_list($region)
Bloc 1NO_CACHE
Bloc 2PER_ROLE
HTML Bloc 1généré
Bloc 2Cache ID
<esi:includesrc=”/esi-block/cid” />
Caching ESI des blocs
theme_blocks($region)
block_list($region)
Bloc 1NO_CACHE
Bloc 2PER_ROLE
HTML Bloc 1généré
Bloc 2Cache ID
HTML Bloc 2lu depuis VarnishVarnish
/esi-block/cid
<esi:includesrc=”/esi-block/cid” />
Décodagedu cache ID
Restauration partielledu contexte
HTML Bloc 2généré
hit
AssemblageESI
Mise en cachede l'ESI
miss
Caching ESI des blocs
HTML Bloc 2lu depuis VarnishVarnish
/esi-block/cid
Décodagedu cache ID
Restauration partielledu contexte
HTML Bloc 2généré
hit
AssemblageESI
Mise en cachede l'ESI
miss
Varnish 1 ESI <=> 1 URL Contexte encapsulé
dans l'URL
Drupal Cache clé / valeur Contexte encapsulé
dans la clé de cache
=> Utilisation de la clé de cache Drupal dans l'URL de l'ESI
Caching ESI des blocs
HTML Bloc 2lu depuis VarnishVarnish
/esi-block/cid
Décodagedu cache ID
Restauration partielledu contexte
HTML Bloc 2généré
hit
AssemblageESI
Mise en cachede l'ESI
miss
Infos de session => passage du cookie
Paramètres encapsulés dans la clé de cache
Gestion des globales ?$_GET['q'], etc.
ESI vs cache Drupal
ESI : cache HTML
Cache Drupal : cache HTML, data, etc Caches complémentaires, pas concurrents cache_get / cache_set : pas d'équivalent ESI
En ESI : lookup Varnish / flush Varnish Mécanisme de lookup builtin dans Varnish Flush des ESI
Requête HTTP de type PURGE vers Varnish Surcharge de cache_clear_all pour flusher les ESI Clés de cache
Cache ESI custom
Pas d'équivalent ESI à cache_get / cache_set
Possibilité de cacher en ESI n'importe quel portion de HTML, à partir du moment où on générer le HTML offline dans un contexte restreint
Exemple : Cache ESI des displays de nodes
Cache ESI custom
Créer une clé de cache pour le HTML à cachernode:nid:(callback):locale:theme:contexte
Ecrire une fonction qui génère le tag <esi:include> avec la bonne clé de cachefunction esi_inline_node($nid, $callback, $cache, $ttl)
Ecrire la fonction de génération offline du HTMLfunction esi_render_node()
Ecrire une (ou plusieurs) fonctions de callback de theming
Flush : cache_clear_all('node:nid', 'cache_inline', TRUE)
Impact sur les performances
Tests de charge en cours Gains observés en phase de dev (en cas de hit
de cache) : ~ 50% de gain en cache de pages vs memcache ~ 30% de gain en cache de blocs vs memcache ~ 50% de gain (dans notre cas) sur le cache
custom vs memcache
Impact sur la scalabilité Impact en cas de cache miss => importance du
choix de politique de cache
Questions?