Ich habe eine langsame Web-App, vor der ich Varnish platziert habe. Alle Seiten sind statisch (sie variieren nicht für einen anderen Benutzer), müssen jedoch alle 5 Minuten aktualisiert werden, damit sie aktuelle Daten enthalten.
Ich habe ein einfaches Skript ( wget --mirror
), das alle 15 Minuten die gesamte Website crawlt. Jeder Crawl dauert ungefähr 5 Minuten. Der Zweck des Crawls besteht darin, jede Seite im Lack-Cache zu aktualisieren, damit ein Benutzer nie auf die Generierung der Seite warten muss (da alle Seiten kürzlich dank der Spinne generiert wurden).
Die Zeitleiste sieht folgendermaßen aus:
- 00:00:00: Cache geleert
- 00:00:00: Spider beginnt zu crawlen, um den Cache mit neuen Seiten zu aktualisieren
- 00:05:00: Spider beendet das Crawlen , alle Seiten werden bis 00:15:00 aktualisiert
Eine Anfrage, die zwischen 0:00:00 und 0:05:00 eingeht, trifft möglicherweise auf eine Seite, die noch nicht aktualisiert wurde, und muss einige Sekunden auf eine Antwort warten. Das ist nicht akzeptabel.
Was ich tun möchte, ist, vielleicht mit etwas VCL-Magie, immer Anfragen von der Spinne an das Backend weiterzuleiten, aber die Antwort trotzdem im Cache zu speichern. Auf diese Weise muss ein Benutzer niemals auf die Generierung einer Seite warten, da es kein 5-Minuten-Fenster gibt, in dem Teile des Caches leer sind (außer möglicherweise beim Serverstart).
Wie kann ich das machen?
Die Antwort von Shane oben ist besser als diese. Dies ist eine alternative Lösung, die komplizierter ist und zusätzliche Probleme aufweist. Bitte stimmen Sie der Antwort von Shane zu, nicht dieser. Ich zeige nur eine andere Methode zur Lösung des Problems.
Mein erster Gedanke war,
return (pass);
invcl_recv
und nach der Anfrage abgerufen wurde, invcl_fetch
irgendwie anweisen Varnish , dass es sollte die Objekt - Cache, auch dachte , es speziell früher übergeben wurde.Es stellt sich heraus, dass dies nicht möglich ist :
Das nächstbeste ist also, eine Suche wie bei einer normalen Anforderung auszulösen, aber stellen Sie sicher, dass sie immer fehlschlägt. Es gibt keine Möglichkeit, den Suchprozess zu beeinflussen, daher wird er immer getroffen (vorausgesetzt, er wird zwischengespeichert; wenn nicht, wird er trotzdem fehlen und gespeichert). Aber wir können beeinflussen
vcl_hit
:Wir können es nicht erzwingen, den Cache nicht zu verwenden, aber wir können dieses Objekt aus dem Cache löschen und den gesamten Prozess neu starten. Jetzt geht es zurück zum Anfang
vcl_recv
, wo es schließlich eine weitere Suche durchführt. Da wir das Objekt, das wir aktualisieren möchten, bereits gelöscht haben, wird es fehlen, dann die Daten abrufen und den Cache aktualisieren.Ein bisschen kompliziert, aber es funktioniert. Das einzige Fenster, in dem ein Benutzer zwischen einer Bereinigung und der gespeicherten Antwort stecken bleibt, ist die Zeit, die die einzelne Anforderung verarbeitet. Nicht perfekt, aber ziemlich gut.
quelle