Angebote und Schnäppchen {{ work.publishdate|date:"Y-m-d H:i" }}

Backstage | Dezember 2025

Eigentlich hatte in den Beitrag schon Anfang Dezember begonnen, hatte aber keine Zeit ihn wirklich fertigzustellen. Daher nun mit aktualisierter Version für den Dezember. Vorab erstmal nochmal einen guten Start euch allen ins neue Jahr. Ich bin gespannt, welche Herausforderungen und Aufgaben es uns stellt. Ich hoffe, dass zumindest viele gemütliche Brettspielabende mit dabei sind.

Die versprochene Zusammenfassung des Jahres 2025 kommt noch, das hier ist wie üblich nur der bekannte Blick hinter die Kulissen. Daher werde ich auch die Besucherzahlen auslassen und mich dazu später äußern. Nun also zum „technischen Update“ der letzten zwei Monate.

Technische Änderungen im Blog

Das Caching

As Startpunkt nehme ich dieses Mal den Black Friday. Hatte ich anfangs immer Probleme mit zu hoher Serverlast gerade an diesem besucherstarken Tag, konnte der Server die letzten zwei Jahre stand halten. Dieses Jahr hat er dann am Nachmittag die weiße Fahne gehoben und hat ächzend aufgegeben. Wenn auch erstmal selbst „verschuldet“ durch mich, aber dazu später mehr. Um die Last zu reduzieren habe ich über die letzten Monate (und Jahre) an vielen Stellen ein zusätzliches Caching integriert, hab versucht, die Anfragen an die Datenbank zu reduzieren und zu optimieren. Das geht aber nur bis zu einem gewissen Punkt. Daher beginnen wir vielleicht mal von vorne, um das den technisch weniger versierten Menschen etwas näher zu bringen. Vorab: ich bin da auch weiß Gott kein Experte, aber ich habe mir über die letzten Jahre doch einiges an Wissen dazu angeeignet. Falls ihr da noch tiefer drin steckt und ein paar gute Ideen habt, gerne her damit.

Was kann denn ein Webserver überhaupt an gleichzeitigen Besuchern bewältigen? Das kommt natürlich zum Einen auf das Hosting-Paket selbst an, zum anderen aber auch, ob die Seite zwischengespeichert wird. Ist das nicht so, werden bei jedem Aufruf von euch hunderte Datenbankabfragen gestellt, Code compiliert und am Ende als das ausgegeben, was ihr im Browser seht. Bei einem klassischen Webhosting-Paket wird es hier ohne Cache bei 25 gleichzeitig aktiven Besuchern schon eng, 100 gleichzeitig aktive Besucher sind ohne Caching nahezu unmöglich (es sei denn, man hat im Hintergrund einen richtig starken Server stehen). Alles darüber ist utopisch. Als Referenz: am Black Friday waren hier nahezu ununterbrochen mindestens 150 Besucher online, zu Spitzenzeiten am frühen Mittag waren wir bei über 200 Besuchern gleichzeitig (!).

Das Aufkommen irgendwie zu überstehen ist nur mit dem angesprochenen Caching möglich. Damit werden die Inhalte als statische Seite abgespeichert, die dann ohne Datenbankabfragen auskommt. Eine ganz klassische HTML-Datein mit allen Informationen, die der Webserver nur bereitstellt. Nur… das bedeutet, dass bei jeder Änderung diese Seite neu generiert werden muss. Denn sonst seht ihr den neuen günstigeren Preis gar nicht, da die Seite vor 10 Minuten generiert wurde und gerade eben erst die Preissenkung angekommen ist. Im Hintergrund werden die derzeit knapp 70.000 Preise in einem Interval von 8-12 Stunden (bißchen abhängig vom Shop) aktualisiert. Teilweise über Anfragen an die Shops, teils aber auch über importierte CSV-Daten. Aber mal einfach gerechnet: der Tag hat 24 Stunden, das sind 1440 Minuten. Aktualisiere ich nur ein einziges Mal pro Tag die 70.000 Preise sind das grob 50 Preise pro Minute. All das produziert Last. Und nun kommen wir zum eigentlichen Problem: ich habe gesagt, dass danach die statische Seite neu erzeugt werden muss. Das erzeugt natürlich auch Last, die Datenbank wird abgefragt, etc. Ist die statische Datei zum dem Zeitpunkt nicht verfügbar (weil sie eben gerade generiert wird) und ihr öffnet diese erhaltet ihr die dynamische Variante. Die Folge: noch mehr Last! Außerdem gibt es Seiten, die nicht zwischengespeichert werden können. Die Merkliste beispielsweise. Die ist individuell für jeden Einzelnen.

