Ce projet implémente un système de messagerie asynchrone utilisant RabbitMQ pour gérer la communication entre les producteurs et les consommateurs. Il est conçu pour illustrer les concepts de routage de messages, de gestion de files d'attente et de sécurité dans un système distribué.
Le projet est monitoré au niveau backend pour avoir une vision globale de l'utilisation des performances et du nombre de connexion actives, une petite fenêtre résumant ces données s'affiche toutes les 10 secondes dans les logs du serveur.
L'architecture du système se compose des éléments suivants :
-
RabbitMQ :
- Le broker de messages qui gère la transmission et le routage des messages entre les producteurs et les consommateurs.
- Exposé sur les ports
15672
pour l'interface de gestion et5672
pour la messagerie.
-
Backend :
- Un serveur Node.js qui agit comme producteur et consommateur de messages.
- Utilise WebSocket pour la communication temps réel entre les clients et le serveur.
- Gère l'authentification des utilisateurs et le routage des messages vers les canaux appropriés via RabbitMQ.
-
Frontend :
- Une application React qui sert d'interface utilisateur.
- Permet aux utilisateurs de se connecter en tant qu'admin ou invité.
- Affiche les messages reçus, permet d'envoyer des messages et de créer de nouveaux canaux (pour les administrateurs).
Le flux de messages dans le système se déroule comme suit :
-
Connexion de l'Utilisateur :
- L'utilisateur se connecte via le frontend en choisissant un rôle (admin ou invité).
- Le frontend utilise WebSocket pour établir une connexion avec le backend.
-
Authentification et Configuration Initiale :
- Si l'utilisateur est un admin, il est authentifié par le backend.
- Le backend génère un
userId
unique pour chaque utilisateur et l'envoie au frontend.
-
Communication via RabbitMQ :
- Lorsqu'un utilisateur envoie un message via le frontend, celui-ci est transmis au backend par WebSocket.
- Le backend route ensuite le message vers RabbitMQ, où il est publié dans un échange de type
fanout
. - Les messages sont ensuite consommés par le backend et envoyés aux utilisateurs connectés appropriés.
-
Gestion des Canaux et Utilisateurs :
- Les administrateurs peuvent créer de nouveaux canaux, et tous les utilisateurs sont notifiés en temps réel.
- Les utilisateurs peuvent rejoindre ou quitter des canaux et les messages sont filtrés en fonction du canal actif.
Docker et Docker compose sont nécéssaire au bon fonctionnement de ce chat
docker-compose build
docker-compose up
les deux commandes doivent être lancée depuis le root du projet (où est présent le docker-compose)
-
Se connecter en tant qu'admin :
- usr: admin
- pwd: root
- Création de channel possible
- Accès aux chats généré après s'être connecté
-
Se connecter en tant que guest
- Accès au chat général + ceux ouvert par les admins (APRES s'être connecté)
- Gestion d'envoi d'image
Un administrateur se connecte au système, crée un nouveau canal, et tous les utilisateurs connectés reçoivent une notification du nouveau canal.
- L'administrateur ouvre le navigateur et accède à l'application à http://localhost:3000.
- Il clique sur le bouton Admin et entre les informations de connexion :
- Nom d'utilisateur :
admin
- Mot de passe :
root
- Nom d'utilisateur :
- Après une authentification réussie, l'interface de chat s'ouvre.
- L'administrateur saisit le nom d'un nouveau canal, par exemple "Développement", dans le champ "Nom du nouveau channel".
- L'administrateur clique sur Ajouter Channel.
- Le nouveau canal "Développement" apparaît dans la liste des canaux pour tous les utilisateurs connectés.
- Les utilisateurs déjà connectés peuvent maintenant rejoindre et discuter dans le nouveau canal créé par l'administrateur.
Un utilisateur invité envoie un message dans un canal spécifique, et le message est reçu par tous les utilisateurs connectés au même canal.
- L'utilisateur invité ouvre le navigateur et accède à l'application à http://localhost:3000.
- Il clique sur le bouton Invité et choisit un pseudonyme, par exemple "Jean".
- L'utilisateur entre dans le chat et rejoint le canal par défaut "general".
- L'utilisateur saisit un message, par exemple "Bonjour à tous !", dans le champ de texte et clique sur le bouton d'envoi.
- Tous les utilisateurs actuellement dans le canal "general" reçoivent immédiatement le message "Jean : Bonjour à tous !".
- Si l'utilisateur change de canal (par exemple vers "Développement"), il ne reçoit que les messages de ce canal, et les autres messages sont filtrés.