En esta era de conectividad completamente ubicua, es fácil olvidar que habilitarlo todo es, en realidad, difícil. Ingrese a Discord, la aplicación de chat de voz, video y texto, y su historia de esfuerzo cuando se trata de almacenar y recuperar los billones de mensajes que generan sus usuarios.
Los detalles de las luchas de la empresa se han descrito en detalle forense en un blog de Bo Ingram de Discord, un ingeniero de software sénior de la plataforma.
En los grandes servidores públicos de Discord, la mayoría de los mensajes que se muestran son recientes y están almacenados en caché, lo que es bueno para el rendimiento. Pero los servidores más pequeños utilizados por unos pocos amigos a menudo pueden incluir mensajes antiguos que no están almacenados en caché que se muestran o leen de la base de datos cada vez que un usuario inicia sesión.
Según cifras de 2019, Discord manejó algo así como 25 mil millones de mensajes por mes. (se abre en una pestaña nueva), 850 millones cada día, y 600.000 por minuto. Puede esperar que esos números sean aún mayores ahora.
Discord comenzó usando la base de datos MongoDB para respaldar esta actividad, pero luego se trasladó a Cassandra. Su atractivo era como una base de datos NoSQL que admitía la agrupación en clústeres, lo que significa que puede tener varias instancias de una base de datos determinada trabajando como una sola para mejorar el rendimiento.
Tanto Apple como Netflix, entre otras grandes empresas tecnológicas, supuestamente usan Cassandra. Por lo tanto, tiene la credibilidad de primera clase adecuada. ¿Seguramente es lo suficientemente bueno para Discord? Inicialmente, sí. Una vez que Discord solucionó algunos problemas, las bases de datos de Cassandra escribieron nuevos mensajes en un milisegundo y leyeron los mensajes antiguos a los usuarios en cinco milisegundos. Lo suficientemente rápido para su típico chat de texto, eso es seguro.
Pero los buenos tiempos no duraron. Discord ahora tiene algo en la región de 150 millones de usuarios activos mensuales. A principios de 2022, Discord estaba ejecutando 177 nodos Cassandra que almacenaban billones de mensajes.
El resultado fueron puntos de acceso dentro de la base de datos cuando los usuarios interactuaron con los servidores de Discord en ciertos patrones. El resultado es la latencia, ya que el servidor se atrasa cada vez más con las consultas de los usuarios; en otras palabras, los usuarios envían y leen mensajes de texto.
La forma en que Cassandra marca los datos para su eliminación antes de eliminarlos finalmente a través de las rutinas de recolección de basura también aumentó drásticamente la latencia al leer los mensajes. En términos sencillos, las lápidas que marcaban la ubicación de los datos marcados para su eliminación eventual ralentizaban el proceso de obtención de datos reales en vivo para su lectura.
La solución para Discord es otra migración extremadamente difícil a una nueva base de datos, conocida como ScyllaDB. Tiene varias ventajas, incluida la de estar escrito en C++, que es mucho más rápido que el lenguaje de codificación Java utilizado por Cassandra. También es compatible con Cassandra y también elimina los datos directamente en lugar de usar un recolector de basura.
De todos modos, el cambio a ScyllaDB ocurrió en mayo del año pasado, y sin duda ni siquiera se dio cuenta cuando sucedió. Lo que es algo bueno. Según Bo, las latencias han mejorado mucho en comparación con el final de la implementación de Cassandra.
«Ha sido una base de datos tranquila y de buen comportamiento (está bien decir esto porque no estoy de guardia esta semana). Es una base de datos mucho más eficiente: pasamos de ejecutar 177 nodos de Cassandra a solo 72 nodos de ScyllaDB», dice.
«Nuestras latencias de cola también han mejorado drásticamente. Por ejemplo, la recuperación de mensajes históricos tuvo una p99 de entre 40 y 125 ms en Cassandra, ScyllaDB tuvo una latencia agradable y relajada de 15 ms p99 y el rendimiento de inserción de mensajes pasó de 5 a 70 ms p99 en Cassandra, a una constante p99 de 5 ms en ScyllaDB».
Entonces, ahí lo tiene, la historia un poco más complicada de lo que podría haber pensado de cómo evitar que un servicio de mensajes se derrumbe bajo el peso de millones de usuarios. Puedes leer sobre todo esto en mucho más detalles en el blog oficial de Discord (se abre en una pestaña nueva).