AdTech · Neuentwicklung
Hochverfügbarer Traffic-Attribution-Service für eine globale AdTech-Plattform.
Ein verteilter, manueller Prozess über mehrere Abteilungen wurde durch einen hochverfügbaren Go-Service ersetzt. Zentralisiert, skalierbar, ausfallsicher. Jeder Request der AdTech-Plattform bekommt in unter 10ms die Attributierungswerte die Media Buyer für präzises Kampagnen-Tracking brauchen.

Die Ausgangssituation
Traffic-Attributierung verteilt über mehrere Abteilungen. Umständlich. Nicht skalierbar.
Die Traffic-Attributierung einer globalen AdTech-Plattform war auf mehrere Abteilungen verteilt. Kein zentrales System, kein einheitlicher Prozess, keine skalierbare Lösung. Mit steigendem Traffic und wachsender Kampagnenzahl wurde das Problem größer.
Media Buyer konnten nur einen Bruchteil der möglichen Kampagnen tracken weil die Attributierung nicht mit dem Wachstum der Plattform mithalten konnte. Jeder Request der Plattform brauchte zusätzliche Attributierungswerte zur besseren Zuordnung des Traffics, aber ein zentraler Service der das zuverlässig und schnell liefern konnte existierte nicht.
Die Herausforderung
Hochverfügbar. Unter 10ms. Kein Single Point of Failure.
Die Anforderungen waren klar und kompromisslos: Der Service muss jeden Request der AdTech-Plattform in unter 10ms mit Attributierungswerten anreichern. Er darf nicht ausfallen weil jeder Ausfall direkt das Kampagnen-Tracking der gesamten Plattform beeinträchtigt.
Gleichzeitig musste der Service global verfügbar sein. Der hauptsächliche Traffic entstand in EU und US, beide Regionen brauchten eine eigenständige, hochverfügbare Instanz. Und die Attributierungswerte mussten über mehrere Cache-Layer konsistent, tageweise vergeben und atomar verwaltet werden.
Mein Ansatz
Zentralisiert.
Optimiert.
Ausfallsicher.
Go-Service mit Multi-Region Deployment
Go als Sprache der Wahl wegen der nativen Unterstützung für hohe Concurrency und niedrige Latenz. Service in EU und US deployed, jede Region eigenständig und hochverfügbar. AWS Global Accelerator leitet Traffic zur nächstgelegenen Region, ein ALB verteilt die Last innerhalb der Region. Kein Single Point of Failure, kein Cross-Region Bottleneck.
Mehrschichtige Cache-Architektur
Drei Cache-Layer für maximale Performance: In-Memory Cache für häufig abgefragte Werte, Valkey für verteiltes Caching innerhalb einer Region, DynamoDB für persistente tagesweise Vergabe der Attributierungswerte mit atomaren Transaktionen. Der richtige Cache zur richtigen Zeit.
Attributierungswerte tageweise und atomar verwalten
Attributierungswerte werden tageweise vergeben und über DynamoDB-Transaktionen atomar verwaltet. Keine Race Conditions, keine doppelte Vergabe, keine inkonsistenten Zustände auch unter hoher Last.
Multi-Tenant-fähige Architektur
Der Service ist von Grund auf multi-tenant-fähig gebaut. Mehrere Mandanten werden isoliert und sicher auf derselben Infrastruktur betrieben – jeder mit eigenen Attributierungswerten, ohne gegenseitige Beeinflussung.
Integration in die AdTech-Plattform
Jeder Request der Plattform wird über den neuen Service angereichert. Nahtlose Integration ohne Änderungen an bestehenden Systemen. Die Plattform bekommt die Attributierungswerte in unter 10ms, Media Buyer können präziser tracken und optimieren.
Was schwierig war
Zwei Regionen, eine Wahrheit.
Unabhängige Regionen und eine gemeinsame Zahlenfolge sind ein Widerspruch. EU und US sollten ohne einander funktionieren, jede Region für sich hochverfügbar, kein regionsübergreifender Engpass. Gleichzeitig wurden die Attributierungswerte tageweise vergeben und durften sich nicht doppeln. Wer beides wörtlich nimmt, kommt nicht weiter: Echte Unabhängigkeit bedeutet, dass eine Region nicht wissen kann, was die andere gerade vergeben hat.
Auflösen ließ sich das nur, indem man aufhörte, den Widerspruch zu implementieren, und stattdessen den Wertebereich aufteilte. Jede Region vergibt aus ihrem eigenen Bereich, atomar über DynamoDB abgesichert. Damit ist jede Vergabe eindeutig, ohne dass die Regionen sich im Anfragepfad abstimmen müssen. Der Preis: Die Werte sind nicht mehr lückenlos fortlaufend. Das war der Punkt, an dem eine fachliche Zusage geändert werden musste, damit die technische überhaupt einlösbar wurde.
Vorher aber musste jemand entscheiden, welche Zahl stimmt. Die Attributierung lag verteilt über mehrere Abteilungen, jede mit eigener Auswertung und eigenen Zahlen. Solange nicht festgelegt war, welche davon künftig die maßgebliche ist, hätte jeder zentrale Service nur den Streit zementiert. Diese Frage war nicht technisch, sondern eine Entscheidung, die getroffen und getragen werden musste, bevor der erste Service lief.
Das Ergebnis
5x mehr Kampagnen. Unter 10ms. Weltweit verfügbar.
mehr Kampagnen trackbar
Media Buyer können fünfmal mehr Kampagnen tracken als zuvor.
Latenz pro Request
Auch unter Last zuverlässig unter 10ms durch mehrschichtige Cache-Architektur.
Requests täglich
Zuverlässig verarbeitet, hochverfügbar in EU und US, kein Produktionsausfall seit Launch.
Ein verteilter, manueller Prozess über mehrere Abteilungen wurde durch einen zentralen hochverfügbaren Go-Service ersetzt. Media Buyer können fünfmal mehr Kampagnen tracken als zuvor. Jeder Request der Plattform bekommt in unter 10ms die Attributierungswerte die für präzises Kampagnen-Tracking benötigt werden. Der Service läuft hochverfügbar in EU und US, skaliert automatisch mit dem Traffic mit und hat seit dem Launch keinen Produktionsausfall verursacht.
Eingesetzte Technologien
Bewährte Tools. Kein Experiment.
- Golang
- gRPC
- REST
- In-Memory Cache
- Valkey
- DynamoDB
- AWS ECS
- EC2
- ALB
- Global Accelerator
- IAM
- Terraform
- Docker
- OpenTelemetry
- Datadog
- Grafana
- CloudWatch
Kundenstimmen
Was Auftraggeber sagen.
„Herr Rutte hat für uns ein komplett individuelles CRM entwickelt und dies genau auf unsere Bedürfnisse zugeschnitten. Die Zusammenarbeit war unkompliziert. Er hat unsere Anforderungen perfekt umgesetzt und das System läuft absolut stabil.“
„Tim hat bei uns als PHP-Entwickler gearbeitet und einen richtig guten Job gemacht. Er hat sich schnell ins Projekt eingearbeitet und auch bei kniffligen Themen immer eine Lösung gefunden. Der Code war sauber, nachvollziehbar und hat uns echt weitergebracht. Wir würden jederzeit wieder mit Tim zusammenarbeiten.“
„Die Entwicklung unserer Software wurde wie besprochen fertiggestellt und alle Probleme wurden beseitigt. Vielen Dank.“
Häufig gefragt
Was Auftraggeber vorher wissen wollen.
Wie lange hat die Neuentwicklung gedauert?
Der erste produktive Teil ging nach etwa drei Monaten live, der vollständige Ersatz des manuellen Prozesses war nach rund neun Monaten erreicht. Ausgeliefert wurde durchgehend in Schritten, nicht zu einem Stichtag.
Warum Go und nicht die vorhandene Sprache?
Weil der Dienst 3 Millionen Anfragen täglich unter 10 Millisekunden beantworten musste und dabei mehrere Mandanten trennen sollte. Go liefert dafür ein vorhersagbares Laufzeitverhalten bei geringem Speicherbedarf. Die vorhandene PHP-Landschaft blieb bestehen und wurde über gRPC angebunden.
Was war der schwierigste Teil?
Nicht die Technik, sondern die Frage, welche Daten der Wahrheit entsprechen. Der manuelle Prozess lief über mehrere Abteilungen, jede mit eigener Tabelle. Vor der ersten Zeile Code stand die Klärung, welche Quelle in welchem Fall gilt.
