Introduction
Nous avons remplacé Node.js par Bun dans l'un de nos services les plus sensibles à la latence et avons obtenu une augmentation de débit de 5 fois. Nous avons également découvert une fuite de mémoire qui n'existe que dans le modèle HTTP de Bun.
Contexte Technique
Le service, appelé Firestarter, est un courtier de connexions de démarrage chaud qui détient des milliers de connexions HTTP longues et persistantes provenant de contrôleurs inactifs, chacune attendant du travail. Lorsqu'une tâche arrive, Firestarter met en correspondance la tâche avec un contrôleur en attente et envoie la charge utile via la connexion maintenue.
Le problème était que Firestarter utilisait trop de CPU. Il fonctionnait sur Node.js, passant 31% de son temps dans une requête SQLite, analysant chaque demande avec Zod et convertissant les en-têtes avec Object.fromEntries() à chaque requête GET.
Analyse et Implications
Nous avons remplacé SQLite par une carte composite à clé Map<string, Set<string>>. La clé est une chaîne de caractères délimitée par des nulls de déploiement + version + cpu + mémoire. La mise en correspondance est devenue O(1) au lieu d'une requête SQL.
Les résultats ont montré une augmentation de débit de 2,2 fois et une latence médiane de 2,2 fois meilleure. Nous avons également pu abandonner le drapeau expérimental --experimental-sqlite de Node.js.
Ensuite, nous sommes passés à Bun, ce qui a donné une autre augmentation de débit de 2 fois. Nous avons également optimisé le chemin chaud en profilant et en supprimant les fonctions chaudes, ce qui a réduit l'utilisation de la CPU de 40%.
Perspective
Il est important de noter que Bun présente certaines surprises, comme la fuite de mémoire dans son modèle HTTP. Cependant, les avantages de l'utilisation de Bun, tels qu'une augmentation de débit et une réduction de l'utilisation de la CPU, sont considérables.
Il est également important de surveiller les limites de Bun, comme la prise en charge des certificats CA, et de suivre les prochaines étapes de développement de Bun pour améliorer ses performances et sa fiabilité.