NATS Setup
NATS ist eine zentrale Komponente der Architektur. NATS ist ein verteiltes Messaging-System, welches häufig für Microservices verwendet wird.
Unser Backend (oder auch andere Systeme) publizieren Events in NATS, die dann beispielsweise in N8n über ein Trigger konsumiert werden.
Grundlegender Aufbau
NATS kann grob in zwei Varianten unterteilt werden, NATS Core und NATS JetStream.
NATS Core ist das Grundsystem von NATS und bietet schnelle, leichtgewichtige Kommunikationsmöglichkeiten wie Publish/Subscribe, Request/Reply und Queueing. Dabei werden Nachrichten in der Regel nur flüchtig übertragen: Geht ein Empfänger offline, gehen die Nachrichten verloren. Der Fokus liegt auf extrem niedriger Latenz und hoher Performance.
NATS JetStream erweitert NATS Core um Funktionen wie Persistenz, wiederholtes Lesen von Nachrichten und zeitversetzte Verarbeitung. Nachrichten können gespeichert werden, was eine zuverlässige Zustellung, Wiederholungen und komplexe Workflows ermöglicht. JetStream ist damit besonders geeignet für Szenarien, in denen eine dauerhafte Verarbeitung oder Event-Sourcing erforderlich ist, während Core eher für schnelle, vorübergehende Nachrichtenübertragung optimiert ist.
JetStream konfiguration
In unserem Fall ist Persistenz auch bei einem zeitweisen Ausfall der Internetverbindung im Makerspace notwendig, sodass wir JetStream mit Message Retention verwenden. Dabei müssen die wichtigen Komponenten vorab angelegt werden.
NATS CLI konfigurieren
- Unterschied zwischen admin und jsadmin
- beschreiben wie man context switch macht
- wie man einen neuen context anlegt
nats context add mksp-jsadmin --server ds-hetzner.mksp-da.de:4222 --description "MKSP NATS JetStream" --tlscert /path/to/jsadmin.mksp-da.de.crt --tlskey /path/to/jsadmin.mksp-da.de.key --tlsca /path/to/mksp_root_x1_ca.crt
nats context select mksp-jsadmin
JetStream initialisieren
JetStream ist in so genannte Streams unterteilt, welche bestimmte Subjects in einem Stream zusammenfassen. Wir nutzen für alle Events einen gemeinsamen Präfix (mksp), sodass wir den Stream hierfür erstellen. Die NATS Dokumentation selbst beschreibt die Konzepte sehr gut:
- JetStream im Allgemeinen: https://docs.nats.io/nats-concepts/jetstream
- JetStream Streams: https://docs.nats.io/nats-concepts/jetstream/streams
Wir legen nun also ein Stream namens backend_events an:
JetStream Consumer
Consumer sind eine Auswahl / Ansicht von Teilen eines Streams. Details finden sich wieder in der NATS Dokumentation: https://docs.nats.io/nats-concepts/jetstream/consumers
Consumer können entweder persistent sein (dauerhaft, ein Client kann dann den bestehenden Consumer neben) oder flüchtig (ephemeral), in diesem Fall wird der Consumer beim Erstellen des Clients (beispielsweise durch N8n) angelegt. In der Regel werden Consumer durch einen Filter auf bestimmte Subjects beschränkt, diese dürfen sich nicht überschneiden.
Troubleshooting
JetStream
$ nats stream ls
╭─────────────────────────────────────────────────────────────────────────────────────╮
│ Streams │
├────────────────┬─────────────┬─────────────────────┬──────────┬──────┬──────────────┤
│ Name │ Description │ Created │ Messages │ Size │ Last Message │
├────────────────┼─────────────┼─────────────────────┼──────────┼──────┼──────────────┤
│ backend_events │ │ 2025-09-08 08:36:19 │ 0 │ 0 B │ never │
Sys
$ nats server report connections
╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Top 5 Connections out of 5 by subs │
├─────┬──────────────────────────┬──────────────┬─────────┬───────────────────┬─────────┬────────┬─────────┬──────────┬──────────┬───────────┬──────┤
│ CID │ Name │ Server │ Cluster │ IP │ Account │ Uptime │ In Msgs │ Out Msgs │ In Bytes │ Out Bytes │ Subs │
├─────┼──────────────────────────┼──────────────┼─────────┼───────────────────┼─────────┼────────┼─────────┼──────────┼──────────┼───────────┼──────┤
│ 10 │ │ mksp-nats-01 │ │ 172.18.0.37:47950 │ MKSP │ 18m7s │ 0 │ 0 │ 0 B │ 0 B │ 0 │
│ 12 │ │ mksp-nats-01 │ │ 172.18.0.39:46446 │ MKSP │ 18m7s │ 10 │ 0 │ 4.5 KiB │ 0 B │ 0 │
│ 9 │ │ mksp-nats-01 │ │ 172.18.0.37:47934 │ MKSP │ 18m7s │ 0 │ 0 │ 0 B │ 0 B │ 1 │
│ 11 │ │ mksp-nats-01 │ │ 172.18.0.33:37156 │ MKSP │ 18m7s │ 0 │ 10 │ 0 B │ 4.5 KiB │ 1 │
│ 22 │ NATS CLI Version 0.2.4 │ mksp-nats-01 │ │ 10.1.253.1:60153 │ SYS │ 0s │ 2 │ 1 │ 210 B │ 933 B │ 1 │
├─────┼──────────────────────────┼──────────────┼─────────┼───────────────────┼─────────┼────────┼─────────┼──────────┼──────────┼───────────┼──────┤
│ │ Totals for 5 connections │ │ │ │ │ │ 12 │ 11 │ 4.8 KiB │ 5.5 KiB │ 3 │
╰─────┴──────────────────────────┴──────────────┴─────────┴───────────────────┴─────────┴────────┴─────────┴──────────┴──────────┴───────────┴──────╯
╭──────────────────────────────────────╮
│ Connections per server │
├──────────────┬─────────┬─────────────┤
│ Server │ Cluster │ Connections │
├──────────────┼─────────┼─────────────┤
│ mksp-nats-01 │ │ 5 │
╰──────────────┴─────────┴─────────────╯