Wiki-Quellcode von NATS Setup

Version 1.1 von Daniel Herrmann am 2025/09/08 08:42

Verstecke letzte Bearbeiter
Daniel Herrmann 1.1 1 NATS ist eine zentrale Komponente der Architektur. NATS ist ein verteiltes Messaging-System, welches häufig für Microservices verwendet wird.
2
3 Unser Backend (oder auch andere Systeme) publizieren Events in NATS, die dann beispielsweise in N8n über ein Trigger konsumiert werden.
4
5 = {{id name="NATSSetup-GrundlegenderAufbau"/}}Grundlegender Aufbau =
6
7 NATS kann grob in zwei Varianten unterteilt werden, **NATS Core** und **NATS JetStream**.
8
9 (% style="" data-start="0" data-end="347" %)
10 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.
11
12 (% style="" data-start="349" data-end="822" data-is-last-node="" data-is-only-node="" %)
13 NATS JetStream erweitert NATS Core um Funktionen wie (% data-start="402" data-end="483" %)**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.
14
15 == {{id name="NATSSetup-JetStreamkonfiguration"/}}JetStream konfiguration ==
16
17 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.
18
19 === {{id name="NATSSetup-NATSCLIkonfigurieren"/}}NATS CLI konfigurieren ===
20
21 * Unterschied zwischen admin und jsadmin
22 * beschreiben wie man context switch macht
23 * wie man einen neuen context anlegt
24
25 {{code language="shell"}}
26 nats context add mksp-sysadmin --server ds-hetzner.mksp-da.de:4222 --description "MKSP NATS SYS Admin" --tlscert /path/to/admin.mksp-da.de.crt --tlskey /path/to/admin.mksp-da.de.key --tlsca /path/to/mksp_root_x1_ca.crt
27
28 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
29
30 nats context select mksp-jsadmin
31 {{/code}}
32
33 === {{id name="NATSSetup-JetStreaminitialisieren"/}}JetStream initialisieren ===
34
35 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:
36
37 * JetStream im Allgemeinen: [[https:~~/~~/docs.nats.io/nats-concepts/jetstream>>url:https://docs.nats.io/nats-concepts/jetstream||shape="rect"]]
38 * JetStream Streams: [[https:~~/~~/docs.nats.io/nats-concepts/jetstream/streams>>url:https://docs.nats.io/nats-concepts/jetstream/streams||shape="rect"]]
39
40 Wir legen nun also ein Stream namens **backend_events** an:
41
42 {{code language="shell"}}
43 nats stream add backend_events --subjects "mksp.>" --retention work --max-age 7d --storage file --defaults
44 {{/code}}
45
46 === {{id name="NATSSetup-JetStreamConsumer"/}}JetStream Consumer ===
47
48 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>>url:https://docs.nats.io/nats-concepts/jetstream/consumers||shape="rect"]]
49
50 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.