Zum Inhalt springen
Monitoring & Notfall

Cache-Drift im Shop: alte Preise, fremde Warenkörbe

Seiten-, Objekt- und Auslieferungs-Cache laufen auseinander: Der Shop zeigt einen Preis, die Kasse rechnet einen anderen. Wie sich Drift messen und abstellen lässt.

16 Min. Lesezeit CachingMonitoringPreisangaben

Kurz und einfach erklärt

Ein Cache ist ein Zwischenspeicher. Er macht den Shop schneller. Aber er zeigt eine Kopie mit einem älteren Stand.

Steckt ein Preis oder ein Lagerbestand in der Kopie, kann es Fehler geben. Die Seite zeigt dann einen anderen Preis als die Kasse. Oder ein leerer Artikel bleibt bestellbar.

Persönliche Daten wie ein Warenkorb gehören nicht in einen geteilten Zwischenspeicher. Sonst sieht ein Kunde fremde Daten.

Der Beitrag zeigt, wie man solche Fehler messen kann. Wir prüfen Preise und Bestände nach jeder Änderung am Shop und melden Abweichungen.

Ein Cache ist kein Beschleuniger, sondern eine Kopie - und jede Kopie trägt einen Zeitpunkt. Solange nur Bilder, Schriftarten und Textbausteine zwischengespeichert werden, fällt das niemandem auf. Sobald aber ein Preis, ein Lagerbestand oder eine Versandregel in einer Kopie steckt, entscheidet nicht mehr die Datenbank darüber, was der Kunde sieht, sondern die älteste Schicht, die noch antwortet. Genau dort entsteht Cache-Drift: Die Detailseite zeigt bei einem Beispielartikel 49,90 Euro, die Kasse rechnet mit 44,90 Euro, ein ausverkaufter Artikel bleibt bestellbar - und jede dieser Antworten kommt mit Status 200. Kein Eintrag im Fehlerprotokoll, kein Alarm, keine auffällige Ladezeit. Wer ohne ausdrückliche Ablaufangabe ausliefert, überlässt die Frist ohnehin dem Speicher: Als typischen Anteil an der Zeit seit der letzten Änderung nennt die Norm 10 % (RFC 9111, Abschnitt 4.2.2). Dieser Beitrag behandelt Caching deshalb nicht als Tempofrage, sondern als Frage der Korrektheit - welche Antwort überhaupt in einen geteilten Speicher darf, wie sich Drift zwischen Liste, Detailseite und Warenkorb messen lässt und welche Prüfung nach jedem Deployment fällig ist.

Das Wichtigste in Kürze

  • Ohne ausdrückliche Ablaufangabe schätzt ein Cache die Frische selbst; als typischen Anteil an der Zeit seit der letzten Änderung nennt die Norm 10 % (RFC 9111, Abschnitt 4.2.2). Damit entscheidet der Zeitpunkt des letzten Schreibzugriffs darüber, wie lange ein Preis gilt.
  • Personalisierte Antworten gehören nicht in einen geteilten Speicher: Trägt eine Antwort die Anweisung private, darf ein geteilter Cache sie nicht ablegen (RFC 9111, Abschnitt 5.2.2.7). Fehlt die Anweisung, ist der fremde Warenkorb kein Ausnahmefall, sondern die logische Folge.
  • Die Invalidierung ist der eigentliche Prüfpunkt. Nach einer unsicheren Anfrage muss ein Cache die Zieladresse ungültig machen (RFC 9111, Abschnitt 4.4), und bei einer Produktänderung muss jede zwischengespeicherte Seite fallen, die dieses Produkt zeigt (Shopware-Dokumentation, Cache-Tags).
  • Ein vorgelagerter Auslieferungs-Cache folgt eigenen Regeln: Ein auf ihn gemünztes Kopffeld verdrängt Cache-Control und Expires vollständig (RFC 9213, Abschnitt 2.2). Wer nur die Kopfzeilen des Shops liest, misst die falsche Schicht.
  • Drift lässt sich ohne Last messen: Liste, Detailseite und Warenkorb innerhalb einer Minute abfragen, den ausgewiesenen Preis vergleichen und den Cache-Status mitschreiben. Ob eine Antwort aus dem Speicher kam, sagt das Feld hit (RFC 9211, Abschnitt 2.1).
  • Ein falsch ausgewiesener Gesamtpreis ist kein Schönheitsfehler: Die Pflicht zur Angabe des Gesamtpreises steht in der Preisangabenverordnung (§ 3 Absatz 1 PAngV), der Bußgeldrahmen reicht bis fünfundzwanzigtausend Euro (§ 3 Absatz 2 WiStrG 1954).

