DNS-Round-Robin funktioniert unter Last nicht mehr, wenn Clients beginnen, Antworten zu cachen. Agoda hat dies auf der Ebene des Objektspeichers festgestellt und die Lastverteilung in eine separate Schicht verlagert.
Das Problem trat während des Wachstums der Datenlasten auf. S3-kompatible Endpunkte verwendeten DNS-Round-Robin zur Verteilung des Traffics. In der Praxis cachten die Clients die DNS-Antworten und gingen weiterhin zu demselben Backend. Infolgedessen verlor das System an Gleichmäßigkeit: Einzelne Knoten wurden überlastet, andere standen still. Dies ist ein klassischer Fall, in dem die Lastverteilung auf DNS-Ebene nicht mehr steuerbar und beobachtbar ist.
Die Lösung besteht darin, die Lastverteilung aus DNS zu entfernen und in eine verwaltete Schicht zu verlagern. Agoda führte einen Reverse Proxy Storefront zwischen den Diensten und dem Objektspeicher ein. Der Proxy trifft Entscheidungen über die Routenführung basierend auf dem aktuellen Zustand der Backends. Zunächst wurde der Algorithmus der wenigsten aktiven Anfragen verwendet, aber unter realer Last wurde dieser verfeinert, indem ein latency-aware Scoring hinzugefügt wurde. Dies ist ein Kompromiss: mehr Logik und Zustand im Proxy, aber vorhersehbare Verteilung und Kontrolle.
Die Implementierung basiert auf Rust und dem Framework Pingora. Der Proxy routiert nicht nur Anfragen, sondern löst auch betriebliche Probleme:
– IO-Timeouts schützen Connection-Pools vor Clients, die Antworten nicht vollständig lesen
– Der Traffic zwischen den Rechenzentren ist in separate Backend-Pools isoliert
– Die Arbeit mit HTTP Expect: 100-continue wurde optimiert, um die Latenz beim Upload zu reduzieren
– Es wurde eine credential-less Authentifizierung durch Identifizierung von Kubernetes-Pods hinzugefügt
Der letzte Punkt ändert das Zugriffsmodell. Dienste verwalten Credentials nicht mehr direkt. Die Kontrolle wird im Proxy zentralisiert, was das Risiko von Lecks verringert und die Compliance vereinfacht. Dies ist eine Verschiebung der Verantwortung von Anwendungen auf die Infrastruktur.
Infolgedessen wurde Storefront nicht nur zu einem Proxy, sondern zu einem Punkt für Zugriffsmanagement und Beobachtbarkeit. Über OpenTelemetry gibt das System Metriken zu Latenz, Auslastung, Traffic-Mustern und der Nutzung der S3-API aus. Konkrete numerische Verbesserungen werden nicht offengelegt, aber architektonisch wurde das Schlüsselproblem gelöst: Die Lastverteilung ist deterministisch und steuerbar geworden, anstatt ein Nebeneffekt von DNS zu sein.