Direkt zum Hauptbereich

Idee zum WebCaching

Immer wieder treibt mich das Thema "HTTP-Caching" um -- ich nenne es auch gerne WebCaching, auch wenn der Begriff es nicht ganz trifft. Caching ist ein wichtiges Thema in vielen Bereichen, in denen es um Performanz geht. Prozessorarchitekturen, Datenbanken und webbasierte Systeme etc. nutzen Caching sozusagen als Turbolader. Vermeintlich langsame Systeme können durch geschickte Caching-Strategien rasend schnell werden, indem sie die von ihnen erwarteten Reaktionen vorhalten.

Kurz etwas Hintergrund zu HTTP und HTTP-basiertem Caching, bevor ich zu meiner Caching-Idee komme.

HTTP ist ein Anfrage/Antwort-Protokoll. Der Client, z.B. Sie über Ihren Webbrowser, schickt eine HTTP-Anfrage (request) an einen Webserver, und der Server beantwortet die Anfrage mit einer HTTP-Rückmeldung, einem HTTP-Reply. Es ist immer dasselbe. Ausschließlich der Client schickt Requests an den Server; und der Server reagiert nur auf diese Anfragen mit einem Reply. Das Prinzip ist sehr einfach.

Wenn Sie eine normale Webseite aufrufen, wird in aller Regel eine Vielzahl von HTTP-Requests an den Webserver geschickt. All das regelt der Browser automatisch für Sie und hängt ab von den Inhalten einer Webseite (Bilder, CSS etc.), die noch nachzuladen sind. Wenn Sie dieses Spielchen einmal verfolgen wollen, es gibt mit LiveHTTPHeaders eine nette Erweiterung für den Firefox, die Sie installieren können.

Caching funktioniert nur, wenn sich zwischen Client und Server eine oder mehrere Cache-Einheiten befinden, die den ganzen HTTP-Traffic mit abbekommen und gegebenenfalls HTTP-Requests "abfangen" und statt des Servers ein Reply an den Client zurückgeben. Der Server ist damit entlastet.

Bevor der Cache einen HTTP-Request abfängt, muss er wissen, für welche Requests er die Reply übernehmen darf. Dazu markiert der Server beim Versand einer Reply den HTTP-Header mit einem Hinweis, dass ein Cache die Nachricht für eine gewisse Zeit vorhalten darf. Der mitlesende Cache merkt sich das und antwortet zukünftig auf gleiche Anfragen in Stellvertretung für den Server.

Um es ein wenig konkreter zu machen: Sie dürfen sich einen Request wie eine Anfrage vorstellen die lautet "Gib mir den Inhalt der Webseite www.xyz.de/test.html", woraufhin der Webserver www.xyz.de bzw. ein zwischengeschalteter Cache den Inhalt test.html zurück liefert.

Bei diesem Ansatz gibt es ein Problem: Ändert sich test.html beim Webserver und ist die Caching-Zeit beim Cache noch nicht abgelaufen, liefert der Cache die "veraltete" Seite zurück -- und der Server kann den "neuen" Inhalt nicht ausliefern, da der Cache den HTTP-Request nicht durchläßt.

Irgendwie muss also der Cache vom Server über die Ungültigkeit von test.html im Cache informiert werden. Dazu gibt es jedoch kein standardisiertes Protokoll. Wenn Inhalte vor Ihrer Zeit im Cache ungültig werden, Pech gehabt. Wenn man auf Lösungen Marke Eigenbau verzichten möchte, dann muss man sich etwas einfallen lassen, was vollkommen verträglich ist mit der Standard-Webtechnologie.

Meine Idee dazu:

Der Client fragt test.html beim Server an. Der Server liefert zwar test.html mit einem Reply aus, jedoch enthält test.html nicht den eigentlichen Seiteninhalt, sondern ein JavaScript-Programm. Dieses Programm weist den Client an (sofern JavaScript ausgeführt werden darf), eine Seite test-001.html per Request vom Server anzufragen und den Inhalt von test-001.html zum Inhalt von test.html zu machen (Stichwort DOM, Document Object Model). Dieser Inhaltstausch ist wichtig, damit die Seite auch unter test.html per Bookmark gemerkt werden kann. Der Server gibt also test.html nicht zum Cachen frei, jedoch test-001.html (z.B. für eine Stunde).