Cache ist ein Korrektheitsproblem, kein Tempoproblem

In fast jeder Beschreibung taucht Caching als Hebel für Ladezeit auf: weniger Datenbankabfragen, schnellere Auslieferung, bessere Werte in der Messung. Das stimmt, greift aber zu kurz. Ein Cache beantwortet die Frage „Was war zuletzt wahr?“ und nicht die Frage „Was ist jetzt wahr?“. In einem Shop sind das zwei verschiedene Dinge, sobald Preise gepflegt, Bestände fortgeschrieben oder Aktionen beendet werden. Wer Caching allein über Tempo steuert, optimiert einen Messwert und nimmt dabei eine Fehlerquelle in Kauf, die in keiner Tempomessung sichtbar wird. Deshalb gehört die Frage nach der Gültigkeit einer Antwort in dieselbe Überwachung wie Erreichbarkeit und Antwortzeit - und nicht in ein getrenntes Kapitel für Fortgeschrittene.

Der zweite Grund, warum Cache-Drift so lange unentdeckt bleibt, ist ihr Auftreten: Sie erzeugt keinen Ausfall. Die Seite lädt, der Warenkorb füllt sich, die Bestellung geht durch. Ein veralteter Preis sieht aus wie ein richtiger Preis, ein veralteter Bestand wie ein vorhandener. Auffällig wird die Sache erst in der Buchhaltung, im Kundendienst oder in einer Beschwerde - also Tage später und weit entfernt von der Ursache. Anders als bei einem Ausfall der Zahlungsstrecke gibt es keinen Zeitpunkt, an dem das System selbst sagt, dass etwas nicht stimmt. Wer die Abweichung finden will, muss sie messen.

Was ein Treffer im Cache aussagt - und was nicht

Antwortet eine Schicht aus ihrem Speicher, wird das im Cache-Status vermerkt. Der zugehörige Wahrheitswert besagt, dass die Anfrage aus dem Speicher bedient und nicht weitergereicht wurde (RFC 9211, Abschnitt 2.1). Er sagt nichts darüber, ob der Inhalt noch stimmt: Auch eine abgelaufene Kopie kann als Treffer gelten, wenn sie ohne Rückfrage ausgeliefert wird. Ein hoher Trefferanteil ist also eine Aussage über Entlastung, nie über Richtigkeit - und taugt deshalb nicht als Beleg dafür, dass Preise und Bestände aktuell sind.

Drei Schichten, drei Wahrheiten

In einem typischen Aufbau liegen mindestens drei Speicher hintereinander. Der Objekt-Cache hält Ergebnisse einzelner Berechnungen: aufgelöste Preise, Kategoriebäume, Regelwerke. Der Seiten-Cache des Shops hält ganze HTML-Antworten und spart damit den gesamten Aufbau der Seite; die Entwicklerdokumentation führt ihn als Pflichtbestandteil jedes Produktivsystems (Shopware-Dokumentation, HTTP-Cache). Davor sitzt oft ein Auslieferungs-Cache, der Antworten ortsnah beim Besucher vorhält. Jede dieser Schichten hat eine eigene Frist, eine eigene Leerung und einen eigenen Schlüssel, unter dem sie ablegt. Drift entsteht nicht, weil eine Schicht falsch arbeitet, sondern weil drei richtig arbeitende Schichten unterschiedlich alt sind.

