Ce serveur PubSub Rust offre des performances exceptionnelles avec une latence end-to-end de ~9.5ms et un débit de plus de 1100 msg/s en réception. L'utilisation mémoire est extrêmement faible (~9 MB RSS) comparé aux serveurs Python typiques.
Le serveur supporte deux modes d'émission Socket.IO:
# Mode parallèle (par défaut) - Recommandé
cargo build --release
# Mode séquentiel (pour compatibilité)
cargo build --release --no-default-features --features sequential-emit- Les émissions vers la room spécifique et la room wildcard (
__all__) s'exécutent concurremment avectokio::join! - Latence end-to-end: 9.56ms (moyenne)
- Amélioration théorique: ~0.25ms vs séquentiel
- Les émissions s'exécutent l'une après l'autre
- Latence end-to-end: 9.81ms (moyenne)
- Compatible avec toutes les versions de socketioxide
Différence mesurée: ~2.5% (dans la marge d'erreur du benchmarking)
Test avec 20 messages sur localhost:
| Métrique | Mode Parallèle | Mode Séquentiel |
|---|---|---|
| HTTP Publish | 5.29ms | 5.45ms |
| Socket.IO Delivery | 5.84ms | 6.05ms |
| Total End-to-End | 9.56ms | 9.81ms |
| Min | 2.12ms | 4.75ms |
| Max | 13.71ms | 14.95ms |
| Median | 9.37ms | 9.16ms |
HTTP Publish (5.3ms):
├─ Parsing JSON: ~0.5ms
├─ Validation: ~0.1ms
├─ DB async send: ~0.1ms (non-bloquant)
├─ Sérialisation: ~0.3ms
└─ Overhead Axum: ~4.3ms
Socket.IO Emit (5.8ms):
├─ Namespace lookup: ~0.1ms
├─ Room emit (topic): ~2.5ms
├─ Room emit (__all__): ~2.5ms (parallèle) ou après (séquentiel)
├─ Network localhost: ~0.5ms
└─ Client parsing: ~0.6ms
Configuration: 5 publishers, 10 subscribers, 100 msg/publisher
| Métrique | Valeur |
|---|---|
| Débit publication | 167 msg/s |
| Débit réception | 335 msg/s |
| Messages livrés | 1000/1000 (100%) |
| Latence moyenne | 34.84ms* |
| Latence médiane | 32.64ms* |
| P95 | 69.80ms* |
| P99 | 86.53ms* |
* Latence plus élevée due à la contention de 10 subscribers concurrents
Configuration: 10 publishers, 50 subscribers, 30 secondes
| Métrique | Valeur |
|---|---|
| Messages envoyés | 3,160 |
| Messages reçus | 45,329 (amplification wildcard) |
| Débit publication | ~100 msg/s |
| Débit réception | ~1,100 msg/s |
| Taux de succès | 100% |
| Erreurs serveur | 0 |
Latence moyenne sur 10 requêtes:
| Endpoint | Latence (avec cache) |
|---|---|
/health |
4.47ms |
/clients |
4.08ms |
/messages |
5.50ms |
/consumptions |
4.39ms |
/graph/state |
2.52ms |
| Ressource | Valeur | Notes |
|---|---|---|
| Mémoire RSS | ~9 MB | Extrêmement faible |
| Mémoire VSZ | 1.15 GB | Mémoire virtuelle |
| CPU (idle) | <1% | Charge normale |
| CPU (stress) | <2% | Avec 50 connexions |
| Métrique | Rust (ce serveur) | Python Flask-SocketIO (typique) |
|---|---|---|
| Latence end-to-end | 9.5ms | 25-80ms |
| Utilisation mémoire | 9 MB | 80-150 MB |
| Débit réception | 1,100 msg/s | 200-400 msg/s |
| CPU (idle) | <1% | 2-5% |
Amélioration: 3-8x plus rapide, 10x moins de mémoire
tokio::join!sur les deux émissions de rooms- Gain: ~2-3% latence (mode théorique)
- Production-ready
- Canal async avec batching automatique
- Les écritures DB ne bloquent pas la réponse HTTP
- Transactions SQLite groupées
- Cache en mémoire pour
/messages,/consumptions,/graph/state - TTL configurable (défaut: probablement 60s)
- RwLock pour accès concurrent
[profile.release]
opt-level = 3 # Optimisations maximales
lto = "fat" # Link-Time Optimization
codegen-units = 1 # Optimisation cross-crate
strip = true # Retirer symboles debug
panic = "abort" # Pas d'unwinding
overflow-checks = false # Pas de vérifications overflow- Impact: ~5-6ms (50-60% de la latence totale)
- Cause: Bibliothèque tierce, protocol overhead
- Optimisation possible: Contributionsau crate, ou remplacement par WebSocket natif (perd compatibilité)
- Impact: ~4-5ms (40-50% de la latence totale)
- Cause: Parsing HTTP, routing, middleware
- État: Déjà très optimisé
- Impact: Négligeable (<0.1ms)
- Cause: Écritures async via canal, batching
- État: Optimisé ✓
Si vous avez besoin de latence sub-5ms:
- Remplacer Socket.IO par WebSocket natif
- Retirer le middleware CORS en production
- Considérer un buffer ring pour les messages (zero-copy)
Si vous avez besoin de très haut débit:
- Augmenter les capacités de canal (
broadcast::channel(10000)) - Utiliser un pool de connexions DB plus large
- Implémenter du sharding par topic
# Compiler avec optimisations maximales
RUSTFLAGS="-C target-cpu=native" cargo build --release
# Variables d'environnement recommandées
export DATABASE_FILE="pubsub.db" # Fichier sur disque (ou :memory:)
export RUST_LOG=info # LoggingTrois scripts sont fournis pour tester les performances:
# Test de performance standard
python3 perf_test.py
# Test de stress (charge élevée)
python3 stress_test.py
# Analyse de latence détaillée
python3 latency_analysis.pyCe serveur Rust PubSub offre des performances exceptionnelles pour un serveur Socket.IO:
- ✓ Latence end-to-end <10ms
- ✓ Débit >1000 msg/s
- ✓ Utilisation mémoire <10 MB
- ✓ 100% compatible avec les clients Python Flask-SocketIO existants
- ✓ Mode parallèle pour réduire la latence
- ✓ Feature flags pour flexibilité
La majorité de la latence (>90%) provient des bibliothèques Socket.IO et HTTP, pas de la logique métier. Le serveur est déjà très optimisé.