Bis zum frühen Mittag hat das aber alles funktioniert. Teilweise war die Seite etwas langsam, gerade im Bereich der dynamischen Bereiche wie die Merkliste. Aber es ging. Allerdings hat die Suche doch teils lange gebraucht. Klar… viele Besucher, viele Anfragen. Und da es eine „Live-Suche“ ist wird nach jedem Tastendruck eine neue Abfrage gesendet. Diese Last wollte ich reduzieren und habe hier ebenfalls auf eine statische Datei gesetzt, so dass nicht erneut Anfragen an die Datenbank abgeschickt werden. Das hat super geklappt, aber: um die Änderungen „live“ zu nehmen, musste ich den Cache leeren. Und das war der Todesstoß. Da ab dann erstmal ALLE die dynamische Seite bekommen habe, die lokalen Dateien wurden dabei gelöscht. Der Cache baut sich automatisch Stück für Stück wieder auf, braucht aber aufgrund der hohen Last deutlich länger. Ein Teufelskreis. Wir sprechen hier übrigens über den Tag verteilt (also nur der Black Friday) von ca. 16.000 Besuchen (davon 10.000 Unique Besucher) mit ca. 63.000 Seitenaufrufen. Außerdem liegt der Blog auf einem Shared-Hosting. Das bedeutet: auch andere Webseiten nutzen die Ressourcen. Die sind zwar limitiert, aber Peaks gibt es immer.

Nun… wie ist das ausgegangen? Am frühen Nachmittag gab es immer wieder Timeouts, die Seite war nicht erreichbar. Ich habe alle Hintergrundprozesse deaktiviert und der Cache hat sich Stück für Stück aufgebaut. Langsam, aber stetig. Am frühen Abend war dann die Seite wieder einigermaßen stabil, auch weil die Besucherzahlen abgenommen habe. Am späten Abend konnte ich dann auch die Preisaktualisierungen wieder aktivieren. Die Seite lief. Nicht sonderlich schnell, aber sie lief. Das habe ich dann als Anstoß genommen, nochmal über die Performance nachzudenken und mich weiter eingelesen, was es noch für Möglichkeiten in dem Bereich gibt (ich bin hauptberuflich eigentlich Frontendentwickler, daher ist mein Wissen über das „Backend“ eher rudimentär). Aber: nach einigen Artikeln, einigen Gesprächen u.a. auch mit ChatGPT habe ich einen Weg entdeckt, den ich bisher nicht gegangen bin.

Das Wochenende habe ich dann mehr oder weniger genutzt, um die Optimierungen einzubauen. Und siehe da… danach war die Seite DEUTLICH schneller. Selbst im ungecachten Zustand. Hatten wir vorher bei vielen Besuchern Antwortzeiten von 3-4 Sekunden liegen wir jetzt bei < 2 Sekunden, ist nicht viel los < 1 Sekunde. Die Datenbankabfragen konnte ich ebenfalls deutlich reduzieren. Was mache ich denn nun? Ich speichere mir grundlegende Daten, die ich jedes Mal erneut abgefragt habe, im Arbeitsspeicher bzw. als Datei auf der Festplatte. Somit entfallen dafür die Abfragen. Weniger Anfragen, weniger Last. Und der Zugriff auf den Speicher ist nun mal deutlich schneller. Im Großen und Ganzen bin ich damit nun sehr zufrieden. Im Dezember habe ich immer mal wieder an einigen Stellen kleinere Dinge optimiert, aber die Seite läuft performant und stabil. Wir hatten nicht mehr die Besucherzahlen eines Black Friday, aber aufgrund der Beiträge zu den Kalender ist die Vorweihnachtszeit auch immer sehr besucherstark,

Die leidigen Bots

Leider immer noch ein Thema… die Bots. Das sind automatisierte Skripte, die die Seite durchforsten und indizieren. Der Google-Bot schaut täglich vorbei und liest sich den Inhalt der Seiten aus. Aber es gibt eben nicht nur die „Guten“. Viele Bots suchen automatisiert Sicherheitslücken, versuchen auf Dateien zuzugreifen, sich irgendwie in die Datenbank einzuhacken. Das sind wieder alles Zugriffe, die der Server verarbeiten muss. Da kommt der ClaudeBot, der YandexBot, der Qwantbot. Alle wollen sich irgendwelche Daten ziehen. Und es nervt so hart. Viele davon habe ich inzwischen ausgesperrt, da sie keinerlei Nutzen für den Blog bringen und einfach nur Ressourcen fressen. Trotz der vielen Sperren gibt es aber weiterhin die Skripte, die sich „irgendwie“ identifizieren und sich dabei natürlich nicht an irgendwelche Regeln halten. Daher habe ich eine Art Besuchermuster-Erkennung ergänzt, die versucht, eben jene Bots zu identifizieren und automatisiert zu sperren. Das klappt überwiegend ziemlich gut. Allerdings gab es noch einen Bug, der dazu geführt hat, dass einige von euch ebenfalls als „Bot“ identifiziert wurden, obwohl ihr nur etwas in der Spieleliste gesucht habt. Diesen Bug habe ich nun behoben, danke auch an die Meldungen und detaillierten Berichte von Patrick und Stephan. Solltet ihr keinen Zugriff auf den Blog haben (und einen „403“ erhalten), meldet euch bei mir (über den RSS Feed werdet ihr den Beitrag definitiv lesen können).

