0% ont trouvé ce document utile (0 vote)
44 vues10 pages

ACTIVITE 12 RabbitMQ

Le document présente un guide sur la mise en œuvre de RabbitMQ pour des workflows de production médiatique, en intégrant des échanges entre une chaîne de télévision et ses partenaires. Il décrit les concepts clés de RabbitMQ, la configuration avec Docker, ainsi qu'un exemple de code pour un système de publication/abonnement. Des scénarios concrets illustrent l'utilisation de RabbitMQ dans des processus tels que le transcodage et le contrôle qualité des médias.

Transféré par

Doha Dennaye
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
44 vues10 pages

ACTIVITE 12 RabbitMQ

Le document présente un guide sur la mise en œuvre de RabbitMQ pour des workflows de production médiatique, en intégrant des échanges entre une chaîne de télévision et ses partenaires. Il décrit les concepts clés de RabbitMQ, la configuration avec Docker, ainsi qu'un exemple de code pour un système de publication/abonnement. Des scénarios concrets illustrent l'utilisation de RabbitMQ dans des processus tels que le transcodage et le contrôle qualité des médias.

Transféré par

Doha Dennaye
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi