Ce projet implémente un système de calculatrice distribuée à l'aide de RabbitMQ comme message broker. Le système peut effectuer des opérations mathématiques (addition, soustraction, multiplication et division) de manière asynchrone et distribuer la charge entre plusieurs workers.
Essayez la calculatrice distribuée ici : https://calculator.louisrvl.fr/
Le projet est organisé selon une architecture orientée messages avec les composants suivants:
- Workers : Services qui écoutent les files de messages pour effectuer des opérations mathématiques spécifiques
- Producer : Service qui génère des opérations aléatoires pour les workers
- Client interactif : Interface de ligne de commande pour soumettre des calculs
- Serveur web : API REST et interface utilisateur web pour soumettre des calculs
- RabbitMQ : Broker de messages qui gère la communication entre les composants
- Un client (producer, interactive, ou web) envoie une opération à calculer
- Le message est publié sur un exchange avec une routing key basée sur l'opération
- Les workers abonnés à cette opération traitent le message
- Le résultat est renvoyé à une file de résultats ou à une file spécifique au client
- Docker et Docker Compose
- Node.js (>=20) pour le développement local
- npm pour le développement local
-
Cloner le dépôt
-
Créer un fichier
.envà la racine du projet avec les variables suivantes : (Un .env d'example est fourni afin de lancer rapidement le projet)
WEBSERVER_PORT=8025
RABBITMQ_USER=user
RABBITMQ_PASS=password
AMQP_URL=amqp://${RABBITMQ_USER}:${RABBITMQ_PASS}@rabbitmq:5672
AMQP_URL_LOCAL=amqp://user:password@localhost:5672
- Démarrer l'application complète avec Docker Compose :
docker compose up -dCette commande va:
- Démarrer un conteneur RabbitMQ avec l'interface d'administration
- Construire et démarrer le serveur web sur le port 8025
- Construire et démarrer une flotte de workers
- Accéder à l'application:
- Interface Web: http://localhost:8025
- Interface d'administration RabbitMQ: http://localhost:15672 (utilisateur et mot de passe définis dans .env)
- Démarrer RabbitMQ avec Docker :
docker compose up -d rabbitmq- Installer les dépendances Node.js :
npm installnpm run start
- Workers : Services qui écoutent les files de messages pour effectuer des opérations mathématiques > spécifiques
- Producer : Service qui génère des opérations aléatoires pour les workers
- Client Résultat : Interface de ligne de commande pour soumettre des calculs
npm run start:workersnpm run start:resultsnpm run start:producernpm run start:webserverPuis accédez à http://localhost:8025 dans votre navigateur.
npm run start:interactivePuis entrez des opérations comme 10 + 5, 20 * 3, etc.
- Le système utilise des échanges directs dans RabbitMQ
- Les opérations sont distribuées aux workers basés sur la routing key
- Les messages sont persistants pour garantir leur traitement
- Les workers simulent un temps de traitement aléatoire (5-15 secondes)
- Les résultats sont renvoyés de manière asynchrone via des files de réponse dédiées
Le projet est conteneurisé avec Docker pour faciliter le déploiement:
-
Dockerfile.webserver: Image pour le serveur web- Basée sur Node.js 22 Alpine
- Expose le port 8025
- Démarre le serveur web (server.js)
-
Dockerfile.workers: Image pour les workers- Basée sur Node.js 22 Alpine
- Démarre une flotte de workers (start_workers.js)
-
rabbitmq: Broker de messages
- Ports: 5672 (AMQP), 15672 (Interface d'administration)
- Utilisateur/mot de passe configurables via variables d'environnement
-
webserver: Interface utilisateur et API REST
- Construit à partir de Dockerfile.webserver
- Port exposé: 8025
- Dépend du service rabbitmq
- Redémarrage automatique en cas de problème
-
workers: Flotte de workers pour traiter les calculs
- Construit à partir de Dockerfile.workers
- Dépend du service rabbitmq
- Redémarrage automatique en cas de problème
.
├── docker-compose.yml # Configuration Docker Compose
├── Dockerfile.webserver # Image Docker pour le serveur web
├── Dockerfile.workers # Image Docker pour les workers
├── package.json # Configuration du projet Node.js
├── public/ # Fichiers statiques pour l'interface web
└── src/
├── interactive.js # Client interactif en ligne de commande
├── producer.js # Générateur d'opérations aléatoires
├── result_client.js # Client pour recevoir les résultats
├── server.js # Serveur web avec API REST
├── start_all.js # Script pour démarrer tous les composants
├── start_workers.js # Script pour démarrer une flotte de workers
├── utils/ # Utilitaires partagés
│ ├── amqpUtils.js # Fonctions utilitaires pour RabbitMQ
│ ├── logger.js # Utilitaires de journalisation
│ └── runScript.js # Utilitaire pour exécuter des scripts
└── worker.js # Implémentation du worker
Pour arrêter RabbitMQ et les conteneurs Docker:
docker compose downPour supprimer également les volumes:
docker compose down -vRepo créé pour le cours de RabbitMQ & KAFKA à EFREI Paris
- Louis Réville
- Sébastien Branly
- Guillaume Maugin


