Der Ansatz
Die Architektur trennt drei Aufgaben sauber: Import, normalisierter Kern, Auslieferung. Der Import holt die DATEX-II-Publikationen der offiziellen Quellen, liest sie streamend statt als komplettes Dokument im Arbeitsspeicher, prüft sie gegen das Schema und übersetzt sie in ein eigenes, schlankes Domänenmodell. Der Standard endet damit an der Systemgrenze – alles dahinter arbeitet mit klaren, eigenen Begriffen.
Als Datenrückgrat dient ein skalierbares .NET-Backend. Die Wahl passt zur Art der Arbeit: schemagetriebenes XML im Dauerbetrieb. Statische Typisierung bildet ein modellgetriebenes Format direkt ab, die XML-Werkzeugkette erlaubt streamendes Lesen auch großer Momentaufnahmen bei flachem Speicherverbrauch, und langlaufende Hintergrunddienste mit geplanten Läufen sind erstklassig unterstützt. Import und Ausliefer-API skalieren getrennt, weil ihre Lastprofile nichts miteinander zu tun haben: der Import läuft stoßweise im Takt der Quellen, die API folgt dem Nutzerverhalten.
Die kontinuierliche Aktualisierung der Marktpreise läuft als eigener Takt neben den Bestandsdaten. Jeder Durchlauf vergleicht gegen den zuletzt bekannten Stand, sodass nur echte Änderungen Folgearbeit auslösen – Schreibzugriffe, Cache-Invalidierung, Aktualisierung der Kartenebene. Jeder Datensatz trägt dabei Herkunft und Zeitstempel mit sich. Das ist keine Kosmetik: Nur so lässt sich in der App ehrlich anzeigen, wie aktuell ein Wert ist, und im Fehlerfall auf Quelle und Zeitpunkt zurückführen, statt im Gesamtsystem zu suchen.
Auf der Client-Seite sprechen iOS und Android kein DATEX II, sondern eine bewusst schmale API. Kartenabfragen laufen ausschnittsbezogen über einen räumlichen Index und werden je nach Zoomstufe zusammengefasst, damit die übertragene Datenmenge an den sichtbaren Ausschnitt gekoppelt ist und nicht an die Größe des Gesamtbestands. Echtzeitdaten in einer Mobile App heißen deshalb nicht, alles ans Gerät zu schicken, sondern pro Ansicht genau das Nötige – aus vorbereiteten Lesemodellen, die auch dann antworten, wenn eine Originalquelle gerade nicht erreichbar ist.