Aller au contenu principal
Blog
Technique8 min de lecture

Pourquoi nous avons construit Orkestr8 en Rust

La performance et la fiabilité étaient non-négociables. Découvrez comment Rust nous a permis d'atteindre des latences sub-milliseconde pour notre moteur d'orchestration.

Équipe Orkestr8

Engineering

Le problème : orchestrer des agents IA en temps réel

Quand nous avons commencé à concevoir le moteur d'orchestration d'Orkestr8, un constat s'est imposé : chaque milliseconde compte. Un agent IA qui attend une réponse du routeur pendant 200ms, c'est 200ms de latence ajoutée à chaque interaction utilisateur. Multipliez ça par 50 requêtes par session, et vous obtenez un produit qui semble lent — même si les LLM eux-mêmes répondent en moins d'une seconde.

Nous avions besoin d'un runtime capable de gérer des milliers de connexions simultanées, de router les requêtes vers le bon modèle LLM en quelques microsecondes, et de maintenir un état cohérent pour chaque session d'agent — le tout sans compromis sur la fiabilité.

Pourquoi pas Node.js ou Go ?

Node.js était le candidat évident : écosystème riche, facilité de recrutement, bonne gestion de l'I/O asynchrone. Mais le garbage collector est imprévisible. Dans nos benchmarks, des pauses GC de 10 à 50ms survenaient régulièrement sous charge — inacceptable pour un routeur temps réel qui doit maintenir des latences p99 sous la milliseconde.

Go offrait de meilleures garanties de performance avec ses goroutines. Mais la gestion mémoire restait non déterministe, et l'absence de types algébriques rendait la modélisation de nos états d'agent plus fragile. Chaque état invalide était un bug potentiel en production.

Rust nous a offert exactement ce qu'il nous fallait : performances prévisibles sans GC, un système de types qui rend les états invalides irreprésentables, et un écosystème async mature avec Tokio.

Le point de départ : Zeroclaw

Orkestr8 n'est pas parti de zéro. Nous avons pris comme base Zeroclaw, un framework d'orchestration multi-agents open source écrit en Rust. Zeroclaw nous a apporté les fondations solides dont nous avions besoin : un runtime asynchrone performant, une architecture modulaire basée sur des traits Rust, et une philosophie de sécurité intégrée dès la conception.

À partir de cette base, nous avons construit les couches spécifiques à Orkestr8 : le routeur LLM intelligent avec circuit breaker, le système d'approbation humaine, le context engine avec mémoire vectorielle, et l'API Gateway qui expose le tout. Zeroclaw nous a permis de gagner des mois de développement sur les fondations — et de concentrer notre énergie sur ce qui fait la différence produit.

L'architecture du moteur d'orchestration

Le cœur d'Orkestr8, construit sur les fondations de Zeroclaw, est un event loop asynchrone propulsé par Tokio. Chaque requête entrante est traitée dans un task léger (green thread) sans allocation dynamique sur le chemin critique. Le routeur LLM utilise une table de décision compilée à l'avance, basée sur des embeddings pré-calculés des descriptions de tâches.

Le circuit breaker qui protège contre les pannes de providers LLM est implémenté comme une machine à états finis typée. Grâce au système d'enums de Rust, chaque transition d'état est vérifiée à la compilation. Il est littéralement impossible de passer d'un état « ouvert » à « fermé » sans passer par « semi-ouvert » — le compilateur refuse.

Pour le stockage des sessions d'agents, nous utilisons un cache LRU lock-free basé sur des atomic operations. Les lectures sont wait-free (jamais bloquées), et les écritures utilisent un mécanisme de compare-and-swap qui garantit la cohérence sans mutex global.

Les résultats en production

Après la mise en production, les chiffres parlent d'eux-mêmes. La latence médiane du routeur LLM est de 0.3ms. La latence p99 est de 0.8ms — même sous une charge de 10 000 requêtes par seconde. L'empreinte mémoire du moteur est de 45 MB pour gérer 5 000 sessions d'agents simultanées.

Comparé à notre prototype initial en Node.js, nous avons divisé la latence par 40 et l'utilisation mémoire par 8. Mais le gain le plus significatif est la fiabilité : zéro crash en production depuis le lancement, grâce aux garanties du compilateur Rust.

Le coût de cette approche ? Une courbe d'apprentissage plus raide pour l'équipe, et des temps de compilation plus longs. Mais pour un composant aussi critique que le moteur d'orchestration, le compromis était évident.

Ce que Rust ne résout pas

Rust n'est pas la solution à tous les problèmes. Notre dashboard web est en Next.js, notre CLI en TypeScript, et nos workers de traitement de documents en Python. Chaque outil a sa place.

La vraie leçon de notre expérience est que le choix du langage doit être guidé par les contraintes du problème, pas par la hype. Pour un moteur d'orchestration temps réel qui gère des milliers de connexions — Rust était le bon choix. Pour une interface utilisateur réactive — React reste imbattable.

Prêt à essayer Orkestr8 ?

Démarrez gratuitement avec le plan Community. Aucune carte bancaire requise.

Démarrer gratuitement