Weitere Änderungen in Kurzform

  • Aktuell nicht mehr relevant aber die Abfragen zu den Kalenderangeboten habe ich etwas reduziert. Bisher wurde bei jedem Aufruf eine Anfrage abgesendet, erneut unnötige Serverlast. Und sooo schnell ändert sich da nichts. Neben dem Caching auf meiner Seite werden die Daten nun für 15 min auch in eurem Browser zwischengespeichert.
  • Was ihr auch gesehen habt: die Gruppendeals der Spiele-Offensive sind nun „einklappbar“, so dass sie in den Beiträgen nicht mehr so viel Platz wegnehmen. Alle notwendigen Information sind direkt sichtbar, Details gibt es nach dem Aufklappen. Das und auch das manuelle Ein-/Ausklappen der Historie hat die Übersicht in den Beiträgen zu den Kalendern deutlich verbessert.
  • Wie oben bereits erwähnt habe ich die meist genutzte Suche im Kopfbereich der Seite auf eine statische Datei umgestellt. Damit könnt ihr nun wirklich „live“ suchen. Pfeilschnell. Und ohne auch nur ein einzige Datenbankabfrage.
  • Ebenfalls bekommt ihr als „angemeldeter“ Benutzer nun bevorzugt die gecachte Datei ausgespielt, soweit vorhanden. Ihr habt hier generell die „Live“-Variante ausgeliefert bekommen, auch wenn das keinen Unterschied gemacht hat. Auch hier: mehr Geschwindigkeit für euch, weniger Last für den Server.
  • Durch ein paar technische Anpassungen kann ich nun auch einfacher Styles und Javascript ändern, ohne jedes Mal den kompletten Cache leeren zu müssen (um auch das Black Friday Szenario nicht erneut heraufzubeschwören).

Alles in allem bin ich jetzt sehr zufrieden mit der Performance der Seite, mal schauen wie lange. Nahezu alle Seiten werden in 30-80 ms ausgeliefert, selbst die dynamischen Teilen liegen bei 1-2 Sekunden (bei großer Last etwas länger). Die Zahlen sind von gerade eben, zu der aktuell auch immerhin noch 52 Leute „online“ sind.

Shops

  • Die Schnittstelle zu Amazon.de musste ich deren v2 aktualisiert. Klingt erstmal gut, ist es leider nicht. Denn ich bekomme noch weniger Daten als vorher. Keine Versandkosten mehr, keine Info, ob ein Prime-Versand möglich ist. Daher sind die Angebote hier ausschließlich auf diejenigen Titel beschränkt, die direkt von Amazon.de verkauft und versandt werden.
  • Aktualisierte Versandkosten für DLP Games und Anspieler.
  • Müller ist derzeit deaktiviert, da die Abfrage der Preise nicht mehr zuverlässig funktioniert hat. Ich habe es aber über einige Umwege geschafft, einen Kontakt zu Müller herzustellen. Jetzt im Januar ist ein Gespräch geplant, wie eine mögliche Integration zu realisieren ist. Gesetz dem Fall, dass hier das Interesse von Müller besteht. Aber ich bin zuversichtlich.
  • Neu hinzugekommen zum Preisvergleich ist Gamer’s HQ, noch gibt es nicht viele Verlinkungen. Die kommen teils automatisch die nächsten Tage.

Was steht nun an für die kommenden Tage, Wochen und Monate?

Das ist eine gute Frage. Und ich kann euch keine konkrete Antwort geben. Die Liste an Features ist lang, meine Zeit leider begrenzt. Seit einigen Wochen bin ich dran, im Hintergrund erneut einige Dinge zu ändern, um u.a. auch endlich mal dem Problem mit den Kontaktformularen Herr zu werden. Viele berichten über Probleme beim Absenden. Ich habe euch nicht ignoriert, versprochen!  Nehme ich den Bot-Schutz aber raus erhalte ich pro Tage an die 30-40 Emails mit automatisierten Abfragen. Generell bin ich damit bei etwa 80% (also nicht nur die Kontaktformulare, alles in allem). Wenn ich das live stelle, werdet ihr davon erstmal keinen (sichtbaren) Vorteil haben. Es verändert sich nichts an der Seite, das sind nur (notwendige) Änderungen, um die Seite auch für die Zukunft stabil, erweiterbar und sicher zu halten.

In diesem Sinne genieße ich jetzt etwas den restlichen Sonntag.