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 connectionsist 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 3in einem Cluster, sonst ist ein Knotenausfall ein Datenverlust. - Aufbewahrung bewusst wählen:
limits(Zeit, Anzahl, Größe),interest(nur solange Interesse besteht) undworkqueue(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.