- Cuando el cliente se conecta a Discord, recibe actualizaciones en tiempo real sobre lo que está ocurriendo a través de un servicio llamado "Gateway"
- Desde finales de 2017, las conexiones del cliente al Gateway se comprimían usando zlib, lo que redujo el tamaño de los mensajes entre 2 y 10 veces
- Zstandard (zstd) ofrece una mayor tasa de compresión que zlib, tiempos de compresión más cortos y soporte para diccionarios, lo que puede reducir aún más el ancho de banda
- Aunque los resultados de las pruebas con zstd en 2019 no fueron muy positivos, concluyeron que valía la pena intentarlo de nuevo
Streaming con zstd
- Mientras que zlib usaba compresión en streaming, zstd no la usaba
- En cargas útiles pequeñas, zstd rendía peor que zlib
- Hicieron un fork de
ezstd, el binding de zstd para Elixir, y le añadieron streaming
- Tras cambiar a zstd con streaming, lograron mejoras importantes frente a zlib streaming tanto en compresión como en velocidad
Esfuerzos de optimización
Ajuste fino
- Ajustaron parámetros de compresión de zstd como chainlog, hashlog y windowlog para equilibrar el uso de memoria y el tiempo de compresión
Diccionarios de zstd
- Intentaron aprovechar la función de diccionario de zstd para mejorar la tasa de compresión, pero el efecto fue limitado
- Consideraron que la complejidad de usar diccionarios era mayor que sus beneficios y decidieron no adoptarlos
Mejora de buffers
- Implementaron un ciclo de retroalimentación para ampliar los buffers de zstd usando la memoria sobrante en horas de baja actividad
- La tasa de mejora fue menor de lo esperado y, aunque intentaron optimizarla ajustando configuraciones del asignador de BEAM, retiraron la idea porque el beneficio no justificaba la complejidad
Implementación y despliegue
- Como la mejora de ancho de banda con zstd era grande, decidieron aplicarla no solo en móvil sino también en escritorio
- Encontraron bindings de zstd adecuados para cada plataforma, como Java, Objective-C y Rust, y lo desplegaron gradualmente durante varios meses
Logro adicional: Passive Sessions V2
- Durante la adopción de zstd descubrieron que los mensajes
passive_update_v1 representaban más del 30% del ancho de banda del Gateway
- Introdujeron
passive_update_v2, que envía solo los canales y miembros modificados, y redujeron ese uso de ancho de banda del 35% al 5%
Grandes ahorros
- La combinación de Passive Sessions v2 y zstd redujo casi un 40% el ancho de banda del Gateway usado por los clientes
- Haber encontrado una oportunidad de optimización no prevista demuestra la importancia de contar con la instrumentación adecuada y analizar las gráficas con una mirada crítica
1 comentarios
Comentarios de Hacker News
Hay quejas sobre que Discord tarda entre 20 y 30 segundos en iniciar
Parece que se enfocaron en la tasa de compresión y en reducir el ancho de banda de red
Resulta interesante el enfoque de compresión basado en diccionarios usando JSON y Erlang ETF
Sorprende que la respuesta de bootstrap habitual (
READY) supere los 2 MBSe menciona el contenido real del dispatch
PASSIVE_UPDATE_V1No se menciona si es seguro frente a ataques como los de oráculo de compresión (BREACH)
Hay un problema en el que la computadora se pone lenta al abrir una pestaña de Discord
Se valora mucho que explicaran las cosas que intentaron pero no funcionaron
Opinión de que mIRC lo hacía mejor