Introduction
Lors de tests de performances sur un pipeline de messages, j'ai constaté que le débit était limité à environ 400 000 messages par seconde en raison de la génération d'identifiants uniques. Après analyse, j'ai identifié le problème : la fonction uuid::Uuid::now_v7() était trop lente.
Contexte Technique
Le UUID v7 est un standard récent qui intègre une horodatage Unix à la précision du milliseconde dans les 48 premiers bits. Cela permet une ordonnancement naturel des identifiants, ce qui est utile pour les clés primaires de bases de données, les identifiants de messages, la corrélation de journaux, etc. La génération de ces identifiants nécessite de la randomité, mais la bibliothèque uuid utilise par défaut un générateur de nombres aléatoires cryptographiquement sécurisé (OsRng), ce qui ralentit considérablement la génération d'identifiants.
Analyse et Implications
La génération d'identifiants uniques à l'aide de uuid::Uuid::now_v7() prend environ 1,4 microseconde par appel sur macOS, ce qui peut sembler peu, mais qui devient significatif à grande échelle. Pour résoudre ce problème, j'ai créé une bibliothèque Rust appelée fast-uuid-v7 qui génère des identifiants UUID v7 compatibles de manière plus rapide sans violer les spécifications.
Perspective
La bibliothèque fast-uuid-v7 utilise une approche différente pour générer les identifiants, en utilisant un générateur de nombres aléatoires non cryptographique (SmallRng) et en minimisant les appels au système. Les résultats montrent que cette bibliothèque est jusqu'à 165 fois plus rapide que la bibliothèque uuid par défaut et toujours 8 à 10 fois plus rapide que uuid avec l'option fast-rng. Il est important de noter que cette bibliothèque n'est pas cryptographiquement sécurisée et ne doit pas être utilisée pour les applications sensibles à la sécurité.