Comment Discord a réduit de 40 % le trafic WebSocket
(discord.com)- Lorsqu’un client se connecte à Discord, il reçoit des mises à jour en temps réel sur ce qui se passe via un service appelé « passerelle »
- Depuis fin 2017, les connexions des clients à la passerelle sont compressées avec
zlib, ce qui a réduit la taille des messages d’un facteur de 2 à 10 - Zstandard (
zstd) offre un meilleur taux de compression quezlib, des temps de compression plus courts et prend en charge les dictionnaires, ce qui peut encore réduire la bande passante - Les résultats des tests
zstden 2019 n’étaient pas très positifs, mais l’équipe a estimé que cela valait la peine de réessayer
Streaming avec zstd
zlibutilisait la compression en streaming, tandis quezstdne l’utilisait pas- Sur les petites charges utiles,
zstdétait moins performant quezlib - L’équipe a forké
ezstd, le bindingzstdpour Elixir, afin d’y ajouter le streaming - Le passage au streaming
zstda apporté de nettes améliorations, tant en taux de compression qu’en vitesse, par rapport au streamingzlib
Efforts d’optimisation
Réglages
- Ajustement des paramètres de compression
zstdcommechainlog,hashlogetwindowlogafin d’équilibrer l’utilisation mémoire et le temps de compression
Dictionnaires zstd
- L’équipe a essayé d’améliorer le taux de compression en exploitant la fonctionnalité de dictionnaire de
zstd, mais l’effet est resté limité - La complexité liée à l’usage des dictionnaires a été jugée supérieure aux bénéfices, et leur adoption a donc été abandonnée
Mise à niveau des buffers
- Mise en place d’une boucle de rétroaction pour augmenter les buffers
zstden utilisant la mémoire excédentaire pendant les heures creuses - Le taux de mise à niveau a été plus faible que prévu, et malgré des tentatives d’amélioration, notamment via des ajustements des paramètres de l’allocateur BEAM, les bénéfices n’ont pas justifié la complexité, donc l’idée a été retirée
Implémentation et déploiement
- Les gains de bande passante apportés par
zstdétant importants, l’équipe a décidé de l’appliquer non seulement au mobile, mais aussi au desktop - Des bindings
zstdadaptés à chaque plateforme, comme Java, Objective-C et Rust, ont été trouvés, puis déployés progressivement sur plusieurs mois
Résultat supplémentaire : Passive Sessions V2
- Au cours de l’adoption de
zstd, l’équipe a découvert que les messagespassive_update_v1représentaient plus de 30 % de la bande passante de la passerelle - L’introduction de
passive_update_v2, qui n’envoie que les canaux et membres modifiés, a fait passer cette part de bande passante de 35 % à 5 %
Importantes économies
- La combinaison de Passive Sessions v2 et de
zstda réduit de près de 40 % la bande passante de passerelle utilisée par les clients - La découverte d’une opportunité d’optimisation inattendue montre l’importance d’une instrumentation adaptée et d’une analyse critique des graphiques
1 commentaires
Avis sur Hacker News
Certains se plaignent que Discord mette 20 à 30 secondes à se lancer
L’article semble s’être concentré sur le taux de compression et la réduction de la bande passante réseau
L’approche de compression fondée sur des dictionnaires avec JSON et Erlang ETF est jugée intéressante
Il est surprenant qu’une réponse de bootstrap classique (
READY) dépasse 2 MoDes commentaires portent sur le contenu réel du dispatch
PASSIVE_UPDATE_V1Il n’y a aucune mention de la résistance à des attaques comme les attaques par oracle de compression (BREACH)
Ouvrir un onglet Discord ralentirait l’ordinateur
Beaucoup apprécient que l’article explique aussi ce qui a été tenté sans fonctionner
Selon un avis, mIRC faisait mieux