You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
montpelliermaalsi2024/rabbit/asynchrone.md

108 lines
5.0 KiB
Markdown

Dans un environnement à architecture orientée micro-services, RabbitMQ est souvent utilisé comme un bus de messages pour faciliter la communication asynchrone entre les différents services. Voici quelques manières courantes d'utiliser RabbitMQ dans ce contexte :
### 1. **Communication Asynchrone**
- **Découplage des Services** : RabbitMQ permet de découpler les services en leur permettant de communiquer via des messages sans avoir besoin de connaître les détails d'implémentation des autres services.
- **Scalabilité** : Les services peuvent émettre des messages sans se soucier de la disponibilité des consommateurs, ce qui permet de mieux gérer les pics de charge.
### 2. **Traitement de Tâches en Arrière-Plan**
- **Files d'Attente de Travail** : Les services peuvent enfiler des tâches à exécuter en arrière-plan, comme le traitement d'images, l'envoi d'emails, ou la génération de rapports.
- **Répartition de Charge** : Les tâches peuvent être réparties entre plusieurs instances de consommateurs pour améliorer les performances et la résilience.
### 3. **Gestion des Événements**
- **Événements de Domaine** : Les services peuvent publier des événements de domaine (comme "UtilisateurCréé" ou "CommandeExpédiée") qui peuvent être consommés par d'autres services intéressés.
- **Réactivité** : Les services peuvent réagir rapidement aux événements sans avoir besoin de polling ou de sondage constant.
### 4. **Intégration de Systèmes Hétérogènes**
- **Interopérabilité** : RabbitMQ supporte plusieurs protocoles (AMQP, MQTT, STOMP), ce qui permet d'intégrer des systèmes hétérogènes et des technologies différentes.
- **Passerelles** : RabbitMQ peut servir de passerelle entre des systèmes legacy et des systèmes modernes.
### 5. **Tolérance aux Pannes et Résilience**
- **Durabilité** : Les messages peuvent être persistés sur le disque pour survivre aux redémarrages du broker.
- **Réplication** : Les files d'attente peuvent être répliquées sur plusieurs nœuds pour améliorer la tolérance aux pannes.
- **DLX et TTL** : Les messages non traités ou expirés peuvent être envoyés à des files d'attente de secours (Dead Letter Exchange) pour une gestion ultérieure.
### 6. **Orchestration de Workflows**
- **Workflows Complexes** : RabbitMQ peut être utilisé pour orchestrer des workflows complexes où plusieurs étapes doivent être exécutées dans un ordre spécifique.
- **Coordination** : Les services peuvent coordonner leurs actions via des messages pour garantir que les dépendances sont respectées.
### 7. **Surveillance et Gestion**
- **Monitoring** : RabbitMQ fournit des outils et des API pour surveiller les performances et l'état du broker.
- **Alertes** : Vous pouvez configurer des alertes pour être notifié en cas de problèmes ou de conditions spécifiques.
- **Management Plugin** : Le plugin de gestion fournit une interface web pour surveiller et gérer RabbitMQ.
### Exemple d'Architecture
#### Micro-service A (Producteur)
```python
import pika
import json
def send_message(message):
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='events', exchange_type='fanout')
channel.basic_publish(
exchange='events',
routing_key='',
body=json.dumps(message),
properties=pika.BasicProperties(
delivery_mode=2, # make message persistent
))
print(f" [x] Sent {message}")
connection.close()
if __name__ == '__main__':
message = {"event": "UserCreated", "data": {"user_id": 123, "username": "john_doe"}}
send_message(message)
```
#### Micro-service B (Consommateur)
```python
import pika
import json
def callback(ch, method, properties, body):
message = json.loads(body)
print(f" [x] Received {message}")
process_event(message)
def process_event(message):
# Traitement de l'événement
print(f"Processing event: {message}")
def main():
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='events', exchange_type='fanout')
result = channel.queue_declare(queue='', exclusive=True)
queue_name = result.method.queue
channel.queue_bind(exchange='events', queue=queue_name)
channel.basic_consume(queue=queue_name, on_message_callback=callback, auto_ack=True)
print(' [*] Waiting for events. To exit press CTRL+C')
channel.start_consuming()
if __name__ == '__main__':
main()
```
### Conclusion
RabbitMQ est un outil puissant pour la communication asynchrone et la gestion des messages dans une architecture orientée micro-services. Il permet de découpler les services, d'améliorer la scalabilité et la résilience, et de faciliter l'intégration de systèmes hétérogènes. En utilisant RabbitMQ, les micro-services peuvent communiquer de manière fiable et efficace, tout en bénéficiant des nombreuses fonctionnalités offertes par le broker de messages.