Pub/Sub (Publish/Subscribe)
Le Pub/Sub (Publish/Subscribe) est un pattern de communication asynchrone dans lequel des producteurs (publishers) envoient des messages à des topics sans connaître les consommateurs, et des consommateurs (subscribers) s’abonnent à ces topics pour recevoir les messages pertinents, le tout orchestré par un broker intermédiaire qui assure le découplage complet entre émetteurs et récepteurs.
- Type
- Pattern de messagerie asynchrone
- Direction
- Many-to-many (fanout)
- Découplage
- Total (publishers ignorent les subscribers et vice-versa)
- Composants
- Publisher, Subscriber, Topic, Broker
- Outils majeurs
- Apache Kafka, Google Cloud Pub/Sub, AWS SNS, Redis Pub/Sub, RabbitMQ
- Usage IA
- Agents multi-agents, pipelines ML event-driven, streaming temps réel
Comment fonctionne le Pub/Sub
Le Pub/Sub repose sur quatre composants fondamentaux. Le publisher est l’application qui crée et envoie des messages. Il les publie sur un topic (un canal nommé qui catégorise les messages) sans savoir qui va les lire. Le broker (intermédiaire) reçoit les messages, les stocke si nécessaire, et les distribue aux abonnés. Le subscriber s’inscrit aux topics qui l’intéressent et reçoit une copie de chaque message publié.
Le point clé : le publisher ne connaît pas les subscribers, et les subscribers ne connaissent pas le publisher. Toute la communication passe par le broker. Cette séparation totale s’appelle le découplage, et c’est ce qui rend le pattern si puissant pour les architectures distribuées.
Le flux d’un message
Voici la séquence complète :
- Un publisher envoie un message au broker, attaché à un topic (par exemple
commandes.nouvelles). - Le broker vérifie quels subscribers sont abonnés à ce topic.
- Le broker transmet une copie du message à chaque subscriber abonné. C’est le fanout : un message publié est distribué à N consommateurs.
- Chaque subscriber traite le message indépendamment.
- Le subscriber envoie un accusé de réception (ACK) au broker pour confirmer le traitement.
- Le broker supprime le message (ou le conserve selon la politique de rétention).
Types de filtrage
Tous les subscribers ne veulent pas tous les messages. Le filtrage se fait de deux manières. Le filtrage par topic est le plus courant : le subscriber s’abonne à un topic spécifique et ne reçoit que les messages de ce topic. Le filtrage par contenu va plus loin : le subscriber définit des contraintes sur les attributs du message (par exemple, ne recevoir que les commandes dont le montant dépasse 1 000 €). Certains systèmes combinent les deux approches.
Pub/Sub vs Message Queue
La confusion entre Pub/Sub et message queue est fréquente, mais la différence est fondamentale.
Dans un système de message queue, un message est consommé par un seul consommateur. Si trois workers écoutent la même queue, chaque message est traité par un seul d’entre eux (distribution de charge). C’est du point-to-point.
En Pub/Sub, un message est distribué à tous les subscribers abonnés au topic. Si trois services écoutent le topic commandes.nouvelles, les trois reçoivent une copie du message. C’est du fanout (one-to-many).
| Critère | Pub/Sub | Message Queue |
|---|---|---|
| Distribution | Fanout (tous les subscribers) | Un seul consommateur par message |
| Relation | One-to-many | One-to-one |
| Découplage | Total | Partiel (le sender connaît la queue) |
| Cas d’usage | Notifications, événements, diffusion | Tâches à distribuer, traitement en file |
| Persistence | Variable (selon le broker) | Généralement garantie |
| Ordre des messages | Non garanti (sauf configuration) | Généralement FIFO |
Les principaux outils Pub/Sub
L’écosystème est riche. Voici les solutions les plus utilisées, avec leurs forces respectives.
Apache Kafka
Kafka est le standard de fait pour le streaming d’événements à haute échelle. Ce n’est pas un broker Pub/Sub classique mais un log distribué : les messages sont persistés dans des partitions ordonnées et peuvent être relus. Les consumer groups permettent à la fois du fanout et du load balancing. Kafka gère des millions de messages par seconde et est utilisé par LinkedIn, Netflix, Uber et la plupart des grandes plateformes.
Le point fort de Kafka est la durabilité : les messages sont stockés et rejouables. Son point faible est la complexité opérationnelle, même si des services managés comme Confluent Cloud ou Amazon MSK simplifient le déploiement.
Google Cloud Pub/Sub
Le service managé de Google facture $40 par TiB au-delà d’un palier gratuit de 10 Go par mois. C’est un service serverless : pas de partitions à gérer, pas de capacité à provisionner (contrairement à Kafka). Il supporte les souscriptions push (webhook) et pull, avec livraison at-least-once. Google a arrêté Pub/Sub Lite (la version à coût réduit) le 18 mars 2026, poussant les utilisateurs vers le Pub/Sub standard ou vers Google Cloud Managed Service for Apache Kafka.
Redis Pub/Sub
Redis offre un Pub/Sub intégré, ultra-simple et rapide. Le publisher envoie un message à un channel, tous les subscribers actifs le reçoivent instantanément. Mais attention : c’est du « fire-and-forget ». Si aucun subscriber n’est connecté au moment de la publication, le message est perdu. Pas de persistance, pas d’accusé de réception, pas de consumer groups. Redis Pub/Sub est idéal pour l’invalidation de cache, les notifications en temps réel, ou comme couche de communication entre serveurs dans un cluster de long polling. Pour du traitement fiable, Redis Streams est préférable.
AWS SNS + SQS
Amazon propose SNS (Simple Notification Service) pour le Pub/Sub pur et SQS (Simple Queue Service) pour les message queues. Le pattern classique est de combiner les deux : SNS diffuse un événement à plusieurs queues SQS, chacune traitée par un service différent. C’est le pattern « fanout to queues » qui offre à la fois la diffusion du Pub/Sub et la fiabilité des queues.
RabbitMQ
RabbitMQ est un broker de messages polyvalent qui supporte les deux modèles (queues et Pub/Sub via les exchanges de type « fanout » ou « topic »). Sa force est la flexibilité du routage : les exchanges permettent des patterns de filtrage sophistiqués. RabbitMQ est plus adapté aux architectures de microservices de taille moyenne qu’au streaming massif.
Comparaison rapide
| Outil | Type | Persistance | Scalabilité | Complexité | Coût |
|---|---|---|---|---|---|
| Apache Kafka | Log distribué Open Source | Oui (replay) | Très haute | Élevée | Self-hosted ou Confluent Cloud |
| Google Cloud Pub/Sub | Managed Pub/Sub | Oui (rétention configurable) | Auto-scale | Faible | $40/TiB après 10 Go gratuits |
| Redis Pub/Sub | In-memory Open Source | Non (fire-and-forget) | Modérée | Très faible | Gratuit (self-hosted) |
| AWS SNS | Managed Pub/Sub | Non (couplé à SQS pour la persistance) | Auto-scale | Faible | ~$0,50/million de notifications |
| RabbitMQ | Broker polyvalent Open Source | Oui (configurable) | Modérée | Modérée | Gratuit (self-hosted) |
Pub/Sub dans l’écosystème IA
Le Pub/Sub est devenu un composant fondamental des architectures IA modernes, en particulier pour les systèmes multi-agents et les pipelines de machine learning event-driven.
Systèmes multi-agents event-driven
Les frameworks d’agents IA comme AutoGen, CrewAI et LangGraph s’appuient de plus en plus sur des architectures event-driven. Le principe : chaque agent publie des événements sur des topics (par exemple « analyse-terminée », « décision-prise ») et les autres agents s’abonnent aux événements qui les concernent.
Ce modèle résout un problème majeur des systèmes multi-agents : la complexité des connexions. Dans une architecture point-to-point, N agents nécessitent jusqu’à N² connexions. Avec un broker Pub/Sub, chaque agent maintient une seule connexion au broker, réduisant la complexité à O(N). Un nouvel agent peut rejoindre le système en s’abonnant aux topics pertinents sans modifier les agents existants.
Google Cloud recommande explicitement Pub/Sub comme couche de communication pour les systèmes multi-agents, le décrivant comme idéal pour les architectures découplées et les interactions event-driven entre agents.
ticket-classifié sur un topic Kafka. L’agent de routage, abonné à ce topic, décide vers quel agent spécialisé (facturation, technique, commercial) router le ticket et publie un événement ticket-routé. L’agent spécialisé traite le ticket et publie réponse-générée. L’agent de qualité, abonné à ce dernier topic, évalue la réponse avant envoi. Chaque agent travaille de manière autonome, connecté uniquement via Kafka.
Pipelines MLOps event-driven
Dans les architectures MLOps, le Pub/Sub orchestre les étapes du cycle de vie des modèles. Un événement « nouvelles-données-disponibles » déclenche le retraining. Un événement « modèle-entraîné » déclenche l’évaluation. Un événement « évaluation-réussie » déclenche le déploiement. Chaque étape est un service indépendant qui réagit aux événements, plutôt qu’un pipeline rigide câblé en dur.
Cette approche est particulièrement adaptée aux architectures sur cloud avec Google Cloud (Pub/Sub + Vertex AI + Dataflow), AWS (SNS/SQS + SageMaker) ou Azure (Event Grid + Azure ML).
Streaming de données pour l’inférence temps réel
Quand un modèle de ML doit traiter des données en flux continu (détection de fraude, recommandation en temps réel, monitoring d’anomalies), le Pub/Sub sert de pont entre les sources de données et le modèle. Les événements arrivent sur un topic, un service d’inférence les consomme et génère des prédictions, qui sont elles-mêmes publiées sur un topic de résultats.
Pub/Sub et le protocole A2A
Le protocole A2A (Agent-to-Agent), initié par Google, standardise la communication entre agents IA de différents frameworks. Il complète le MCP (qui gère la communication agent-outil) en se focalisant sur l’interaction entre agents. Les architectures event-driven avec Pub/Sub sont la fondation naturelle de A2A : les agents publient et consomment des événements via un broker, sans avoir besoin de connaître les détails d’implémentation des autres agents.
Implémentation pratique
Exemple avec Redis Pub/Sub (Python)
Redis Pub/Sub est le moyen le plus rapide de tester le pattern. Voici un publisher et un subscriber minimalistes :
# publisher.py
import redis
import json
r = redis.Redis(host='localhost', port=6379)
event = {
"type": "ticket.classified",
"data": {
"ticket_id": "T-4521",
"category": "technical",
"priority": "high"
}
}
r.publish("support-events", json.dumps(event))
print(f"Événement publié sur 'support-events'")
# subscriber.py
import redis
import json
r = redis.Redis(host='localhost', port=6379)
pubsub = r.pubsub()
pubsub.subscribe("support-events")
print("En attente de messages sur 'support-events'...")
for message in pubsub.listen():
if message["type"] == "message":
event = json.loads(message["data"])
print(f"Reçu : {event['type']} - Ticket {event['data']['ticket_id']}")
# Traiter l'événement selon son type
if event["type"] == "ticket.classified":
print(f" → Catégorie : {event['data']['category']}")
print(f" → Priorité : {event['data']['priority']}")
Exemple avec Google Cloud Pub/Sub (Python)
# Publisher Google Cloud Pub/Sub
from google.cloud import pubsub_v1
import json
publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path("mon-projet", "inference-requests")
message = json.dumps({
"model": "fraud-detection-v3",
"input": {"transaction_id": "TX-98765", "amount": 4500}
})
future = publisher.publish(topic_path, message.encode("utf-8"))
print(f"Message publié, ID: {future.result()}")
# Subscriber Google Cloud Pub/Sub
from google.cloud import pubsub_v1
import json
subscriber = pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path(
"mon-projet", "inference-requests-sub"
)
def callback(message):
data = json.loads(message.data.decode("utf-8"))
print(f"Requête d'inférence reçue : modèle={data['model']}")
# Lancer l'inférence...
message.ack() # Confirmer le traitement
streaming_pull = subscriber.subscribe(subscription_path, callback=callback)
print("En écoute...")
streaming_pull.result() # Bloquant
Avantages et limites du Pub/Sub
Avantages
Le découplage est le bénéfice numéro un. Les publishers et subscribers évoluent indépendamment : vous pouvez ajouter un nouveau subscriber sans modifier le publisher, remplacer un service sans impacter les autres, et scaler chaque composant séparément. C’est exactement ce dont les architectures de microservices ont besoin.
La scalabilité est un autre atout majeur. Un publisher peut diffuser vers des milliers de subscribers sans effort supplémentaire. Le broker gère la distribution, le buffering, et la rétention. Les systèmes comme Kafka gèrent des milliards de messages par jour.
La résilience est intégrée dans le design. Si un subscriber tombe en panne, les messages s’accumulent dans le broker en attendant sa reprise. Les autres subscribers ne sont pas impactés. C’est une isolation des pannes naturelle.
Limites
La livraison « at-least-once » est le standard de la plupart des brokers Pub/Sub. Cela signifie qu’un message peut être livré en double, et vos subscribers doivent être idempotents (capables de traiter deux fois le même message sans effet de bord). Certains brokers offrent la livraison « exactly-once », mais avec un surcoût en performance.
L’ordre des messages n’est pas garanti par défaut dans tous les systèmes. Kafka garantit l’ordre au sein d’une partition, mais pas entre partitions. Google Cloud Pub/Sub propose un ordering par clé. Si l’ordre est critique pour votre cas d’usage, vérifiez les garanties de votre broker.
Le debugging est plus complexe qu’avec des appels synchrones. Tracer un message à travers un système Pub/Sub avec plusieurs subscribers qui publient eux-mêmes des événements nécessite des outils d’observabilité (distributed tracing, corrélation d’identifiants).
Enfin, le Pub/Sub est surdimensionné pour les architectures simples. Si vous avez deux services qui communiquent de manière point-to-point, un appel REST ou un webhook suffit. Le Pub/Sub prend tout son sens à partir de trois ou quatre services qui doivent réagir au même événement.
Bonnes pratiques d’implémentation
Concevoir des subscribers idempotents
Puisque les messages peuvent être livrés en double, chaque subscriber doit pouvoir traiter le même message deux fois sans créer de doublons ou d’incohérences. La technique classique : stocker l’identifiant de chaque message traité et ignorer les doublons.
Configurer des dead letter topics
Quand un subscriber échoue à traiter un message après plusieurs tentatives, celui-ci doit être redirigé vers un « dead letter topic » pour analyse ultérieure plutôt que de bloquer la file. Kafka, Google Cloud Pub/Sub et RabbitMQ supportent tous ce mécanisme.
Gérer l’évolution des schémas
Les messages échangés via Pub/Sub doivent avoir un format défini (JSON Schema, Avro, Protobuf). Quand le format évolue, assurez la compatibilité ascendante pour ne pas casser les subscribers existants. Confluent Schema Registry est la solution de référence pour Kafka.
Monitorer la consommation
Surveillez le « lag » de chaque subscriber (la différence entre le dernier message publié et le dernier message consommé). Un lag croissant indique un subscriber qui ne suit pas le débit. C’est un signal d’alerte pour scaler le service ou optimiser le traitement.
Nommer les topics avec intention
Utilisez une convention de nommage hiérarchique : domaine.entité.action (par exemple ecommerce.commande.créée, ia.inference.terminée, monitoring.alerte.déclenchée). Cela facilite la découverte, le filtrage par pattern, et la gouvernance.
Verdict
Le Pub/Sub est le pattern de communication de référence pour les architectures distribuées modernes. Si vous construisez un système avec plus de deux ou trois services qui doivent réagir aux mêmes événements, vous avez besoin d’un broker Pub/Sub. Pour les systèmes d’agents IA, c’est la fondation qui permet l’autonomie, la scalabilité et le découplage nécessaires à des architectures multi-agents robustes.
Pour un projet en démarrage ou un prototype, Redis Pub/Sub (ou Redis Streams pour la fiabilité) fait le travail. Pour de la production à grande échelle, Kafka (via Confluent Cloud) ou Google Cloud Pub/Sub sont les choix de référence. Et si vous êtes sur AWS, le combo SNS + SQS offre un bon compromis entre simplicité et fiabilité.
Questions fréquentes sur le Pub/Sub
Quelle est la différence entre Pub/Sub et une message queue ?
En Pub/Sub, un message est diffusé à tous les subscribers abonnés au topic (fanout). En message queue, chaque message est consommé par un seul consommateur (load balancing). Le Pub/Sub est conçu pour la diffusion d’événements à plusieurs services, la message queue pour la distribution de tâches. Les brokers modernes comme Kafka et RabbitMQ supportent les deux modèles.
Le Pub/Sub est-il adapté aux systèmes d’IA multi-agents ?
Oui, c’est même la solution recommandée. Les architectures event-driven avec Pub/Sub permettent aux agents IA de communiquer de manière asynchrone et découplée. Chaque agent publie des événements et s’abonne aux topics pertinents. Un nouvel agent peut rejoindre le système sans modifier les agents existants. Google, Confluent et Microsoft recommandent explicitement ce pattern pour les systèmes multi-agents.
Kafka est-il un système Pub/Sub ?
Kafka est plus qu’un simple Pub/Sub. C’est un log distribué qui combine les fonctionnalités du Pub/Sub (fanout via consumer groups multiples) et des message queues (load balancing au sein d’un consumer group). Sa particularité est la persistance : les messages sont stockés et peuvent être relus, contrairement au Pub/Sub classique où les messages sont supprimés après consommation.
Redis Pub/Sub est-il fiable pour la production ?
Redis Pub/Sub est rapide et simple, mais il ne persiste pas les messages. Si un subscriber est déconnecté, les messages sont perdus. Pour la production avec des garanties de livraison, utilisez Redis Streams (persistance + consumer groups), Kafka, ou un service managé comme Google Cloud Pub/Sub. Redis Pub/Sub reste pertinent pour les notifications temps réel non critiques et l’invalidation de cache.
Combien coûte Google Cloud Pub/Sub ?
Google Cloud Pub/Sub offre 10 Go gratuits par mois. Au-delà, le tarif est de $40 par TiB (environ $36 par To) pour le débit (publication et consommation). Le stockage de rétention est facturé séparément. Google a arrêté Pub/Sub Lite (la version low-cost) en mars 2026, orientant les utilisateurs vers le Pub/Sub standard ou vers Managed Service for Apache Kafka pour les gros volumes.