Canva betreibt eine Online-Plattform mit Hunderten Millionen Nutzern. Hunderttausende Anfragen pro Sekunde. Jede muss prüfen: Wer ist der Nutzer? Darf er das? Das Team stand vor der Aufgabe, die Sitzungsverwaltung zu verbessern. Normalerweise würde man bei jedem Request in einer Datenbank nachschlagen – zu langsam und teuer. Canva setzt auf verschlüsselte Browser-Cookies mit allen Sitzungsinformationen: User-ID, Berechtigungen, Rollen. Die Gateways entschlüsseln diese Cookies und prüfen die Legitimität sofort, ohne einen Netzwerkservice zu fragen.
Das Problem: Wenn Sitzungen ungültig werden
Was passiert bei Abmeldung oder Rechteänderung? Alte Cookies müssen in Echtzeit ungültig werden. Canva speichert widerrufene Sitzungen (Revocations) im Arbeitsspeicher der Gateways. Das ist schnell und zuverlässig. Der Haken: Bei jedem Deployment starten Hunderte Gateway-Instanzen neu. Jede lädt alle Revocations aus der MySQL-Datenbank. Das führte zu einer Stampede – Millionen Abfragen pro Instanz. Der Datenbankcluster ächzte unter der Last. Read-Replicas halfen kurzfristig, aber nicht nachhaltig.
Die Idee: S3 als Zwischenspeicher
Die Ingenieure Joeby Neil und Martin Doms suchten eine Lösung, die das Deployment nicht verlangsamt und die Datenbank schont. Ein Zwischenspeicher wie Redis wäre naheliegend, aber Redis ist nicht vollständig dauerhaft. Die Konsistenzprobleme hätten sich nur verschoben. Sie wählten Amazon S3. S3 eignet sich für günstige, schnelle Downloads großer, dauerhafter Dateien. Das Problem: Revocations sind kein statischer Block, sondern ein gleitendes Fenster von 12 Stunden (Cookies erneuern sich regelmäßig). Wie lässt sich ein dynamisches Fenster in S3 abbilden?
30-Minuten-Blöcke als Bausteine
Die Lösung: Sie teilten das 12-Stunden-Fenster in 30-Minuten-Blöcke auf. Jeder Block ist ein separates S3-Objekt. Der Dateiname enthält den Startzeitstempel. Ein Gateway lädt beim Start nur die jüngsten 24 Blöcke herunter – insgesamt wenige Dutzend Megabyte pro Instanz. Jede Revocation ist ein binärer Eintrag von 16 Bytes: 8 Bytes für die Nutzerkennung (Principal), 8 Bytes für den Zeitstempel der Gültigkeit. Dank Sortierung und binärer Suche finden die Gateways Revocations extrem schnell, ohne Java-Objekte zu erzeugen. Speicherverbrauch sank um 87,5 Prozent gegenüber dem alten System.
Die Herausforderung: Aktualisierung der Blöcke
Wie hält man die S3-Blöcke aktuell, ohne bei jeder neuen Revocation den gesamten Block neu zu schreiben? Canva nutzt einen asynchronen Worker, der regelmäßig die Datenbank abfragt, den passenden Block aus S3 lädt, neue Einträge in das sortierte Array einfügt und ihn wieder hochlädt. Mehrere Worker laufen parallel, um Ausfälle zu überbrücken. Das kann zu Datenkonflikten führen. Sie verwenden bedingte PUT-Requests (Conditional PUT) von S3: Vor dem Schreiben prüfen sie, ob sich der Block seit dem Lesen geändert hat. Falls ja, wiederholen sie die Operation. Zusätzlich sorgt ZooKeeper für eine Leader Election, um unnötige Konflikte zu minimieren.
Theoretisch ist die Skalierung problematisch: Jede Batch-Hinzufügung sortiert den gesamten Block – O(N²). In der Praxis arbeiten sie mit Batches von mehreren Hundert Revocations und erreichen über 2000 Schreiboperationen pro Sekunde. Das reicht. Moderne CPUs verarbeiten dichte Arrays so effizient, dass die Netzwerklatenz der Flaschenhals ist, nicht die Sortierung.
Der Effekt: Schnellere Deployments, weniger Datenbanklast
Seit der Umstellung hat Canva die Read-Replicas für die Session-Revocation-Datenbank auf zwei reduziert. Deployments laufen schneller. Gateways streamen Revocations direkt aus S3, statt die Datenbank zu überlasten. Die Systemlast skaliert vorhersagbar mit Schreibrate und Traffic, nicht mit der Anzahl der Gateway-Neustarts.
Das Projekt zeigt: Scheinbar ineffiziente Ansätze können in der Praxis die besten sein. Ein einzelner Worker sortiert Hunderttausende Datensätze immer wieder – klingt nach Verschwendung. Wegen der kompakten Daten und schnellen Rechner ist es die einfachste und stabilste Lösung. Canva testete mehrere Ansätze auf echter Infrastruktur und wählte den pragmatischsten.
Quelle: canva.dev