Der Schlüssel ist dabei der unterschätzte Teil. Zwei Antworten, die für den Menschen dieselbe Seite sind, können für den Cache zwei Einträge sein - oder umgekehrt zwei verschiedene Antworten ein einziger Eintrag. Wird eine Antwort mit dem Vary-Feld nach Sprache, Währung oder Kundengruppe getrennt, darf die gespeicherte Fassung ohne Rückfrage nur verwendet werden, wenn die genannten Kopfzeilen der neuen Anfrage denen der ursprünglichen entsprechen (RFC 9111, Abschnitt 4.1). Fehlt die Angabe, bekommt die Kundengruppe mit Sonderkonditionen den Listenpreis - oder alle anderen bekommen den Sonderpreis.

SchichtWas dort gespeichert wirdTypischer Driftfall
Objekt-Cacheaufgelöste Preise, Regelwerke, KategoriebäumeDie Preisregel ist gepflegt, der abgelegte Wert stammt vom Vortag
Seiten-Cache im Shopganze HTML-Antworten je SchlüsselDie Detailseite zeigt den alten Preis, die Kasse rechnet mit dem neuen
Auslieferungs-CacheAntworten ortsnah beim BesucherGemäß RFC 9111 schätzt die Schicht ohne Ablaufangabe mit rund 10 % der Zeit seit der letzten Änderung
Browser des KundenAntworten für genau eine PersonEin hart gesetztes Höchstalter hält den alten Preis über Tage fest
Suchindex und Preisportaleausgelesene Angaben aus der SeiteDer Fehler wandert nach außen und wird dort erneut zwischengespeichert

Praktisch heißt das: Ein einzelner Blick auf die Detailseite beweist nichts. Erst der Vergleich derselben Angabe über mehrere Schichten hinweg zeigt, ob der Shop eine Wahrheit hat oder mehrere. Wie eng das mit der übrigen Betriebsüberwachung zusammenhängt, zeigt der Beitrag zum Performance-Monitoring im Wartungsvertrag: Dieselben Messpunkte, nur mit einer anderen Frage.

Ohne Ablaufangabe rät der Cache

Antworten ohne ausdrückliche Ablaufangabe sind der Normalfall, nicht die Ausnahme. Für sie darf ein Cache eine Frist schätzen, und die Norm nennt als typischen Ansatz einen Anteil von 10 % (RFC 9111, Abschnitt 4.2.2) der Zeitspanne seit der letzten Änderung. Das klingt harmlos, ist aber eine Kopplung an eine völlig sachfremde Größe: Eine Seite, die seit dreißig Tagen unverändert ist, bekommt damit eine Frist von rund drei Tagen - unabhängig davon, dass der Preis darauf morgen früh wechselt. Je länger ein Artikel unverändert bleibt, desto länger hält der Speicher an seiner Kopie fest. Der stabile Artikel ist also der gefährlichste.

Die Gegenmaßnahme ist keine Kunst, sondern Disziplin: Jede Antwort, die einen Preis oder einen Bestand trägt, bekommt eine ausdrückliche Frist. Für geteilte Speicher gibt es dafür eine eigene Anweisung, deren Höchstalter das allgemeine Höchstalter und das Ablaufdatum überschreibt (RFC 9111, Abschnitt 5.2.2.10). Damit lässt sich die kurze Frist dort setzen, wo viele Menschen dieselbe Kopie sehen, ohne den Browser des einzelnen Kunden ebenso kurz zu takten. Ebenso wichtig ist die Gegenrichtung: Eine abgelaufene Kopie darf nicht einfach weitergereicht werden, wenn eine ausdrückliche Anweisung das untersagt (RFC 9111, Abschnitt 4.2.4).

