Ausgabe 98

Rückblick Kalenderwoche 2025-26

🗺️ Es gibt mal wieder gute Neuigkeiten aus der Bikerouter-Welt.

Neben einigen Kleinigkeiten im Frontend1 habe ich endlich mal eine Aufgabe abhaken können, die ich lange vor mir hergeschobenen habe:

Backend-Caching von Routing-Anfragen bzw. deren Ergebnisse.

Was ist damit gemeint? Wann immer eine Route bzw. ein Routensegment zwischen zwei gesetzten Punkten berechnet werden soll, schickt der Webbrowser eine Anfrage an den Server. Diese Anfrage enthält die notwendigen Informationen für die BRouter-Engine: Start- und Endpunkt, gewähltes Routing-Profil und ausgewählte Alternative (siehe Ausgabe 2025-21), eventuelle No-Go-Zonen usw.

Besitzt eine Route neben Start- und Endpunkt auch Zwischenpunkte, so wird für jedes Segment eine Berechnung durchgeführt und die Route dann aus den Einzelteilen zusammengesetzt.

Eine einfache Anfrage mit allen benötigten Informationen sieht etwa so aus:

lonlats=13.630514,52.296704|13.741611,51.065562&profile=quaelnix-gravel&alternativeidx=0&format=geojson

Die BRouter-Engine berechnet aus der Anfrage eine Route und liefert diese als GeoJSON zurück. Daraufhin kann sie dann im Webbrowser verarbeitet werden: Darstellen auf der Karte, Aktualisieren der Statistiken/Routen-Analyse und Detail-Tabellen, Zeichnen des Höhenprofils und vieles mehr.

Ist das berechnete Routensegment sehr lang, kommt es zu mehr oder weniger langen Wartezeiten während der Berechnung. Es kann hier durchaus mal eine halbe Minute oder mehr vergehen. Das ist nicht nur von der Entfernung zwischen den beiden Punkten abhängig, sondern auch von der Komplexität des Routing-Profils.

Wird die Seite neu geladen (oder per Link/Bookmark aufgerufen), werden alle Berechnungen ebenfalls neu gestartet, was dann wieder zu Wartezeiten führen kann.

Seit Ende letzter Woche werden berechnete Routensegmente auf dem Server zwischengespeichert. Sie können so bei einer erneuten Anfrage mit den identischen Parametern sofort an den Webbrowser zurückgeschickt werden, anstatt alles noch mal neu berechnen zu müssen.

Beispiel: Die Berechnung einer Graveltour von hier nach Dresden (oder umgekehrt), benötigt mit dem Profil „Gravel quaelnix“ etwa 8 Sekunden. Die Developer Tools des Browsers stellen das so dar:

„Waiting for server response” ist der Zeitraum, der auf die Berechnung der Route gewartet werden muss. Lädt man die Seite neu, liegt das Ergebnis jetzt nahezu sofort vor:

Die benötigte Zeit für das Laden der Route hat sich also von gut acht Sekunden auf ein paar Millisekunden verringert.

Ändert man die Parameter, z. B. indem man ein anderes Profil wählt oder einen Punkt verschiebt, muss natürlich wieder komplett neu berechnet werden.

Die berechneten Routensegmente werden im Hauptspeicher des Servers zwischengespeichert, sind also nicht permanent. Sie verlieren nach spätestens sechs Stunden ihre Gültigkeit: das ist ungefähr auch das Aktualisierungsintervall der Routingdaten, ein längeres Zwischenspeichern verliert so recht schnell den Sinn.

Je nach Auslastung kann die Speicherdauer auch deutlich kürzer sein, hier ist der verfügbare bzw. zugewiesene Speicher ausschlaggebend. Mir fehlen zur Zeit noch die Erfahrungswerte, wie der Speicher dimensioniert werden muss, das werde ich aber in den nächsten Tagen und Wochen herausfinden.

Besonders praktisch ist das für Routen, die geteilt werden (z. B. über QRCode oder Kurzlink). Diese laden natürlich jetzt sehr schnell und es müssen nicht alle Leute, die den Link angeklickt haben jeweils einige Sekunden warten. Und der Server muss auch nicht dieselben Routensegment für jeden Viewer separat neu berechnen.

Die Cache Hit-Rate liegt zur Zeit bei rund 30 %2, was deutlich höher ist, als ich erwartet habe.

Neben der Betrachtung einer einzelnen Anfrage lässt sich der Einfluss der Zwischenspeicherung auch über alle Anfragen eines Tages sehr deutlich sehen:

