Skip to content
On this page

Étude comparative — Architecture du serveur réseau

1. Objectif

L’objectif est d’évaluer la pertinence des choix effectués, ainsi que les pistes d’évolution possibles.


2. Architecture actuelle — Synthèse

ComposantDescriptionTechnologie utilisée
ServerHubPoint d’entrée TCP, gère les connexions asynchrones et relaie les paquets.boost::asio
RoomManager / Room / ServerRoomGestion multi-room, logique de jeu, synchronisation périodique.Threads, mutex, logique interne
PacketsManager / PacketsFactorySérialisation et parsing dynamique des paquets.C++17, polymorphisme
Threadingstd::thread pour exécuter io_context::run() + threads optionnels par room.Standard C++
I/O réseauAsynchrone, basé sur callbacks.boost::asio
Logsstd::cout (rudimentaire).C++ standard
Sécurité / validationBasique (non détaillée).Non précisé

3. Comparatif des choix techniques

3.1 Réseau : boost::asio vs alternatives

Critèreboost::asio (actuel)Alternatives (asio standalone / ENet / gRPC / WebSocket)Analyse
PerformanceExcellente, bas niveau C++ENet : optimisé UDP, gRPC : overhead élevéTrès bon choix pour un jeu temps réel TCP/UDP
ComplexitéMoyenne à élevée (callbacks, gestion manuelle)gRPC plus simple mais moins flexiblePeut être simplifiée avec coroutines (co_await)
PortabilitéTrès bonneTrès bonne aussi pour ENet/gRPCConforme aux standards C++
UDP supportDisponible (optionnel)ENet spécialisé UDP fiabilisé➕ Possibilité d’étendre le serveur sur UDP pour le gameplay

Conclusion : boost::asio est adapté, mais une migration vers asio standalone + std::coroutine pourrait réduire la complexité du code réseau.


3.2 Gestion des rooms : modèle interne vs systèmes distribués

CritèreRooms internes (actuel)Approches distribuées (ex: Node-based, microservices)Analyse
SimplicitéTrès bonne pour un serveur uniqueComplexe (inter-serveur)Adaptée aux jeux locaux / petits serveurs
ScalabilitéLimitée au thread / process uniqueHorizontale (multi-instances)Peut saturer au-delà de 100–200 joueurs
SynchronisationPartagée via mutex / threadsMessage passing entre instancesRisque de contention / lock
MaintenanceFacilePlus difficile (monitoring, orchestration)Bon équilibre pour MVP ou prototypage

Conclusion : Le modèle centralisé à RoomManager est idéal pour un prototype ou un jeu local, mais devra évoluer vers une architecture distribuée (rooms isolées en processus ou microservices) pour le scaling.


3.3 Paquets et sérialisation : système maison vs protocoles standardisés

CritèrePacketsManager / IPacket (actuel)Protocol Buffers / FlatBuffers / JSONAnalyse
PerformanceTrès élevée (binaire natif)Protobuf/FlatBuffers aussi performantsExcellent choix pour temps réel
ÉvolutivitéMoyenne : ajout manuel des typesProtobuf gère versioning et génération automatiquePeut devenir complexe à maintenir
InteropérabilitéLimité au code C++Protobuf/JSON → multiplateformeDifficulté si clients multiplateformes
Simplicité de debugFaible (données binaires)JSON / Protobuf plus lisiblesNécessite outils de debug spécifiques

Conclusion : Le système de paquets custom est performant, mais l’utilisation d’un format généré (ex. Protobuf) pourrait simplifier l’interopérabilité client (Unity, C#, etc.).


3.4 Concurrence : threads manuels vs thread pool / async coroutines

CritèreThreads manuels (actuel)Thread pool / coroutinesAnalyse
PerformanceBonne sur peu de threadsMeilleure à grande échelleRisque de surcoût de création
ComplexitéMoyenne (mutex, lock_guard)Réduite avec async / futuresCode sensible aux race conditions
DebuggabilitéMoyennePlus lisible avec co_await➕ Migration envisageable

Conclusion : L’utilisation de std::thread est simple mais peu flexible. Un pool de threads fixe ou les coroutines C++20 réduiraient la charge de synchronisation et simplifieraient la maintenance.


3.5 Journalisation (logging)

Critèrestd::cout (actuel)spdlog / boost::log / loguruAnalyse
PerformanceCorrecteExcellente (multi-thread, async)std::cout bloque les threads
LisibilitéSimpleColoration, timestamp, niveauAmélioration notable
MaintenanceDifficileCentralisé, configurableRecommandé pour la prod

Conclusion : Remplacer les sorties console par un logger structuré (spdlog) apporterait de la clarté et de la performance en environnement multi-thread.


4. Évaluation globale

DomaineChoix actuelPertinenceÉvolutions recommandées
Réseauboost::asio TCP asynchroneSolideSupport UDP + coroutines
RoomsCentralisées en mémoireSimpleDistribuer ou isoler les rooms
SérialisationCustom binairePerformantAjouter Protobuf pour compatibilité
Threadsstd::thread + mutexBasiqueThread pool / async futures
Logsstd::coutMinimalIntégrer spdlog
Sécurité / validationNon spécifiéAjouter validation des paquets et anti-spam
ScalabilitéMoyenneSuperviser via orchestration Docker / microservices

5. Recommandations générales

  1. Moderniser la couche réseau → Utiliser asio avec coroutines (co_spawn, awaitable) pour un code plus lisible.
  2. Isoler la logique de room → Chaque room dans son propre thread ou process (communication par messages).
  3. Introduire un protocole standard (Protobuf) → Facilite la compatibilité client C++/C#/Web.
  4. Centraliser la journalisationspdlog ou boost::log avec rotation de fichiers.
  5. Renforcer la sécurité réseau → Validation des paquets, timeouts, détection de flood.
  6. Préparer la scalabilité → Superviser le serveur via conteneurs Docker + orchestrateur (Kubernetes, ECS).

6. Conclusion

L’architecture actuelle constitue une base robuste et performante pour un serveur de jeu ou d’application temps réel de taille moyenne. Elle repose sur des standards C++ solides (Boost.Asio, threads, polymorphisme) mais gagnerait à évoluer vers une approche plus modulaire, moderne et maintenable, notamment via :

  • des coroutines pour la simplification du flux asynchrone,
  • des formats de paquets standardisés (Protobuf),
  • et une infrastructure scalable basée sur des rooms isolées et supervisées.