Die Frist gehört an die Antwort, nicht in eine Konfigurationsdatei

Fristen, die nur in der Serverkonfiguration stehen, überleben kein Umzugsprojekt und keinen Wechsel der Auslieferung. Fristen, die die Anwendung an jede Antwort schreibt, wandern mit. Der Unterschied wird sichtbar, sobald eine zweite Schicht dazukommt: Ein vorgelagerter Speicher liest, was in der Antwort steht, nicht was im Verzeichnis des Shops konfiguriert war. Wer Preise ausliefert, setzt die Frist deshalb dort, wo der Preis entsteht - und protokolliert sie, damit die Prüfung nach dem nächsten Deployment etwas zum Vergleichen hat.

Eine Schicht bleibt dabei gern unbemerkt. Für auslieferungsnahe Caches gibt es ein eigenes Kopffeld, und wenn es gesetzt ist, muss die Schicht Cache-Control und Expires in dieser Antwort unbeachtet lassen (RFC 9213, Abschnitt 2.2). Eine sorgfältig gesetzte Frist im Shop ist dann wirkungslos, ohne dass irgendwo ein Widerspruch gemeldet würde. Diese Schicht muss man getrennt messen - mit denselben Werkzeugen, aber von außen, so wie es der Beitrag zur Bilderwartung für kurze Ladezeiten für statische Dateien beschreibt.

Was nie in einen geteilten Cache gehört

Der teuerste Fehler dieser Familie ist nicht der alte Preis, sondern die fremde Seite. Er entsteht, wenn eine personalisierte Antwort in einem Speicher landet, den viele Besucher teilen. Die Norm ist an dieser Stelle eindeutig: Trägt eine Antwort die Anweisung private, darf ein geteilter Cache sie nicht ablegen, weil sie für genau eine Person bestimmt ist (RFC 9111, Abschnitt 5.2.2.7). Ohne diese Anweisung entscheidet nur noch der Schlüssel darüber, wer die Kopie bekommt - und der kennt keine Sitzung, wenn niemand sie ihm mitgegeben hat.

Zwei weitere Regeln gehören in dieselbe Prüfung. Eine Antwort auf eine Anfrage mit Autorisierungs-Kopfzeile darf ein geteilter Speicher nicht für spätere Anfragen wiederverwenden, solange die Antwort das nicht ausdrücklich erlaubt (RFC 9111, Abschnitt 3.5). Und wo gar nichts gespeichert werden soll, gibt es eine klare Anweisung: Der Cache darf dann weder von der Anfrage noch von der Antwort irgendeinen Teil ablegen (RFC 9111, Abschnitt 5.2.2.5). Genau diese drei Regeln sind es, die nach einem Umbau der Auslieferung als Erstes still verlorengehen.

The unqualified private response directive indicates that a shared cache MUST NOT store the response (i.e., the response is intended for a single user).

RFC 9111, Abschnitt 5.2.2.7

Warenkorb und Sitzung

Alles, was an eine Sitzungskennung gebunden ist, gehört in keinen geteilten Speicher. Der Schaden ist hier nicht ein falscher Preis, sondern eine fremde Bestellung.

Angemeldete Ansichten

Kundenkonto, Merkzettel, Rechnungsübersicht. Wird die Autorisierung nicht beachtet, reicht eine einzige zwischengespeicherte Antwort für einen meldepflichtigen Vorfall.

Preise je Kundengruppe

Staffelpreise, Netto-Ansichten und Aktionen für angemeldete Kunden brauchen einen Schlüssel, der die Gruppe enthält - sonst sehen alle den Preis der ersten Anfrage.

Trennung nach Kopfzeilen

Die gespeicherte Antwort darf ohne Rückfrage nur dienen, wenn die genannten Kopfzeilen übereinstimmen (RFC 9111, Abschnitt 4.1). Jede Angabe erhöht die Zahl der Einträge.

