7. Et avec Varnish ?
Mix du cache des 2 versions
→ Solution ? Canary-testing ?
App v1 App v2
Varnish
Cache app v1
Cache app v2
8. Ébauche de solution
• Séparation du cache entre les
versions → vcl_hash
• Varnish doit connaître la version de
l’application
→ L’application doit exposer sa version
$ curl http://mon.app/version
11a3e229084349bc25d97e29393ced1d
9. Solution : vmod curl !
import curl;
sub vcl_recv {
if (req.url == "/version") {
return(pass);
}
curl.header_add("Host: "+req.http.host);
curl.get("http://localhost/version");
if (curl.status() == 200) {
set req.http.X-Version = curl.body();
} else {
error 500 "Internal Server Error";
}
curl.free();
}
sub vcl_hash {
hash_data(req.http.X-Version);
return(hash);
}
Toujours la dernière
version car pas de session
!
10. Un curl par requête ? Hmm…
On peut faire mieux !
sub app_version {
if (req.http.Cookie ~ "version=") {
set req.http.X-Version =
regsub(req.http.Cookie, ".*version=([^;]+).*", "1");
} else {
[algo avec curl]
}
}
Le cookie « version » est
ajouté par :
• L’application
• Ou vcl_deliver
11. Si on récapitule…
Un « ancien » utilisateur :
• Cookie → X-Version
• HIT ou MISS
• On réécrit le cookie « version »
dans tous les cas
Un « nouvel » utilisateur :
• Appel curl → X-Version
• HIT ou MISS
• On écrit le cookie « version »
12. Mise en production d’une nouvelle version
temps
#sessions
MeP green Undeploy blue
#objets
MeP green
temps
Prune blue
hitrate
MeP green
temps