- Mit dem Wachstum von Discord wurde die Datenbank für den Nachrichtenspeicher mehrfach ausgetauscht
- Anfangs wurde eine einzelne MongoDB verwendet. Als die Zahl der Nachrichten im November 2015 auf 100 Millionen anstieg, traten die Grenzen von MongoDB zutage
- 2017 erfolgte der Wechsel zu Cassandra mit einem 12-Knoten-Cluster, um mehrere Milliarden Nachrichten zu speichern
- 2022 stieg die Zahl der Nachrichten auf Billionen, wodurch die Infrastruktur auf enorme 177 Knoten anwuchs; die Latenzen wurden unvorhersehbar und die Wartungskosten extrem hoch
- Das Problem von Discord mit Cassandra waren Hot Partitions. Bestimmte Teile der DB wurden überlastet, was die Leistung der gesamten Anwendung beeinträchtigte
- Da die interne Datenstruktur von Cassandra auf LSM-Bäumen basiert, sind Leseoperationen teurer als Schreibvorgänge, und gleichzeitige Lesezugriffe vieler Nutzer auf einem einzelnen Server erzeugen Hotspots und führen zu Leistungseinbußen
- Wartungsarbeiten wie die SSTable-Kompaktierung beeinflussten die Gesamtleistung und verschärften das Problem zusätzlich
- Deshalb begann Discord mit einer Neugestaltung der Architektur, bei der verschiedene Komponenten zusammengeführt wurden
- Genutzt wurden unter anderem eine monolithische API, ein in Rust implementierter Datenservice und ein auf ScyllaDB basierendes Speichersystem (eine in C++ entwickelte Cassandra-kompatible DB)
- Mit der Einführung von ScyllaDB wurden deutliche Verbesserungen erzielt
- Die p99-Leselatenz sank auf 15 ms, verglichen mit 40–125 ms bei Cassandra
- Die p99-Schreiblatenz sank auf 5 ms, verglichen mit 5–70 ms bei Cassandra
- Die Discord-Ingenieure schrieben den Datenservice in Rust
- Mithilfe von Rusts Fearless Concurrency wurde gleichzeitiger Traffic auf Hot Partitions kontrolliert
- Rusts Bibliotheken und Concurrency-Funktionen passten sehr gut zu den Anforderungen von Discord
- Der Datenservice fungiert als Vermittlungsdienst zwischen dem API-Monolithen und dem Datenbank-Cluster
3 Kommentare
Ich habe mich gerade mit dem Tech-Stack von Discord beschäftigt, danke!
Wie Discord Milliarden von Nachrichten speichert
Der GC von Go verursacht einen recht hohen Overhead, weshalb laufend weitere Tuning-Methoden ergänzt und unter anderem Memory-Arenas eingeführt werden.
Warum man sich für ScyllaDB als Ersatz für Cassandra entscheiden sollte
Wie Discord die Latenz von Netzwerkfestplatten minimiert hat