am 21. Juli 2009
Wenn man schon lange PHP programmiert, hat man schon an einigen Projekte mitgearbeitet. Ich glaube, ich mache das jetzt fast seit 10 Jahren mehr oder weniger professionell, doch manchmal erkennt man Dinge doch erst sehr spät. In diesem Fall geht es um das Cachen. Gar nicht mal um eine spezielle Technik, wie memcache oder localcache. Ich war oft der Meinung, dass man mit Caching fast jede Webseite performant bekommen kann und dazu stehe ich heute auch noch.
Was ich aber bemerkt habe, ist ein Phänomen, das mir, wenn ich so darüber nachdenke, schon öfters über den Weg gelaufen ist, bei dem Entwickler sich so stark vom Caching abhängig machen, dass die Webseite nicht ohne diesen funktionieren kann. Dies kann aber meiner Meinung nach zu einem wirklichen Problem werden.
Ich kenne Webseiten, die ohne Caching bis zu einer Minute brauchen, um ihre Startseite zu “berechnen”. Natürlich kann man jetzt einen HTTP Cache davorschalten, so kann man sicher sein, dass z.B. ein squid die bereits gerenderte Seite im Speicher hält und sie nicht mehr berechnet werden müssen. Das geht natürlich nur so lange, wie sich die Seite nicht verändert hat. Prinzipiell ist ein squid eine feine Sache und jedem zu empfehlen, sich aber schon bei der Programmierung darauf zu verlassen, dass dieser die Last wegnimmt ist meiner Meinung nach falsch.
Wenn ich lokal arbeite, dann unterliegen meine Sourcen permaneten Änderungen, ein Cache wäre also mehr als lästig, denn ich müsste ihn für die Stellen immer ausschalten, die ich gerade am bearbeiten bin. Entwickle ich an einem Projekt, bei dem eine Seite bis zu einer Minute zum rendern braucht, bekomme ich ganz schnell einen Nervenzusammenbruch, auch wenn die Seite dann im Produktivumfeld schnell wie die Hölle ist.
Oft sind es auch Probleme in der Architektur, die Caches erst notwendig machen. Oder glaub ihr, dass ein Xing Personen, die ich kennen könnte live berechnet? Ich tippe mal ganz stark drauf, dass dies in einem separaten Thread geschieht und den eigentlichen Server damit nicht ausbremst. Zumindest die Vorberechnungen. So etwas muss danach ganz klar gecached werden, aber als Entwickler betrachte ich dieses Teil danach als Blackbox und es beeinträchtigt nicht die eigentliche Seitenberechnung.
Zusätzlich erschwert die Verwendung von Caching immer das Debugging. Ich weiß nicht, welche Version meines Sktiptes denn jetzt wirklich gecached wurde. Ist es die neue Seite und mein Bug wurde nicht behoben oder ist es einfach die alte und es dauert nicht ein wenig, bis die Änderungen live sind. Natürlich kann ich meinen Cache invalidieren und somit zwingen die Seite neu zu berechnen. Dies ist aber immer ein zusätzlicher Schritt.
Ein wichtiger Punkt bei der Sache ist noch das “aufwärmen” des Caches. Mit aufwärmen meine ich, dass der Cache anfänglich keine Anfragen gespeichert hat und diese erst nach und nach füllt. Die ersten 100 Anfragen auf 100 Unterseiten würden also alle 1 Minute dauern. Dies würde bedeuten, dass mein Server in den ersten Minuten unter einer unglaublichen Last steht, die er vielleicht nicht ab kann. Aufwendige Aufwärm-Skripte müsste ich mir in diesem Fall einfallen lassen. Das kann ja auch nicht wirklich effizient sein.
Ziel muss es also sein, Teile der Software, die beim rendern einer Seite verwendet werden so performant hinzubekommen, dass diese auch ohne Cache in passabler Zeit beim Browser ankommt. Sollte eure Seite also ohne Cache kaum funktionieren, solltet ihr euch mal Gedanken darüber machen, ob ich nicht bestimmte Anfragen ausserhalb und asynchron berechnet werden sollten. Ich will damit nicht sagen, dass ihr keine Caches verwenden sollt, denn dieser Ansatz ist ein ganz wichtiger. Nur sollte man sich überlegen, ob man mit dem Caching nicht architektonische Fehler vertuschen will und man es dem Entwickler nicht unnötig kompliziert dadurch macht.