26 Punkte von xguru 2023-07-04 | 3 Kommentare | Auf WhatsApp teilen
  • 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

 
pmc7777 2023-07-05

Ich habe mich gerade mit dem Tech-Stack von Discord beschäftigt, danke!

 
secret3056 2023-07-04

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.