TL;DR — Résumé Rapide
NATS offre messagerie cloud-native ultra-rapide et streaming durable. Maîtrisez pub/sub, JetStream, KV store, clustering et authentification pour microservices.
NATS est une technologie de connectivité conçue pour les applications cloud-native. Un binaire unique sans dépendances qui traite des millions de messages par seconde avec des latences sub-milliseconde — et ajoute JetStream pour le streaming durable, le stockage Key-Value et l’Object Store sur la même infrastructure.
Prérequis
- Docker ou un hôte Linux avec wget/curl.
- Le CLI
nats:curl -sf https://binaries.nats.dev/nats-io/natscli/nats@latest | sh - Familiarité de base avec les concepts de messagerie publish/subscribe.
- Pour Kubernetes : Helm 3 et un cluster opérationnel.
Étape 1 : Installer nats-server
Docker (plus rapide)
docker run -d --name nats \
-p 4222:4222 -p 8222:8222 \
nats:latest -js -m 8222
nats server ping
Binaire (Linux)
curl -L https://github.com/nats-io/nats-server/releases/latest/download/nats-server-v2.10.14-linux-amd64.zip -o nats.zip
unzip nats.zip && sudo mv nats-server /usr/local/bin/
nats-server --jetstream --http_port 8222
Kubernetes (Helm)
helm repo add nats https://nats-io.github.io/k8s/helm/charts/
helm install nats nats/nats \
--set config.jetstream.enabled=true \
--set config.cluster.enabled=true \
--set replicaCount=3
Étape 2 : NATS Core — Pub/Sub, Request/Reply et Groupes de Files
NATS core est at-most-once : les messages ne sont livrés qu’aux abonnés actifs. Il est rapide car il n’y a pas de surcharge de persistance.
Adressage Basé sur les Sujets
Les sujets sont des chaînes hiérarchiques délimitées par des points :
| Token | Correspond à | Exemple |
|---|---|---|
* | Un seul token | orders.*.placed correspond à orders.eu.placed |
> | Tous les tokens restants | orders.> correspond à orders.eu.placed, orders.us.updated |
# Terminal 1 — s'abonner
nats sub "orders.>"
# Terminal 2 — publier
nats pub orders.us.placed '{"id":"1001","montant":99.00}'
Groupes de Files — Équilibrage de Charge
nats sub --queue traiteurs "orders.>" # terminal 1
nats sub --queue traiteurs "orders.>" # terminal 2
nats pub orders.us.placed '{"id":"1003"}'
Pattern Request/Reply
# Service (côté réponse)
nats reply "stock.verifier" '{"disponible": true, "qte": 42}'
# Client (côté requête)
nats request "stock.verifier" '{"sku":"WIDGET-A"}'
Étape 3 : JetStream — Streaming Durable
JetStream stocke les messages dans des streams. Un stream capture les messages correspondant à un ou plusieurs sujets et les conserve selon une politique de rétention.
Créer un Stream
nats stream add COMMANDES \
--subjects "orders.>" \
--storage file \
--retention limits \
--max-msgs 1000000 \
--max-age 7d \
--replicas 3
Backends de stockage :
| Backend | Cas d’utilisation |
|---|---|
file | Persistance entre redémarrages, grands ensembles de données |
memory | Latence ultra-faible, charges de travail de type cache |
Politiques de rétention :
| Politique | Comportement |
|---|---|
limits | Conserve jusqu’aux limites de taille/âge/quantité |
interest | Conserve tant qu’au moins un consumer existe |
workqueue | Supprime chaque message après acquittement par un consumer |
Consumers Push vs Pull
# Consumer push durable
nats consumer add COMMANDES fulfillment \
--deliver-subject fulfillment.worker \
--ack explicit --durable fulfillment
# Consumer pull durable
nats consumer add COMMANDES facturation \
--pull --ack explicit --durable facturation
# Récupérer un lot de 10 messages
nats consumer next COMMANDES facturation --count 10
Livraison Exactly-Once — Déduplication
nats pub orders.us.placed \
--header "Nats-Msg-Id: txn-abc-123" \
'{"id":"1004","montant":200}'
nats stream edit COMMANDES --dupe-window 5m
Dead Letter — Max Deliver
nats stream add DLQ \
--subjects "\$JS.EVENT.ADVISORY.CONSUMER.MAX_DELIVERIES.COMMANDES.*" \
--storage file --retention limits
Étape 4 : Key-Value Store
nats kv add CONFIG --history 10 --ttl 24h
nats kv put CONFIG db_url "postgres://prod-db:5432/app"
nats kv get CONFIG db_url
nats kv watch CONFIG
Étape 5 : Object Store
nats object add ARTEFACTS --replicas 3
nats object put ARTEFACTS ./modele-v2.bin
nats object get ARTEFACTS modele-v2.bin ./modele-telecharge.bin
Étape 6 : Authentification et Autorisation
Token (le plus simple)
nats-server --auth monTokenSecret
nats pub sujet msg --server nats://monTokenSecret@localhost:4222
JWT Décentralisé avec nsc
nsc add operator MonOrg
nsc add account AppA
nsc add user -a AppA alice
nsc generate creds -a AppA -n alice > alice.creds
nats pub sujet msg --creds alice.creds
Étape 7 : Clustering et Leaf Nodes
Configuration d’un Cluster de 3 Nœuds
port: 4222
server_name: n1
jetstream: { store_dir: /data/nats }
cluster {
name: prod
port: 6222
routes: [
nats-route://nats-2:6222
nats-route://nats-3:6222
]
}
nats server report jetstream
nats server list
Leaf Nodes pour la Connectivité en Périphérie
port: 4222
leafnodes {
remotes: [{ url: "nats://hub-cluster:7422" }]
}
Étape 8 : Surveillance
curl http://localhost:8222/varz | jq .
curl http://localhost:8222/connz | jq .
Métriques Prometheus
docker run -d --name surveyor \
-p 7777:7777 \
natsio/nats-surveyor:latest \
--servers nats://nats:4222 --port 7777
Ajoutez http://surveyor:7777/metrics comme cible de scrape Prometheus. Importez le dashboard Grafana NATS (ID 14725).
NATS vs Alternatives
| Fonctionnalité | NATS+JetStream | Kafka | RabbitMQ | Redis Pub/Sub | Pulsar | MQTT |
|---|---|---|---|---|---|---|
| Latence | Sub-ms | ms faible | ms faible | Sub-ms | ms faible | Sub-ms |
| Débit | Très élevé | Très élevé | Élevé | Élevé | Très élevé | Moyen |
| Persistance | JetStream | Oui | Oui | Non | Oui | Optionnelle |
| Exactly-once | Fenêtre dedup | Transactions | Non | Non | Oui | Non |
| Request/Reply natif | Oui | Non | Non | Non | Non | Non |
| KV Store | Intégré | Non | Non | Externe | Non | Non |
| Complexité opérationnelle | Faible | Élevée | Moyenne | Faible | Élevée | Faible |
| Périphérie/IoT | Leaf nodes | Non | Limité | Non | Non | Oui |
Exemple Pratique de Microservices
# 1. Créer le stream de commandes
nats stream add COMMANDES --subjects "orders.>" --storage file --replicas 1
# 2. Service de stock répond aux vérifications
nats reply "stock.verifier" '{"disponible":true}'
# 3. Publier une commande pour traitement durable
nats pub orders.us.placed \
--header "Nats-Msg-Id: $(uuidgen)" \
'{"id":"2001","sku":"WIDGET-A","qte":5}'
# 4. Worker de fulfillment extrait du consumer JetStream
nats consumer add COMMANDES fulfillment --pull --ack explicit --durable fulfillment
nats consumer next COMMANDES fulfillment --count 5
# 5. Stocker l'état dans le KV
nats kv put COMMANDES "2001" '{"statut":"accompli","ts":"2026-03-23T10:00:00Z"}'
Pièges et Cas Limites
- JetStream n’est pas activé par défaut. Passez toujours
--jetstreamou configurezjetstream: {}. - Les réplicas nécessitent un nombre impair de nœuds. Un cluster de 2 nœuds ne peut pas élire un méta-leader après une panne.
- La rétention
interestsans consumers supprime immédiatement les messages. Créez le consumer avant de publier. - Les consumers pull nécessitent des acks explicites. Configurez
max_deliveravec une valeur finie. - Le port de surveillance 8222 est non authentifié par défaut. Protégez-le avec un pare-feu.
Résumé
- NATS core = pub/sub at-most-once, request/reply, groupes de files — sans configuration, latence sub-ms.
- JetStream ajoute persistance, livraison at-least-once/exactly-once, consumers, KV et Object Store.
- Utilisez des consumers pull pour les files de workers ; push pour les fans d’événements.
- Les clusters de 3 nœuds sont le minimum pour la HA JetStream ; les leaf nodes étendent à la périphérie.
- Surveillez avec le point de terminaison HTTP
/varz, nats-surveyor et Grafana.