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 :

TokenCorrespond àExemple
*Un seul tokenorders.*.placed correspond à orders.eu.placed
>Tous les tokens restantsorders.> 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 :

BackendCas d’utilisation
filePersistance entre redémarrages, grands ensembles de données
memoryLatence ultra-faible, charges de travail de type cache

Politiques de rétention :

PolitiqueComportement
limitsConserve jusqu’aux limites de taille/âge/quantité
interestConserve tant qu’au moins un consumer existe
workqueueSupprime 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+JetStreamKafkaRabbitMQRedis Pub/SubPulsarMQTT
LatenceSub-msms faiblems faibleSub-msms faibleSub-ms
DébitTrès élevéTrès élevéÉlevéÉlevéTrès élevéMoyen
PersistanceJetStreamOuiOuiNonOuiOptionnelle
Exactly-onceFenêtre dedupTransactionsNonNonOuiNon
Request/Reply natifOuiNonNonNonNonNon
KV StoreIntégréNonNonExterneNonNon
Complexité opérationnelleFaibleÉlevéeMoyenneFaibleÉlevéeFaible
Périphérie/IoTLeaf nodesNonLimitéNonNonOui

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 --jetstream ou configurez jetstream: {}.
  • 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 interest sans consumers supprime immédiatement les messages. Créez le consumer avant de publier.
  • Les consumers pull nécessitent des acks explicites. Configurez max_deliver avec 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.

Articles Connexes