- A medida que Discord creció, fue reemplazando continuamente la base de datos de almacenamiento de mensajes
- Al principio usaba un solo MongoDB. En noviembre de 2015, cuando la cantidad de mensajes llegó a 100 millones, quedaron en evidencia los límites de MongoDB
- En 2017 migró a Cassandra con un clúster de 12 nodos para almacenar decenas de miles de millones de mensajes
- En 2022, los mensajes se dispararon a billones, la infraestructura creció enormemente hasta 177 nodos, la latencia se volvió impredecible y los costos de mantenimiento se hicieron extremadamente altos
- En Cassandra, el problema de Discord eran las hot partitions. Ciertas partes de la DB se sobrecargaban, lo que degradaba el rendimiento de toda la aplicación
- Como la estructura interna de datos de Cassandra usa árboles LSM, el costo de lectura es mayor que el de escritura, y las lecturas concurrentes de varios usuarios en un solo servidor crean hotspots y provocan degradación del rendimiento
- Tareas de mantenimiento como la compactación de SSTables afectaban el rendimiento general y agravaban el problema
- Por eso iniciaron un rediseño de la arquitectura integrando varios componentes
- Aprovecharon una API monolítica, un servicio de datos implementado en Rust y un sistema de almacenamiento basado en ScyllaDB (una DB compatible con Cassandra desarrollada en C++)
- Con la adopción de ScyllaDB se lograron mejoras significativas
- La p99 read latency se redujo a 15ms, frente a los 40~125ms de Cassandra
- La p99 write latency se redujo a 5ms, frente a los 5~70ms de Cassandra
- Los ingenieros de Discord escribieron el servicio de datos en Rust
- Usaron la característica de fearless concurrency de Rust para controlar el tráfico concurrente sobre hot partitions
- Las librerías y capacidades de concurrencia de Rust se ajustaban muy bien a los requisitos de Discord
- El servicio de datos actúa como intermediario entre el monolito de la API y el clúster de base de datos
3 comentarios
Justo estaba investigando el stack tecnológico de Discord, ¡gracias!
Cómo Discord almacena miles de millones de mensajes
El GC de Go implica una sobrecarga bastante grande, por lo que se siguen agregando métodos de ajuste y se están introduciendo aspectos como las arenas de memoria.
Por qué elegir ScyllaDB como sustituto de Cassandra
Cómo Discord minimizó la latencia de los discos de red