Zum Inhalt springen
Deutsch

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),
},
});
interface NatsActorSettings extends BrokerCommonSettings {
servers: string[] | string;
name?: string; // Client-Identifier
user?: string;
pass?: string;
token?: string;
tls?: TlsOptions;
pingInterval?: number; // Default 120s
}

NATS nutzt mit . getrennte Subjects:

events.user.signup
events.user.delete
orders.priority.placed
metrics.gauge.cpu

Subjects sind case-sensitive; per Konvention kleinbuchstabig + punktgetrennt.

WildcardTrifft
*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.

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.

Drei primäre Anwendungsfälle:

  1. Hochvolumiges Pub/Sub ohne die operative Komplexität von Kafka.
  2. Microservice-Request/Reply — synchrone Calls zwischen Services über Subjects.
  3. 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.

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”.

Terminal-Fenster
npm install nats
# oder: bun add nats

Das Paket nats enthält sowohl Core-NATS- als auch JetStream- Clients.