Jede neue Anfrage nach test.html belastet zwar den Server damit, eine kurze Antwort auszuliefern, die das JavaScript-Programm enthält, aber die Folgeanfrage nach test-001.html wird vom Cache beantwortet. Dem Server wird damit der wesentliche Traffic vom Leib gehalten.

Ändert sich test.html beim Server, wird eine neue Version test-002.html generiert. Erreicht nun den Server ein neuer HTTP-Request für test.html, liefert er test.html mit einem leicht geänderten JavaScript-Programm aus, das nun nicht mehr zum Nachladen von test-001.html auffordert, sondern nach test-002.html verlangt. Damit wird der Cache "umgangen", der Server kann die aktuelle test-002.html-Seite ausliefern und fürs Caching (z.B. wieder für eine Stunde) freigeben.

Haben Sie die Idee im Kern verstanden?

Ich kann mir gut vorstellen nicht der Erste zu sein, der diese Idee hat. Wenn Sie eine entsprechende Seite finden, ich würde mich freuen davon zu erfahren. Vielleicht haben Sie noch andere interessante Ideen? Sicher gibt es noch andere Varianten zum Caching.

Beliebte Posts aus diesem Blog

Lidl und der Kassen-Bug

Es gibt Fehler, im Informatiker-Jargon "Bugs", die etwas anrühriges haben. Ich bat den Menschen an der Kasse bei Lidl um einen Moment Geduld und meine Kinder um Ruhe, um nicht den wunderbaren Moment zu verpassen, bei dem es passierte. Der Lidl-Mensch fluchte kurz auf -- und ich war entzückt! "Einen Moment, davon muss ich ein Foto machen!" Und dann machte ich noch eines. Ich bin heute extra für diesen Fehler zu Lidl gepilgert -- ich wollte es mit eigenen Augen sehen. Gestern hat mir ein Student (vielen Dank Herr Breyer) von diesem Fehler in einer EMail berichtet. Ein richtig schöner Fehler, ein Klassiker geradezu. Ein Fehler, den man selten zu Gesicht bekommt, so einer mit Museumswert. Dafür wäre ich sogar noch weiter gereist als bis zum nächsten Lidl. Der Fehler tritt auf, wenn Sie an der Kasse Waren im Wert von 0 Euro (Null Euro) bezahlen. Dann streikt das System. Die kurze Einkaufsliste dazu: Geben Sie zwei Pfandflaschen zurück und Lidl steht mit 50 Cent bei Ihne...

Syntax und Semantik

Was ist Syntax, was ist Semantik? Diese zwei Begriffe beschäftigen mich immer wieder, siehe zum Beispiel auch " Uniform Syntax " (23. Feb. 2007). Beide Begriffe spielen eine entscheidende Rolle bei jeder Art von maschinell-verarbeitbarer Sprache. Vom Dritten im Bunde, der Pragmatik, will ich an dieser Stelle ganz absehen. Die Syntax bezieht sich auf die Form und die Struktur von Zeichen in einer Sprache, ohne auf die Bedeutung der verwendeten Zeichen in den Formen und Strukturen einzugehen. Syntaktisch korrekte Ausdrücke werden auch als "wohlgeformt" ( well-formed ) bezeichnet. Die Semantik befasst sich mit der Bedeutung syntaktisch korrekter Zeichenfolgen einer Sprache. Im Zusammenhang mit Programmiersprachen bedeutet Semantik die Beschreibung des Verhaltens, das mit einer Interpretation (Auslegung) eines syntaktisch korrekten Ausdrucks verbunden ist. [Die obigen Begriffserläuterungen sind angelehnt an das Buch von Kenneth Slonneger und Barry L. Kurtz: Formal Syn...

Factor @ Heilbronn University

It was an experiment -- and it went much better than I had imagined: I used Factor (a concatenative programming language) as the subject of study in a project week at Heilbronn University in a course called "Software Engineering of Complex Systems" (SECS). Maybe we are the first university in the world, where concatenative languages in general and Factor in specific are used and studied. Factor is the most mature concatenative programming language around. Its creator, Slava Pestov, and some few developers have done an excellent job. Why concatenative programming? Why Factor? Over the years I experimented with a lot of different languages and approaches. I ran experiments using Python, Scheme and also Prolog in my course. It turned out that I found myself mainly teaching how to program in Python, Scheme or Prolog (which still is something valuable for the students) instead of covering my main issue of concern: mastering complexity. In another approach I used XML as a tool ...