Objectifs pédagogiques Opérationnelles
Concevoir et mettre en œuvre une architecture RabbitMQ adaptée
aux workflows de production médiatique, intégrant les échanges
EFP : ISTA OUARZAZTE entre une chaîne de télévision (comme ARTE) et ses boîtes de
production partenaires, tout en garantissant la fiabilité, la traçabilité
et l'évolutivité des flux de données.
Activité N° : 12
Année : 2024-2025 Objectifs pédagogiques intermédiaires
Filière : Développement Digital (Option : Web FullStack) OPI 1.1 : Expliquer le rôle de RabbitMQ dans un
écosystème média distribué
Module 206 : Création application Cloud OPI 1.2 : Identifier les différences entre les types
d'exchanges (direct, fanout, topic, headers)
Chapitre II : OPI 1.3 : Décrire le cycle de vie d'un message dans le
contexte ARTE
Mise en palce de RabbitMQ
RabbitMQ Broker
I. Introduction à RabbitMQ et Docker
RabbitMQ est un système de messagerie open source qui implémente le protocole AMQP
(Advanced Message Queuing Protocol). Il permet une communication asynchrone entre les
composants d'une application.
Docker est une plateforme de conteneurisation qui permet d'emballer, distribuer et exécuter
des applications dans des environnements isolés.
II. Concepts clés expliqués
1. File d'attente (Queue): Une boîte aux lettres nommée où les messages sont stockés.
2. Exchange: Un point de distribution qui route les messages vers les files d'attente.
3. Binding: Une relation entre un exchange et une file d'attente.
4. Publisher/Producer: Un programme qui envoie des messages.
5. Consumer/Subscriber: Un programme qui reçoit des messages.
RabbitMQ est un message broker, son rôle est de transporter et router les messages
depuis les publishers vers les consumers. Le broker utilise
les exchanges et bindings pour savoir si il doit délivrer, ou non, le message dans la queue
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
III. Mise en place de l'environnement
1. Lancer RabbitMQ avec Docker
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
[Link]
Pour démarrer un serveur RabbitMQ avec Docker, exécutez la commande suivante :
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
Cette commande:
Crée un conteneur nommé rabbitmq
Expose les ports 5672 (pour AMQP) et 15672 (pour l'interface web de gestion)
Utilise l'image rabbitmq:3-management qui inclut l'interface de gestion
2. Accéder à l'interface de gestion
Ouvrez votre navigateur à l'adresse: [Link]
Identifiants par défaut:
Utilisateur: guest
Mot de passe: guest
IV. Exemple de code Publisher/Subscriber
Structure du projet
rabbitmq-express/
├── publisher/
│ ├── Dockerfile
│ ├── [Link]
│ └── [Link]
├── subscriber/
│ ├── Dockerfile
│ ├── [Link]
│ └── [Link]
└── [Link]
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
1. Fichier [Link]
version: '3'
services:
rabbitmq:
image: rabbitmq:3-management
ports:
- "5672:5672"
- "15672:15672"
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=password
publisher:
build: ./publisher
ports:
- "3000:3000"
depends_on:
- rabbitmq
environment:
- RABBITMQ_HOST=rabbitmq
subscriber:
build: ./subscriber
ports:
- "3001:3001"
depends_on:
- rabbitmq
environment:
- RABBITMQ_HOST=rabbitmq
2. Publisher ([Link])
publisher/[Link]
{
"name": "rabbitmq-publisher",
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
"version": "1.0.0",
"main": "[Link]",
"scripts": {
"start": "node [Link]"
},
"dependencies": {
"amqplib": "^0.10.3",
"express": "^4.18.2"
}
}
publisher/Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY [Link] .
RUN npm install
COPY [Link] .
EXPOSE 3000
CMD ["npm", "start"]
publisher/[Link]
const express = require('express');
const amqp = require('amqplib');
const app = express();
const port = 3000;
const RABBITMQ_HOST = [Link].RABBITMQ_HOST || 'localhost';
const QUEUE_NAME = 'express_queue';
[Link]([Link]());
let channel;
// Connexion à RabbitMQ
async function connectRabbitMQ() {
try {
const connection = await [Link](`amqp://admin:password@${RABBITMQ_HOST}`
);
channel = await [Link]();
await [Link](QUEUE_NAME, { durable: false });
[Link]('Connected to RabbitMQ and channel created');
} catch (error) {
[Link]('Error connecting to RabbitMQ:', error);
setTimeout(connectRabbitMQ, 5000); // Reconnexion après 5 secondes
}
}
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
// Route pour publier un message
[Link]('/publish', async (req, res) => {
const { message } = [Link];
if (!message) {
return [Link](400).json({ error: 'Message is required' });
}
try {
[Link](QUEUE_NAME, [Link](message));
[Link](` [x] Sent '${message}'`);
[Link]({ status: 'Message sent', message });
} catch (error) {
[Link]('Error sending message:', error);
[Link](500).json({ error: 'Failed to send message' });
}
});
// Démarrer le serveur après la connexion à RabbitMQ
connectRabbitMQ().then(() => {
[Link](port, () => {
[Link](`Publisher service listening at [Link]
});
});
3. Subscriber ([Link])
subscriber/[Link]
{
"name": "rabbitmq-subscriber",
"version": "1.0.0",
"main": "[Link]",
"scripts": {
"start": "node [Link]"
},
"dependencies": {
"amqplib": "^0.10.3",
"express": "^4.18.2"
}
}
subscriber/Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY [Link] .
RUN npm install
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
COPY [Link] .
EXPOSE 3001
CMD ["npm", "start"]
subscriber/[Link]
const express = require('express');
const amqp = require('amqplib');
const app = express();
const port = 3001;
const RABBITMQ_HOST = [Link].RABBITMQ_HOST || 'localhost';
const QUEUE_NAME = 'express_queue';
[Link]([Link]());
// Fonction pour consommer les messages
async function consumeMessages() {
try {
const connection = await [Link](`amqp://admin:password@${RABBITMQ_HOST}`
);
const channel = await [Link]();
await [Link](QUEUE_NAME, { durable: false });
[Link]('Waiting for messages in %s. To exit press CTRL+C', QUEUE_NAME);
[Link](QUEUE_NAME, (msg) => {
if (msg !== null) {
[Link](` [x] Received '${[Link]()}'`);
[Link](msg);
}
});
} catch (error) {
[Link]('Error consuming messages:', error);
setTimeout(consumeMessages, 5000); // Reconnexion après 5 secondes
}
}
// Route pour vérifier que le subscriber est en marche
[Link]('/health', (req, res) => {
[Link]({ status: 'Subscriber is running' });
});
// Démarrer le serveur et le consumer
[Link](port, () => {
[Link](`Subscriber service listening at [Link]
consumeMessages();
});
Comment tester l'application
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
1. Démarrer les services:
docker-compose up --build
2. Publier un message:
curl -X POST [Link] \
-H "Content-Type: application/json" \
-d '{"message":"Hello RabbitMQ from Express!"}'
3. Vérifier les logs du subscriber pour voir le message reçu.
4. Accéder à l'interface de gestion RabbitMQ: [Link] (admin/password)
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
Exemple Concret
a. Exchange "[Link]" (type direct)
Queue "[Link]" : Pour les demandes de transcodage
Queue "[Link]" : Pour les vérifications qualité
Queue "[Link]" : Pour les mises à jour de métadonnées
b. Exchange "[Link]" (type fanout)
Queue "[Link]" : Mises à jour du planning
Queue "[Link]" : Vérifications des droits
Exemple de workflow détaillé
Scénario : Soumission d'un nouveau film
Upload du film :
La boîte de production upload le master sur un stockage S3
Un service écoute le bucket S3 et publie un message dans l'exchange "[Link]"
avec la clé de routage "[Link]"
{
"production_id": "DOC_2023_456",
"file_path": "s3://arte-prod/DOC_2023_456/[Link]",
"format": "XDCAM_HD422",
"delivery_date": "2023-11-15",
"producer": "Zadig Productions"
}
Transcodage :
Le service de transcodage consomme la queue "[Link]"
Après traitement, il publie un message dans "[Link]" avec la clé "[Link]"
Contrôle qualité :
L'équipe qualité reçoit le message et effectue ses vérifications
Si OK, publication dans "[Link]" avec clé "[Link]"
Finalisation des métadonnées :
Le système de gestion de métadonnées complète les informations
Publication dans "[Link]" pour informer tous les services
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud