nats, nats-server und nats-top sind die Werkzeuge rund um NATS, ein schlankes Nachrichtensystem für Cloud- und Edge-Umgebungen. Kernthemen sind Subjects, Publish/Subscribe, JetStream und Monitoring.

Server starten und prüfen

# Einfacher Start
nats-server

# Mit JetStream und Monitoring
nats-server -js -m 8222 -c /etc/nats/server.conf

# Verbindung und Zustand prüfen
curl -s http://localhost:8222/varz | jq .
curl -s http://localhost:8222/connz | jq '.num_connections'
curl -s http://localhost:8222/jsz | jq '.streams, .consumers'

Subjects und Publish/Subscribe

# Zuhören (Subscribe)
nats sub "bestellungen.>"

# Publish
nats pub bestellungen.neu '{"id":1,"summe":42.90}'

# Mit Antwort erwarten (Request/Reply)
nats request service.rechnen '{"a":1,"b":2}'

# Subject-Hierarchie
#   bestellungen.*      genau eine Ebene
#   bestellungen.>      beliebig viele Ebenen

Das Subject-Modell ist der Kern: Punkte trennen Ebenen, * passt auf genau ein Token, > auf beliebig viele. Ein Abonnement auf bestellungen.*.bezahlt erhält Nachrichten für jede Region, aber nicht für Unterebenen.

JetStream: Persistenz und Zustellung

# Stream anlegen: Subjects, Aufbewahrung, Speicher
nats stream add BESTELLUNGEN \
  --subjects "bestellungen.>" \
  --storage file --retention limits \
  --max-age 7d --max-msgs 1000000 --replicas 3

nats stream ls
nats stream info BESTELLUNGEN
nats stream report

# Nachricht in einen Stream schreiben
nats pub bestellungen.neu '{"id":2}'

# Nachrichten ansehen
nats stream view BESTELLUNGEN --last 5

# Consumer anlegen
nats consumer add BESTELLUNGEN ARBEITER \
  --deliver all --pull --ack explicit --max-deliver 5 --filter "bestellungen.*"

nats consumer ls BESTELLUNGEN
nats consumer info BESTELLUNGEN ARBEITER

Für den Betrieb sind drei Parameter entscheidend: --ack explicit verlangt eine ausdrückliche Bestätigung, --max-deliver begrenzt Zustellversuche und --filter schränkt den Consumer auf einen Teil der Subjects ein. Wird die Anzahl der Zustellversuche überschritten, kann eine Nachricht in einen eigenen Fehler-Stream (dead letter) wandern – das ist die Stelle, an der verlorene Nachrichten sichtbar werden.

Konsumieren und Nachrichten verwalten

# Mit dem CLI-Client konsumieren
nats consumer next BESTELLUNGEN ARBEITER --count 10

# Nachricht wiederherstellen/erneut zustellen
nats stream get BESTELLUNGEN 5
nats consumer rm BESTELLUNGEN ARBEITER

# Stream sichern und wiederherstellen
nats stream backup BESTELLUNGEN /backup/nats --check
nats stream restore /backup/nats

# Nachrichten löschen
nats stream purge BESTELLUNGEN --keep 1000   # nur die letzten 1000 behalten
nats stream purge BESTELLUNGEN --subject bestellungen.test

Accounts, Benutzer und Rechte

nats account add APP
nats account info APP

nats user add arbeiter --account APP
nats user info APP arbeiter

# Rechte über Konfigurationsdatei (Auszug)
# authorization {
#   users = [
#     { user: "arbeiter", password: "geheim"
#       permissions: { publish: "bestellungen.>", subscribe: "aufgaben.>" } }
#   ]
# }

Monitoring

nats-top                      # interaktive Übersicht
nats server ls
nats server info
nats server report connections
nats server ping

# Endpunkte der Monitoring-Schnittstelle
# /varz   Variablen und Statistik
# /connz  aktive Verbindungen
# /subsz  Abonnements
# /jsz    JetStream-Status

Praxis-Tipps

  • Reihenfolge und Verlust klären: Ohne JetStream ist NATS reines Pub/Sub – ist kein Abonnent angemeldet, ist die Nachricht weg. Für dauerhafte Aufgaben, Verarbeitung mit Wiederholung und Zustellgarantien braucht es JetStream.
  • nats server report connections ist die erste Diagnose: Es zeigt, welcher Client wie viele Verbindungen hält und wie viel Datenverkehr erzeugt. Ein Client mit tausenden Verbindungen ist meist ein Fehler in der Ressourcenverwaltung.
  • Streams mit Replikation anlegen: --replicas 3 in einem Cluster, sonst ist ein Knotenausfall ein Datenverlust.
  • Aufbewahrung bewusst wählen: limits (Zeit, Anzahl, Größe), interest (nur solange Interesse besteht) und workqueue (jede Nachricht genau einmal) haben sehr unterschiedliches Verhalten. Die Wahl entscheidet über Datenhaltung und Zustellmuster.

Verwandte Grundlagen: Message Queue, Ereignisgesteuerte Architektur, Message Broker, RabbitMQ-Befehle.