Zahlarten und Versandkosten

Beides hängt an Land, Gruppe und Warenkorbwert. Eine zwischengespeicherte Auswahl führt zu einer Summe, die im nächsten Schritt nicht mehr gilt.

Fehler- und Wartungsseiten

Eine kurzzeitige Störung, die mit langer Frist gespeichert wird, überlebt die Störung um Stunden. Das ist der Fall, der den Umsatz am schnellsten kostet.

Die Trennung nach Kopfzeilen ist dabei ein zweischneidiges Werkzeug. Jede zusätzliche Angabe vervielfacht die Zahl der Einträge und senkt den Anteil der Treffer; zu wenige Angaben mischen Ansichten, die nicht zusammengehören. Der brauchbare Mittelweg besteht darin, personalisierte Teile aus der zwischengespeicherten Seite herauszulösen und getrennt nachzuladen. Dann bleibt die Seite selbst gut speicherbar, und der Teil, der einer Person gehört, wird nie geteilt.

Preisdrift messen, nicht vermuten

Eine Messung braucht drei Zutaten: dieselbe Angabe an mehreren Stellen, einen engen Zeitrahmen und ein Protokoll. Für einen Shop heißt das konkret: den Preis eines Artikels in der Kategorieliste, auf der Detailseite, in der Schnittstelle des Warenkorbs und in der Kasse innerhalb einer Minute abfragen, jeweils den ausgewiesenen Gesamtpreis und die Verfügbarkeit festhalten und zusätzlich notieren, welche Schicht geantwortet hat. Ob die Antwort aus einem Speicher kam, steht im Cache-Status (RFC 9211, Abschnitt 2.1); das Alter der Kopie steht im Age-Feld. Weichen zwei Werte voneinander ab, ist die Drift belegt - mit Zeitstempel, Adresse und Schicht.

Die Messung gehört auf eine Auswahl, nicht auf den ganzen Bestand: die zwanzig umsatzstärksten Artikel, alles mit laufender Aktion, alles mit knappem Bestand. Ein Durchlauf alle fünfzehn Minuten genügt im Alltag; rund um eine Preispflege oder eine Aktion wird der Takt für einige Stunden verkürzt. Wichtig ist der Vergleich mit der Quelle: Der Wert aus der Datenbank ist die Wahrheit, alles andere ist eine Kopie mit Alter. Wer die Messung an die bestehende Überwachung der Antwortzeiten hängt, bekommt beide Bilder in einer Ansicht.

preisdrift-messen.sh
#!/usr/bin/env bash
# Denselben Artikel über mehrere Schichten abfragen und die Abweichung melden.
set -euo pipefail

BASIS="https://www.beispielshop.test"
ARTIKEL="/artikel/SW10001"
QUELLE=$(mysql -N -B -e "SELECT preis FROM preis_aktuell WHERE nummer='SW10001'")

messen() {
  local pfad="$1" name="$2"
  local kopf leib preis status alter
  kopf=$(curl -sS -D - -o /tmp/leib.$$ --max-time 10 "${BASIS}${pfad}")
  leib=$(cat /tmp/leib.$$); rm -f /tmp/leib.$$
  preis=$(printf '%s' "$leib" | grep -oP '"price"\s*:\s*\K[0-9.]+' | head -1)
  status=$(printf '%s' "$kopf" | grep -i '^cache-status:' | tr -d '\r' || true)
  alter=$(printf '%s' "$kopf" | grep -i '^age:' | tr -d '\r' || true)
  printf '%-22s %-10s %-28s %s\n' "$name" "${preis:-?}" "${status:-ohne}" "${alter:-ohne}"
  if [ -n "${preis:-}" ] && [ "$preis" != "$QUELLE" ]; then
    printf 'DRIFT %s: %s statt %s\n' "$name" "$preis" "$QUELLE" >&2
  fi
}

