19
Optimiser la gestion du cache d'un site web fortement identifié et dynamique Jean SEMERE

Drupal et-caching-esi

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Drupal et-caching-esi

Optimiser la gestion du cache d'un site webfortement identifié et dynamique

Jean SEMERE

Page 2: Drupal et-caching-esi

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

Page 3: Drupal et-caching-esi

Politique de cache

Cache de page : 90% du trafic en mode connecté

Page 4: Drupal et-caching-esi

Politique de cache

Cache de page : 90% du trafic en mode connecté

Cache de blocs : soulage la DB mais granularité pas toujours suffisante

Page 5: Drupal et-caching-esi

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

Page 6: Drupal et-caching-esi

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

Page 7: Drupal et-caching-esi

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

Page 8: Drupal et-caching-esi

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

Page 9: Drupal et-caching-esi

<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

Page 10: Drupal et-caching-esi

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

Page 11: Drupal et-caching-esi

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” />

Page 12: Drupal et-caching-esi

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

Page 13: Drupal et-caching-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

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

Page 14: Drupal et-caching-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.

Page 15: Drupal et-caching-esi

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

Page 16: Drupal et-caching-esi

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

Page 17: Drupal et-caching-esi

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)

Page 18: Drupal et-caching-esi

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

Page 19: Drupal et-caching-esi

Questions?