Mittwoch Feb. 20, 2013

Varnish Cache Objekt vor Ablauf der TTL erneuern

Der Varnish ist an sich ein toller Reverse-Proxy, hat nur vereinzelt ein paar Dinge, die manchmal etwas Kopfzerbrechen bereiten. Eine Sache davon ist, das Erneuern von gecachten Objekten. Ist die TTL eines Objekts abgelaufen und jemand frägt dieses Objekt ab, muss er warten, bis der Varnish es vom Backend neu gezogen hat. Fragen andere gleichzeitig dieses Objekt ab, bekommen sie es weiterhin aus dem Cache, soweit man eine Grace-Period definiert hat. Aber dieser eine o.g. User muss warten. Das kann man umgehen, in dem man sich für die wichtigsten Seiten einen Job schreibt, der das Objekt bereits vor Ablauf der TTL erneuert. In der Varnish-Konfiguration könnte das dann so aussehen:

acl refresh {
  "localhost";
}

sub vcl_recv {
  if (req.request == "REFRESH") {
    if (client.ip !~ refresh) {
      error 405 "Not allowed";
    }
    set req.hash_always_miss = true;
    set req.request = "GET";
  }

req.hash_always_miss funktioniert seit Varnish V 2.1.4. Während die User ja die Seiten mit der HTTP GET-Methode weiterhin aus dem Varnish-Cache bekommen, kommt unser Skript mit der REFRESH-Methode rein, setzt "req.hash_always_miss = true" und umgeht somit den Cache und zieht das entsprechende Objekt neu vom Backend. Anschließend wird es im Cache ersetzt und wir haben wieder ein "frisches" Objekt. Sehr praktisch :-)

Kommentare:

Senden Sie einen Kommentar:
  • HTML Syntax: Ausgeschaltet