printf '%-22s %-10s %-28s %s\n' SCHICHT PREIS CACHE-STATUS ALTER
messen "/kategorie/aktionen" "Liste"
messen "$ARTIKEL" "Detailseite"
messen "/store-api/product/SW10001" "Schnittstelle"
messen "/checkout/cart" "Warenkorb"

Die Prüfung nach jedem Deployment

Cache-Regeln gehen selten im laufenden Betrieb verloren. Sie gehen bei Umbauten verloren: beim Wechsel des Auslieferungswegs, beim Aktualisieren einer Erweiterung, die eigene Kopfzeilen setzt, beim Umstellen der Serverkonfiguration oder beim Einbau einer Zwischenschicht. Deshalb gehört eine kurze, immer gleiche Prüfliste an das Ende jedes Wartungsfensters - abgearbeitet auf der Produktivumgebung, nicht auf der Kopie, denn nur dort stehen alle Schichten in der echten Reihenfolge.

  • Kopfzeilen einer Artikelseite gelesen: Ist eine ausdrückliche Frist gesetzt, und passt sie zur Pflegehäufigkeit des Preises?
  • Warenkorb und Kundenkonto geprüft: Tragen diese Antworten die Anweisung private, und antwortet die vorgelagerte Schicht mit einem Durchreichen statt mit einem Treffer?
  • Eine Preisänderung an einem Testartikel gepflegt und gemessen, nach wie vielen Sekunden sie in Liste, Detailseite und Warenkorb ankommt.
  • Bestand eines Artikels auf null gesetzt und geprüft, ob die Bestellbarkeit in allen Schichten verschwindet und nicht nur auf der Detailseite.
  • Das Kopffeld für die auslieferungsnahe Schicht kontrolliert, weil es die Angaben des Shops in dieser Antwort verdrängt (RFC 9213, Abschnitt 2.2).
  • Invalidierung bei einer unsicheren Anfrage nachgestellt: Nach einer Bestellung muss die Zieladresse ungültig werden (RFC 9111, Abschnitt 4.4).
  • Protokoll der letzten Leerung eingesehen - wann, durch wen, welcher Umfang, und ob die Hintergrundverarbeitung sie überhaupt abgeschlossen hat.
  • Ergebnis in denselben Bericht geschrieben, in dem auch Regressionstests nach Updates landen, damit zwei Prüfungen eine Ablage haben.

Diese Liste kostet in geübter Hand zehn Minuten. Sie ersetzt keine laufende Überwachung, aber sie findet genau die Klasse von Fehlern, die durch einen Umbau entsteht und danach monatelang bleibt. Wer Änderungen ohnehin in getrennten Umgebungen vorbereitet, kann die halbe Liste dort abarbeiten - die zweite Hälfte bleibt trotzdem für die Produktivumgebung reserviert, weil die vorgelagerte Schicht dort eine andere ist.

Wenn die Invalidierung ausfällt

Eine Frist ist die eine Hälfte der Antwort, die gezielte Ungültigkeitserklärung die andere. Ein Cache muss die Zieladresse ungültig machen, sobald er auf eine unsichere Anfrage eine Antwort ohne Fehlerstatus sieht (RFC 9111, Abschnitt 4.4) - eine Bestellung, eine Änderung, eine Löschung. Im Shop kommt eine zweite Ebene dazu: Ändert sich ein Produkt, muss jede zwischengespeicherte Seite fallen, die dieses Produkt zeigt (Shopware-Dokumentation, Cache-Tags). Das sind selten wenige Seiten - ein Artikel steckt in Listen, Suchergebnissen, Empfehlungen und Startseitenblöcken gleichzeitig. Genau deshalb ist die Markierung dieser Beziehungen die empfindlichste Stelle im ganzen Aufbau.

Der Einstieg ist immer eine Abweichung mit Zeitstempel: Quelle sagt 44,90, eine Schicht sagt 49,90. Ohne diesen Nachweis beginnt jede Untersuchung mit einer Vermutung. Die laufende Messung liefert ihn nebenbei mit, inklusive Alter der Kopie und antwortender Schicht.

