TL;DR — Kurzzusammenfassung

NATS liefert ultraschnelles Cloud-Native-Messaging und dauerhaftes Streaming. Lernen Sie Pub/Sub, JetStream, KV-Store, Clustering und Auth in der Praxis.

NATS ist eine Verbindungstechnologie für cloud-native Anwendungen. Ein einzelnes Binary ohne Abhängigkeiten, das Millionen von Nachrichten pro Sekunde mit Sub-Millisekunden-Latenz verarbeitet — und JetStream für dauerhaftes Streaming, Key-Value-Speicherung und Object Store auf derselben Infrastruktur hinzufügt.

Voraussetzungen

  • Docker oder ein Linux-Host mit wget/curl.
  • Das nats-CLI: curl -sf https://binaries.nats.dev/nats-io/natscli/nats@latest | sh
  • Grundkenntnisse über Publish/Subscribe-Messaging-Konzepte.
  • Für Kubernetes: Helm 3 und ein laufendes Cluster.

Schritt 1: nats-server installieren

Docker (schnellste Methode)

docker run -d --name nats \
  -p 4222:4222 -p 8222:8222 \
  nats:latest -js -m 8222

nats server ping

Binary (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

Schritt 2: Core NATS — Pub/Sub, Request/Reply und Queue-Gruppen

Core NATS ist At-most-once: Nachrichten werden nur an aktive Abonnenten zugestellt. Es ist schnell, weil kein Persistenz-Overhead vorhanden ist.

Subjekt-basierte Adressierung

Subjekte sind hierarchische, durch Punkte getrennte Zeichenketten:

TokenEntsprichtBeispiel
*Einzelnes Tokenorders.*.placed entspricht orders.eu.placed
>Alle verbleibenden Tokenorders.> entspricht orders.eu.placed, orders.us.updated
# Terminal 1 — abonnieren
nats sub "orders.>"

# Terminal 2 — veröffentlichen
nats pub orders.us.placed '{"id":"1001","betrag":99.00}'

Queue-Gruppen — Lastverteilung

nats sub --queue verarbeiter "orders.>"   # Terminal 1
nats sub --queue verarbeiter "orders.>"   # Terminal 2
nats pub orders.us.placed '{"id":"1003"}'

Request/Reply-Muster

# Dienst (Antwortseite)
nats reply "lager.pruefen" '{"verfuegbar": true, "menge": 42}'

# Client (Anforderungsseite)
nats request "lager.pruefen" '{"sku":"WIDGET-A"}'

Schritt 3: JetStream — Dauerhaftes Streaming

JetStream speichert Nachrichten in Streams. Ein Stream erfasst Nachrichten, die einem oder mehreren Subjekten entsprechen, und behält sie gemäß einer Aufbewahrungsrichtlinie.

Einen Stream erstellen

nats stream add BESTELLUNGEN \
  --subjects "orders.>" \
  --storage file \
  --retention limits \
  --max-msgs 1000000 \
  --max-age 7d \
  --replicas 3

Speicher-Backends:

BackendAnwendungsfall
filePersistenz über Neustarts hinaus, große Datensätze
memoryUltra-niedrige Latenz, cache-ähnliche Workloads

Aufbewahrungsrichtlinien:

RichtlinieVerhalten
limitsBeibehaltung bis Größen-/Alters-/Mengenlimits erreicht
interestBeibehaltung solange mindestens ein Consumer existiert
workqueueLöscht jede Nachricht nach Bestätigung durch einen Consumer

Push- vs. Pull-Consumer

# Dauerhafter Push-Consumer
nats consumer add BESTELLUNGEN fulfillment \
  --deliver-subject fulfillment.worker \
  --ack explicit --durable fulfillment

# Dauerhafter Pull-Consumer
nats consumer add BESTELLUNGEN rechnungsstellung \
  --pull --ack explicit --durable rechnungsstellung

# Batch von 10 Nachrichten abrufen
nats consumer next BESTELLUNGEN rechnungsstellung --count 10

Exactly-Once-Zustellung — Deduplizierung

nats pub orders.us.placed \
  --header "Nats-Msg-Id: txn-abc-123" \
  '{"id":"1004","betrag":200}'

nats stream edit BESTELLUNGEN --dupe-window 5m

Dead Letter — Max Deliver

nats stream add DLQ \
  --subjects "\$JS.EVENT.ADVISORY.CONSUMER.MAX_DELIVERIES.BESTELLUNGEN.*" \
  --storage file --retention limits

Schritt 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

Schritt 5: Object Store

nats object add ARTEFAKTE --replicas 3
nats object put ARTEFAKTE ./modell-v2.bin
nats object get ARTEFAKTE modell-v2.bin ./heruntergeladenes-modell.bin

Schritt 6: Authentifizierung und Autorisierung

Token (einfachste Methode)

nats-server --auth meinGeheimerToken
nats pub subjekt msg --server nats://meinGeheimerToken@localhost:4222

Dezentralisiertes JWT mit nsc

nsc add operator MeineOrg
nsc add account AppA
nsc add user -a AppA alice
nsc generate creds -a AppA -n alice > alice.creds
nats pub subjekt msg --creds alice.creds

Schritt 7: Clustering und Leaf-Nodes

3-Knoten-Cluster-Konfiguration

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 für Edge-Konnektivität

port: 4222
leafnodes {
  remotes: [{ url: "nats://hub-cluster:7422" }]
}

Schritt 8: Monitoring

curl http://localhost:8222/varz | jq .
curl http://localhost:8222/connz | jq .

Prometheus-Metriken

docker run -d --name surveyor \
  -p 7777:7777 \
  natsio/nats-surveyor:latest \
  --servers nats://nats:4222 --port 7777

Fügen Sie http://surveyor:7777/metrics als Prometheus-Scrape-Ziel hinzu. Importieren Sie das NATS-Grafana-Dashboard (ID 14725).


NATS vs. Alternativen

MerkmalNATS+JetStreamKafkaRabbitMQRedis Pub/SubPulsarMQTT
LatenzSub-msNiedrige msNiedrige msSub-msNiedrige msSub-ms
DurchsatzSehr hochSehr hochHochHochSehr hochMittel
PersistenzJetStreamJaJaNeinJaOptional
Exactly-onceDedup-FensterTransaktionenNeinNeinJaNein
Request/Reply nativJaNeinNeinNeinNeinNein
KV StoreIntegriertNeinNeinExternNeinNein
Operative KomplexitätGeringHochMittelGeringHochGering
Edge/IoTLeaf-NodesNeinBegrenztNeinNeinJa

Praktisches Microservices-Beispiel

# 1. Bestellungs-Stream erstellen
nats stream add BESTELLUNGEN --subjects "orders.>" --storage file --replicas 1

# 2. Lagerdienst beantwortet Prüfungen
nats reply "lager.pruefen" '{"verfuegbar":true}'

# 3. Bestellung zur dauerhaften Verarbeitung veröffentlichen
nats pub orders.us.placed \
  --header "Nats-Msg-Id: $(uuidgen)" \
  '{"id":"2001","sku":"WIDGET-A","menge":5}'

# 4. Fulfillment-Worker zieht vom JetStream-Consumer
nats consumer add BESTELLUNGEN fulfillment --pull --ack explicit --durable fulfillment
nats consumer next BESTELLUNGEN fulfillment --count 5

# 5. Status im KV speichern
nats kv put BESTELLUNGEN "2001" '{"status":"erfuellt","ts":"2026-03-23T10:00:00Z"}'

Fallstricke und Grenzfälle

  • JetStream ist standardmäßig nicht aktiviert. Übergeben Sie immer --jetstream oder konfigurieren Sie jetstream: {}.
  • Replikate erfordern eine ungerade Anzahl von Knoten. Ein 2-Knoten-JetStream-Cluster kann nach einem Ausfall keinen Meta-Leader wählen.
  • interest-Aufbewahrung ohne Consumer löscht Nachrichten sofort. Erstellen Sie den Consumer vor dem Veröffentlichen.
  • Pull-Consumer benötigen explizite Acks. Setzen Sie max_deliver auf einen endlichen Wert.
  • Monitoring-Port 8222 ist standardmäßig nicht authentifiziert. Sichern Sie ihn mit einer Firewall.

Zusammenfassung

  • NATS Core = At-most-once Pub/Sub, Request/Reply, Queue-Gruppen — keine Konfiguration, Sub-ms-Latenz.
  • JetStream fügt Persistenz, At-least-once/Exactly-once-Zustellung, Consumer, KV und Object Store hinzu.
  • Verwenden Sie Pull-Consumer für Worker-Queues; Push für Event-Fans.
  • 3-Knoten-Cluster sind das Minimum für JetStream HA; Leaf-Nodes erweitern auf den Edge.
  • Überwachen Sie mit dem HTTP-Endpunkt /varz, nats-surveyor und Grafana.

Verwandte Artikel