NATS
NatsActor integriert mit NATS — dem leichtgewichtigen Pub/Sub-
Broker. Core-NATS ist Fire-and-Forget ohne Durability; für
durable Streams siehe die JetStream-Variante.
import { ActorSystem, Props, NatsActor } from 'actor-ts';
const nats = system.spawn( Props.create(() => new NatsActor({ servers: ['nats://nats-1:4222', 'nats://nats-2:4222'], name: 'my-app', })), 'nats',);
// Subscribieren (Wildcards unterstützt):nats.tell({ kind: 'subscribe', subject: 'events.>', target: eventHandler,});
// Publishen:nats.tell({ kind: 'publish', publish: { subject: 'events.user.signup', payload: JSON.stringify(event), },});Settings
Abschnitt betitelt „Settings“interface NatsActorSettings extends BrokerCommonSettings { servers: string[] | string; name?: string; // Client-Identifier user?: string; pass?: string; token?: string; tls?: TlsOptions; pingInterval?: number; // Default 120s}Subjects (NATS-Topics)
Abschnitt betitelt „Subjects (NATS-Topics)“NATS nutzt mit . getrennte Subjects:
events.user.signupevents.user.deleteorders.priority.placedmetrics.gauge.cpuSubjects sind case-sensitive; per Konvention kleinbuchstabig + punktgetrennt.
Wildcards
Abschnitt betitelt „Wildcards“| Wildcard | Trifft |
|---|---|
* | Genau ein Token (trifft user in events.user.signup). |
> | Ein oder mehr Tokens (trifft user.signup in events.user.signup). |
'events.>' → events.user.signup, events.user.delete, events.order.placed'events.*.signup' → events.user.signup, events.admin.signup> darf nur als letztes Token vorkommen.
Request / Reply
Abschnitt betitelt „Request / Reply“NATS unterstützt synchrones Request/Reply nativ:
nats.tell({ kind: 'request', subject: 'account.balance', payload: JSON.stringify({ accountId: '42' }), timeoutMs: 1_000, replyTo: this.self, // bekommt die Reply-Nachricht});
// Reply-Handler:override onReceive(msg: NatsRequestReply): void { if (msg.kind === 'reply') this.handleBalance(JSON.parse(...)); if (msg.kind === 'timeout') this.handleTimeout();}Das ist schnell — ein paar hundert Mikrosekunden Round-Trip auf localhost. Wird viel als “RPC über NATS”-Muster genutzt.
Wann NATS
Abschnitt betitelt „Wann NATS“Drei primäre Anwendungsfälle:
- Hochvolumiges Pub/Sub ohne die operative Komplexität von Kafka.
- Microservice-Request/Reply — synchrone Calls zwischen Services über Subjects.
- Leichtgewichtige Event-Verteilung — Fire-and-Forget- Benachrichtigungen, Metriken, Log-Streams.
Für durable Streams (Replay, Historie, ACK-Semantik) siehe JetStream unten. Für clusterinternes Pub/Sub ist DistributedPubSub einfacher.
JetStream
Abschnitt betitelt „JetStream“Für NATS mit Durability nimm JetStreamActor:
import { JetStreamActor } from 'actor-ts';
const js = system.spawn( Props.create(() => new JetStreamActor({ servers: ['nats://nats-1:4222'], streams: [ { name: 'ORDERS', subjects: ['orders.>'], storage: 'file', maxAge: 86_400 * 7, // 7 Tage Retention }, ], })), 'js',);JetStream-Schichten:
- Stream — durables Log, Subjects → Records.
- Consumer — Lese-Cursor; mehrere Consumer können denselben Stream unabhängig lesen.
- ACK-Semantik — wie bei AMQP acken Consumer jede Nachricht.
Nimm JetStream, wenn du brauchst:
- Replay — Consumer können zu beliebigen Offsets zurückspulen.
- Persistenz — überlebt Broker-Neustarts (dateibasierter Storage).
- Geordneter Konsum pro Subject.
Kafka schlägt JetStream weiterhin bei massiver Skalierung (Milliarden Events/s über Hunderte Partitionen). JetStream ist der Sweet Spot für “weniger als Kafka, mehr als Core-NATS”.
Peer-Dependency
Abschnitt betitelt „Peer-Dependency“npm install nats# oder: bun add natsDas Paket nats enthält sowohl Core-NATS- als auch JetStream-
Clients.
Wohin als Nächstes
Abschnitt betitelt „Wohin als Nächstes“- I/O-Übersicht — das große Bild.
- BrokerActor-Basis — der gemeinsame Lifecycle.
- Kafka — schwereres durables Streaming.
- MQTT — IoT-fokussierte Alternative.
- DistributedPubSub — für clusterinternes Pub/Sub.