Der vierte Punkt verdient besondere Aufmerksamkeit, weil er nach außen wie ein Cache-Problem aussieht und keines ist. Wird die Ungültigkeitserklärung an eine Warteschlange übergeben und arbeitet der zuständige Prozess nicht, bleibt alles stehen: Die Anwendung meldet die Änderung korrekt, der Speicher erfährt nie davon. Wie sich solche stillen Ausfälle in der Hintergrundverarbeitung überwachen lassen, gehört deshalb in denselben Prüftakt. Führt die Störung zu falschen Preisen im laufenden Verkauf, ist sie ein Fall für den Notfall-Support und nicht für das nächste Wartungsfenster.

Was ein falscher Preis rechtlich bedeutet

Technisch ist ein veralteter Preis eine Kopie. Rechtlich ist er eine Angabe gegenüber Verbrauchern. Wer Waren anbietet oder unter Angabe von Preisen wirbt, hat den Gesamtpreis anzugeben (§ 3 Absatz 1 PAngV). Verstöße dagegen sind ausdrücklich als Ordnungswidrigkeit ausgestaltet (§ 20 PAngV), und der Rahmen dafür steht im Wirtschaftsstrafgesetz: bis zu fünfundzwanzigtausend Euro (§ 3 Absatz 2 WiStrG 1954). Diese Zahl ist ein Rahmen und keine Erwartung - entscheidend ist, dass eine technische Ursache die Verantwortung nicht aufhebt. Der Cache ist aus Sicht der Vorschrift kein Beteiligter, sondern ein Werkzeug des Anbieters.

Daneben steht das Wettbewerbsrecht. Irreführend ist eine geschäftliche Handlung, wenn sie unwahre oder zur Täuschung geeignete Angaben über bestimmte Umstände enthält (§ 5 Absatz 2 UWG). Ausdrücklich genannt sind dabei die wesentlichen Merkmale der Ware einschließlich der Verfügbarkeit (§ 5 Absatz 2 Nummer 1 UWG) sowie der Preis und die Art und Weise seiner Berechnung (§ 5 Absatz 2 Nummer 2 UWG). Ein ausverkaufter Artikel, der aus einer alten Kopie heraus weiter bestellbar bleibt, trifft damit beide Punkte gleichzeitig - und zwar unabhängig davon, ob jemand die Absicht hatte.

Gesamtpreis

Die Pflicht trifft die Angabe, nicht die Datenbank. Ob der richtige Wert im System stand, ist für die Bewertung der ausgelieferten Seite ohne Belang.

Verfügbarkeit

Die Angabe zur Lieferbarkeit zählt zu den wesentlichen Merkmalen. Ein Bestand aus einer alten Kopie ist deshalb dieselbe Art von Fehler wie ein alter Preis.

Angaben vor der Bestellung

Unmittelbar vor der Abgabe der Bestellung sind die vorgeschriebenen Informationen klar und hervorgehoben bereitzustellen (§ 312j Absatz 2 BGB) - aus der Quelle, nie aus dem Speicher.

Lieferbeschränkungen

Spätestens zu Beginn des Bestellvorgangs ist anzugeben, ob Lieferbeschränkungen bestehen und welche Zahlungsmittel akzeptiert werden (§ 312j Absatz 1 BGB).

Nachweisbarkeit

Ohne Protokoll lässt sich später nicht zeigen, wie lange eine falsche Angabe ausgeliefert wurde. Die Messreihe ist damit auch eine Akte.

Folgekosten

Neben dem Bußgeldrahmen stehen Abmahnkosten, Rückabwicklung und Kundendienstaufwand. Der technische Aufwand für eine Messung ist dagegen klein.

