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° : 14
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
I. Contexte
MEGARAM CASA est une société de projection de films qui souhaite moderniser son système de
gestion des projections et des réservations. Actuellement, leur processus est manuel et centralisé, ce
qui entraîne des goulots d'étranglement et des difficultés à gérer les mises à jour en temps réel.
L'objectif de ce projet est de découper leur application monolithique en microservices indépendants,
améliorant ainsi la scalabilité, la maintenabilité et la résilience du système.
II. Problématique
1. Gestion centralisée inefficace :
o Toutes les fonctionnalités (ajout de films, planning, réservations) sont couplées dans une seule
application, ce qui rend les mises à jour complexes.
o Un seul point de défaillance peut impacter tout le système.
2. Besoin de communication asynchrone :
o Lorsqu'un nouveau film est ajouté, le service des projections et celui des réservations doivent
être notifiés sans créer de dépendances directes.
3. Technologies hétérogènes :
o L’équipe souhaite utiliser [Link]/Express pour les services critiques (films et projections)
et PHP pour le frontend des réservations (pour des raisons de compatibilité avec leur
système existant).
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
Solution Proposée : Architecture Microservices
Le projet sera divisé en 3 microservices principaux, communiquant via une API
Gateway et RabbitMQ pour la messagerie asynchrone :
1. 🎬 Microservice Films (Producer - [Link]/Express)
o Ajout de films (ID, titre, durée, lien de téléchargement, date de projection).
o Publication des films dans une queue RabbitMQ pour une diffusion asynchrone.
2. 📅 Microservice Projections (Consumer - [Link]/Express)
o Consommation des films depuis RabbitMQ.
o Affichage de la liste des films disponibles.
o Génération d’un planning hebdomadaire basé sur les dates de projection.
3. 🎟 Microservice Réservations (PHP)
o Permet aux utilisateurs de réserver une place pour un film.
o Communique avec le service Projections pour vérifier les disponibilités.
4. 🚪 API Gateway ([Link]/Express)
o Point d’entrée unique pour les clients (applications web/mobile).
o Achemine les requêtes vers le bon microservice.
III. Architecture Proposée
Client → API Gateway → [
Microservice Films ([Link]/Express) - Producer RabbitMQ,
Microservice Projections ([Link]/Express) - Consumer RabbitMQ,
Microservice Réservations (PHP)
]
1. Microservice Films (Producer)
Technologie: [Link]/Express + RabbitMQ
Fonctionnalités:
Ajout de films avec les champs: id_film, titre, durée, lienTelechargement, date_projection
Publication des films dans une queue RabbitMQ
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
Étapes de développement:
1. Initialisation du projet:
mkdir microservice-films
cd microservice-films
npm init -y
npm install express amqplib body-parser cors
2. Structure du projet:
microservice-films/
├── src/
│ ├── controllers/
│ │ └── [Link]
│ ├── models/
│ │ └── [Link]
│ ├── rabbitmq/
│ │ └── [Link]
│ └── [Link]
├── .env
└── [Link]
3. Code principal ([Link]):
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const filmRoutes = require('./routes/filmRoutes');
const { initRabbitMQ } = require('./rabbitmq/producer');
const app = express();
[Link](cors());
[Link]([Link]());
// Connexion RabbitMQ
initRabbitMQ().then(() => {
[Link]('RabbitMQ Producer connecté');
}).catch([Link]);
// Routes
[Link]('/api/films', filmRoutes);
const PORT = [Link] || 3001;
[Link](PORT, () => {
[Link](`Microservice Films en écoute sur le port ${PORT}`);
});
4. Producer RabbitMQ ([Link]):
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
const amqp = require('amqplib');
let channel;
async function initRabbitMQ() {
const connection = await [Link]('amqp://localhost');
channel = await [Link]();
await [Link]('films_queue', { durable: true });
}
async function publishFilm(film) {
if (!channel) await initRabbitMQ();
[Link]('films_queue', [Link]([Link](film)), {
persistent: true
};
}
[Link] = { initRabbitMQ, publishFilm };
5. Controller ([Link]):
const { publishFilm } = require('../rabbitmq/producer');
[Link] = async (req, res) => {
try {
const { id_film, titre, durée, lienTelechargement, date_projection
} = [Link];
const newFilm = {
id_film,
titre,
durée,
lienTelechargement,
date_projection: new Date(date_projection)
};
await publishFilm(newFilm);
[Link](201).json({
message: "Film ajouté et publié dans la queue",
film: newFilm
});
} catch (error) {
[Link](500).json({ error: [Link] });
}
};
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
2. Microservice Projections (Consumer)
Technologie: [Link]/Express + RabbitMQ
Fonctionnalités:
Consommation des films depuis RabbitMQ
Affichage des films disponibles
Génération d'un planning hebdomadaire basé sur date_projection
Étapes de développement:
1. Initialisation:
mkdir microservice-projections
cd microservice-projections
npm init -y
npm install express amqplib cors
2. Structure:
microservice-projections/
├── src/
│ ├── controllers/
│ │ └── [Link]
│ ├── rabbitmq/
│ │ └── [Link]
│ ├── services/
│ │ └── [Link]
│ └── [Link]
└── [Link]
3. Consumer RabbitMQ ([Link]):
const amqp = require('amqplib');
let films = [];
async function startConsumer() {
const connection = await [Link]('amqp://localhost');
const channel = await [Link]();
await [Link]('films_queue', { durable: true });
[Link]('films_queue', (msg) => {
if (msg !== null) {
const film = [Link]([Link]());
[Link](film);
[Link](msg);
}
});
}
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
function getFilms() {
return films;
}
function getWeeklyPlanning() {
const now = new Date();
const nextWeek = new Date([Link]() + 7 * 24 * 60 * 60 * 1000);
return [Link](film => {
const projectionDate = new Date(film.date_projection);
return projectionDate >= now && projectionDate <= nextWeek;
}).sort((a, b) => new Date(a.date_projection) - new Date(b.date_project
ion));
}
[Link] = { startConsumer, getFilms, getWeeklyPlanning };
4. Controller ([Link]):
const { getFilms, getWeeklyPlanning } = require('../rabbitmq/consume
r');
[Link] = (req, res) => {
try {
const films = getFilms();
[Link](200).json(films);
} catch (error) {
[Link](500).json({ error: [Link] });
}
};
[Link] = (req, res) => {
try {
const planning = getWeeklyPlanning();
[Link](200).json(planning);
} catch (error) {
[Link](500).json({ error: [Link] });
}
};
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
3. Microservice Réservations (PHP)
Technologie: PHP (Slim Framework ou Laravel)
Fonctionnalités:
Réservation de places pour les films
Gestion des utilisateurs
Étapes de développement:
1. Initialisation (avec Composer):
mkdir microservice-reservations
cd microservice-reservations
composer init
composer require slim/slim slim/psr7
2. Structure:
microservice-reservations/
├── src/
│ ├── controllers/
│ │ └── [Link]
│ ├── models/
│ │ └── [Link]
│ └── public/
│ └── [Link]
├── vendor/
└── [Link]
3. Endpoint de réservation ([Link]):
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
require __DIR__ . '/../vendor/[Link]';
$app = AppFactory::create();
// Route pour créer une réservation
$app->post('/api/reservations', function (Request $request, Response $response) {
$data = $request->getParsedBody();
// Validation des données
if (empty($data['id_film']) || empty($data['id_utilisateur'])) {
$response->getBody()->write(json_encode(['error' => 'Données manquantes'])
);
return $response->withStatus(400);
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
}
// Ici, vous devriez enregistrer en base de données
// Exemple simplifié:
$reservation = [
'id' => uniqid(),
'id_film' => $data['id_film'],
'id_utilisateur' => $data['id_utilisateur'],
'date_reservation' => date('Y-m-d H:i:s')
];
$response->getBody()->write(json_encode($reservation));
return $response->withHeader('Content-Type', 'application/json')->withStatus(2
01);
});
$app->run();
4. API Gateway
Technologie: [Link]/Express
Fonctionnalités:
Routage des requêtes vers les microservices appropriés
Gestion centralisée des accès
Étapes de développement:
1. Initialisation:
mkdir api-gateway
cd api-gateway
npm init -y
npm install express http-proxy-middleware cors morgan
2. Configuration ([Link]):
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const cors = require('cors');
const morgan = require('morgan');
const app = express();
[Link](cors());
[Link](morgan('combined'));
// Routes
[Link]('/films', createProxyMiddleware({
target: '[Link]
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
changeOrigin: true
}));
[Link]('/projections', createProxyMiddleware({
target: '[Link]
changeOrigin: true
}));
[Link]('/reservations', createProxyMiddleware({
target: '[Link]
changeOrigin: true
}));
const PORT = [Link] || 3000;
[Link](PORT, () => {
[Link](`API Gateway en écoute sur le port ${PORT}`);
});
Déploiement et Test
1. Lancer RabbitMQ:
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
2. Lancer les microservices dans des terminaux séparés:
# Microservice Films
cd microservice-films
node src/[Link]
# Microservice Projections
cd microservice-projections
node src/[Link]
# Microservice Réservations (PHP)
cd microservice-reservations
php -S localhost:3003 -t src/public/
# API Gateway
cd api-gateway
node [Link]
3. Tests avec cURL:
Ajouter un film:
curl -X POST [Link] \
-H "Content-Type: application/json" \
-d '{
"id_film": "film001",
"titre": "Inception",
"durée": "148",
"lienTelechargement": "[Link]
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
"date_projection": "2023-12-15T[Link]"
}'
Voir les projections:
curl [Link]
Faire une réservation:
curl -X POST [Link] \
-H "Content-Type: application/json" \
-d '{
"id_film": "film001",
"id_utilisateur": "user123"
}'
Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud