In diesem Zeitalter der allgegenwärtigen Konnektivität vergisst man leicht, dass es eigentlich schwierig ist, all dies zu ermöglichen. Betreten Sie Discord, die Sprach-, Video- und Text-Chat-App, und ihre Geschichte der Mühsal, wenn es darum geht, die Billionen von Nachrichten zu speichern und abzurufen, die ihre Benutzer generieren.
Die Einzelheiten der Kämpfe des Unternehmens wurden in forensischen Einzelheiten beschrieben ein Blog von Bo Ingram von Discordein leitender Softwareentwickler für die Plattform.
Auf großen öffentlichen Discord-Servern sind die meisten der angezeigten Nachrichten aktuell und zwischengespeichert, was gut für die Leistung ist. Bei kleineren Servern, die nur von wenigen Freunden verwendet werden, können jedoch häufig alte Nachrichten, die nicht zwischengespeichert sind, bei jeder Anmeldung eines Benutzers angezeigt oder aus der Datenbank gelesen werden.
Laut Zahlen aus dem Jahr 2019 Discord verarbeitete ungefähr 25 Milliarden Nachrichten pro Monat (öffnet in neuem Tab), 850 Millionen jeden Tag und 600.000 pro Minute. Sie können davon ausgehen, dass diese Zahlen jetzt noch größer sein werden.
Discord nutzte zunächst die MongoDB-Datenbank, um diese Aktivität zu unterstützen, wechselte dann aber zu Cassandra. Seine Attraktivität bestand in einer NoSQL-Datenbank, die Clustering unterstützte, was bedeutet, dass Sie mehrere Instanzen einer bestimmten Datenbank als eine arbeiten lassen können, um die Leistung zu verbessern.
Sowohl Apple als auch Netflix, neben anderen großen Technologieunternehmen, verwenden Berichten zufolge beide Cassandra. Es hat also einen angemessenen Blue-Chip-Anspruch. Sicherlich ist es gut genug für Discord? Zunächst ja. Nachdem Discord einige Probleme behoben hatte, schrieben die Cassandra-Datenbanken neue Nachrichten innerhalb einer Millisekunde und lasen alte Nachrichten den Benutzern in fünf Millisekunden vor. Schnell genug für Ihren typischen Text-Chat, das ist sicher.
Aber die guten Zeiten hielten nicht an. Discord hat jetzt etwas in der Größenordnung von 150 Millionen monatlich aktiven Benutzern. Bis Anfang 2022 betrieb Discord 177 Cassandra-Knoten, die Billionen von Nachrichten speicherten.
Das Ergebnis waren Hotspots innerhalb der Datenbank, wenn Benutzer in bestimmten Mustern mit Discord-Servern interagierten. Die Folge ist Latenz, da der Server mit Benutzeranfragen immer weiter zurückfällt – mit anderen Worten, Benutzer, die Textnachrichten senden und lesen.
Die Art und Weise, wie Cassandra Daten zum Löschen markiert, bevor sie schließlich über Garbage-Collection-Routinen entfernt werden, hat die Latenz beim Lesen von Nachrichten ebenfalls dramatisch erhöht. Um es grob mit Laien auszudrücken: Die Grabsteine, die den Speicherort von Daten markierten, die für eine eventuelle Löschung markiert waren, verlangsamten den Prozess, an tatsächliche Live-Daten zum Lesen zu gelangen.
Die Lösung für Discord ist eine weitere extrem schwierige Migration zu einer neuen Datenbank namens ScyllaDB. Es hat mehrere Vorteile, einschließlich der Tatsache, dass es in C++ geschrieben ist, was viel schneller ist als die von Cassandra verwendete Programmiersprache Java. Es ist auch Cassandra-kompatibel und löscht Daten direkt, anstatt einen Garbage Collector zu verwenden.
Wie auch immer, die Umstellung auf ScyllaDB fand im Mai letzten Jahres statt, und zweifellos haben Sie es nicht einmal bemerkt, als es geschah. Was gut ist. Laut Bo sind die Latenzen im Vergleich zum hinteren Ende der Cassandra-Implementierung erheblich verbessert.
„Es war eine ruhige, gut erzogene Datenbank (es ist in Ordnung, das zu sagen, weil ich diese Woche nicht auf Abruf bin). Wir haben keine wochenendenlangen Feuergefechte, noch jonglieren wir Knoten im Cluster, um zu versuchen, sie zu erhalten Es ist eine viel effizientere Datenbank – wir gehen von 177 Cassandra-Knoten auf nur 72 ScyllaDB-Knoten um“, sagt er.
„Unsere Tail-Latenzen haben sich ebenfalls drastisch verbessert. Zum Beispiel hatte das Abrufen historischer Nachrichten eine p99 zwischen 40 und 125 ms auf Cassandra, wobei ScyllaDB eine schöne und kühle p99-Latenz von 15 ms und eine Leistung beim Einfügen von Nachrichten von 5 bis 70 ms p99 auf Cassandra hatte. zu konstanten 5 ms p99 auf ScyllaDB.”
Da haben Sie es also, die etwas kompliziertere Geschichte, wie Sie verhindern können, dass ein Nachrichtendienst unter dem Gewicht von Millionen von Benutzern zusammenbricht. Das alles können Sie in nachlesen viel mehr Details auf der Offizieller Discord-Blog (öffnet in neuem Tab).