Die naheliegende Schlussfolgerung lautet nicht „weniger Caching“, sondern „bewusstes Caching mit Nachweis“. Wer die Regeln für jede Seitenart einmal festlegt, protokolliert und nach jedem Umbau prüft, hat einen belastbaren Stand. Wie sich die textliche Seite dieser Pflichten pflegen lässt, beschreibt der Beitrag zur Wartung von Rechtstexten und Preisangaben; der technische Weg, auf dem eine korrekte Angabe trotzdem falsch beim Kunden ankommt, ist die Ergänzung dazu.

Cache-Regeln im Wartungsvertrag verankern

Was nicht beschrieben ist, wird nach dem dritten Umbau anders gemacht. Deshalb gehören vier Dinge schriftlich fest: die Frist je Seitenart, die Liste der Antworten, die niemals geteilt werden dürfen, der Auslöser für jede Ungültigkeitserklärung und die Prüfung, die nach jedem Deployment läuft. Diese vier Punkte passen auf eine Seite und ersparen in der Praxis lange Untersuchungen, weil sie aus jeder Abweichung eine Frage nach dem Soll-Zustand machen statt einer Frage nach Meinungen. In einem Wartungsvertrag mit festen Reaktionszeiten sind sie gut aufgehoben, weil sie dort mit Zuständigkeit und Frist verbunden sind.

Im Betrieb ergänzen sich zwei Takte: die laufende Messung, die jede Abweichung binnen Minuten meldet, und die Prüfung im Wartungsfenster, die den Soll-Zustand nach jedem Eingriff wiederherstellt. Wie sich solche Fenster ohne Umsatzausfall legen lassen, zeigt der Beitrag zu Wartungsfenstern im laufenden Verkauf; wie eng Auslieferung und Sichtbarkeit zusammenhängen, der Beitrag zur Überwachung der Indexierbarkeit. Einen Überblick über den Umfang der laufenden Betreuung gibt die Seite zu den Leistungen im Managed Service; wer den Bestand zuerst gemessen haben möchte, findet den Einstieg über die Shopware-Wartung oder direkt über eine Anfrage mit Zugangsdaten zum Shop.

Quellen und Studien

Dieser Artikel stützt sich auf: RFC 9111 (HTTP Caching), Abschnitte 3.5, 4.1, 4.2.2, 4.2.4, 4.4, 5.2.2.5, 5.2.2.7 und 5.2.2.10; RFC 9211 (The Cache-Status HTTP Response Header Field), Abschnitt 2.1; RFC 9213 (Targeted HTTP Cache Control), Abschnitt 2.2; Preisangabenverordnung, §§ 3 und 20; Wirtschaftsstrafgesetz 1954, § 3; Bürgerliches Gesetzbuch, § 312j; Gesetz gegen den unlauteren Wettbewerb, § 5; Shopware-Entwicklerdokumentation, Kapitel Cache. Alle Angaben wurden am 16. September 2026 gegen die genannten Quellen abgeglichen.

Verwandte Artikel

Sicherheit

Rabattcodes in der Black Week: Missbrauch früh erkennen

Rabattcodes in der Black Week schützen: Codelänge, Rate-Limit am Gutscheinfeld, Alarm bei Fehlversuchen und ein Neukundenrabatt, der Mehrfachkonten standhält.

21 Min. Lesezeit
Monitoring & Notfall

Wenn die Platte voll läuft: Shop-Speicher überwachen

Eine volle Datenpartition erzeugt keinen Ausfall, sondern hängende Bestellungen. Welche Verzeichnisse wachsen, welche Schwelle greift, welcher Turnus hilft.

14 Min. Lesezeit
Monitoring & Notfall

Indexierbarkeit überwachen: wenn noindex live geht

Ein noindex aus dem Testsystem fällt oft erst auf, wenn der Umsatz einbricht. So entsteht eine Prüfkette aus fünf Stufen, die Abweichungen am selben Tag meldet.

17 Min. Lesezeit