Verteilung der Antwortzeiten ohne Zwischenspeicher (Samstag 21. Juni 2025)
Verteilung der Antwortzeiten mit Zwischenspeicher, es ist zu sehen, dass sich der Anteil der sofort beantworteten Anfragen (< 5 ms) deutlich erhöht hat. (Samstag 28. Juni 2025)

⚡ Für das Caching der Bikerouter-Routenberechnungen habe ich auf ein bekanntes und von mir seit langer Zeit gern genutztes Tool zurückgegriffen: Varnish HTTP Cache.

Unter anderem habe ich Varnish auch bei MTB News, Rennrad News, eMTB News und Nimms Rad im Einsatz – dort hat es sich seit vielen Jahren bewährt und sorgt dafür, dass (hauptsächlich) die WordPress-Seiten schnellstmöglich ausgeliefert werden.

Für so eine simple Anwendung wie beim Einsatz bei Bikerouter musste ich an der Standard-Konfiguration nicht allzuviel anpassen: Das ist ein weiterer Vorteil einer Web-Applikation, die ohne Cookies und serverseitigen State auskommt.


🩸 Am Mittwoch war ich wieder Blut spenden und habe bei der Suche nach dem nächsten Termin entdeckt, dass man sich einen RSS-Feed mit den Terminen in der Umgebung erstellen kann (DRK-Blutspendedienst Nord-Ost). Praktisch, denn so muss ich nicht mehr aktiv daran denken, sondern kann aus dem RSS-Reader mit einem Klick das Anmeldeformular für die nächste Spende öffnen.


🕵️ Bei Mastodon bin ich darauf aufmerksam geworden, dass der BND (ja, genau der) neuerdings einen Merch-Shop hat.

Und so bin ich jetzt im Besitz eines BND-Shirts.


📸 Adobe hat mit Indigo eine Kamera-App veröffentlicht, die irgend etwas mit „AI“ macht. An sich nicht weiter spannend, aber es gibt dort eine Funktion, welche es wirklich in sich hat.

Es gibt unter anderem die Möglichkeit, Reflexionen in Glasscheiben aus Fotos herauszurechnen. Denkt an Fotos, die aus dem Auto oder der Bahn gemacht werden, oder generell aus Innenräumen heraus.

Bilder sagen mehr als Worte (alle unbearbeitet, nur verkleinert):

Originalbild in HDR, daher der scheinbar geringe Kontrast. Die Reflexionen sind deutlich in der Bildmitte sichtbar.
Das Bild ohne (fast ohne) Reflexion
Die herausgerechneten Daten.

Die Berechnungen finden lokal auf dem Telefon statt, es wird dafür vorher ein Model heruntergeladen.

Indigo speichert die herausgerechneten Reflexionen als eigene Bilddatei – es ist ziemlich spannend zu sehen, wie viele Informationen darin noch enthalten sind.


📈 Chart.js ist vielleicht bekannt, immerhin eine der beliebtesten Libraries, um mit Javascript im Browser Diagramme zu zeichnen.

Charts.css macht etwas Ähnliches, aber nur mit CSS 🤯


🗽 Ich schaue gerade die Serie Zero Day und ein Zitat aus der vierten Episode geht mir seit Tagen nicht mehr aus dem Kopf:

Freedom is what allows people like you to do whatever you want.

Liberty is what protects the rest of us from people like you.

Warum es mich so beeindruckt, kann ich nicht präzise sagen. Eventuell hat es mit der Tatsache zu tun, dass es im Englischen mindestens zwei Worte für unser „Freiheit“ gibt und die genannten beiden Begriffe recht deutlich zwischen der individuellen Freiheit und der Freiheit im Sinne des Schutzes vor Übergriffigkeit mächtigerer Entitäten trennen.

Der Freiheitsbegriff wird ja in den letzten Jahren sehr oft missverstanden und immer öfter nur im egoistischen Sinne genutzt.

Vielleicht ist es an der Zeit für eine deutlichere Erzählung, die uns allen noch mal bewusst macht, was damit eigentlich gemeint ist.


🔊 In dieser Woche gehört:


  1. Unter anderem habe die alle Server-Requests von XMLHttpRequest auf fetch() umgestellt, ein paar Übersetzungen hinzugefügt und die Anzeige der originalen OpenStreetMap Tag-Values beim Hovern mit der Maus über Werten in den Routen-Analyse-Tabellen eingebaut. Und „CyclOSM Lite“ lässt sich jetzt als neue Overlay-Ebene auswählen. ↩︎

  2. 30 % Cache Hit-Rate bedeutet, dass fast ein Drittel der Anfragen direkt aus dem Zwischenspeicher beantwortet werden kann. ↩︎

Tippe mindestens zwei Zeichen.