Zum Inhalt springen
Deutsch

Konfiguration

actor-ts verwendet HOCON zur Konfiguration — eine Obermenge von JSON, die in JVM-Config-Dateien üblich ist, mit Substitutionen, Durations, Sizes und Includes. Drei Schichten, von oben nach unten aufgelöst:

  1. Konstruktor-Argumente an ActorSystem.create(name, settings) — explizite Code-Overrides.
  2. Nutzer-Configapplication.conf im Projekt-Root, oder ein expliziter Pfad via configFile, oder ein inline config-Objekt in den Settings.
  3. Reference-Defaults — im Framework gebündelt als REFERENCE_CONF (siehe src/config/reference.ts).

Alles, was nicht in Schicht 1 oder 2 spezifiziert ist, fällt auf den Reference-Default zurück.

actor-ts {
system { name = "my-app" }
logger { level = "info" }
dispatcher {
default = "immediate" # immediate | microtask | throughput
throughput = 16
}
cluster {
gossip-interval = 1s
seed-retry-interval = 3s
failure-detector {
heartbeat-interval = 500ms
unreachable-after = 2s
down-after = 5s
}
}
remote {
transport = "tcp"
tcp {
hostname = "0.0.0.0"
port = ${?ACTOR_TS_PORT} # Env-Var-Substitution; fällt auf Default zurück
}
max-frame-size = 1M
}
persistence {
journal { plugin = "actor-ts.persistence.journal.in-memory" }
snapshot-store { plugin = "actor-ts.persistence.snapshot-store.in-memory" }
}
sharding {
number-of-shards = 64
rebalance-interval = 2s
remember-entities = false
}
}

Platziere das im Projekt-Root. Das Framework lädt es bei ActorSystem.create automatisch.

KeyDefaultZweck
system.name"default"Systemname — verwendet in Actor-Pfaden und zur Cluster-Identifikation.
KeyDefaultZweck
logger.level"info"Einer von debug / info / warn / error / off.
KeyDefaultZweck
dispatcher.default"immediate"immediate (Default) / microtask / throughput.
dispatcher.throughput16Nachrichten, die ein ThroughputDispatcher verarbeitet, bevor er nachgibt.
KeyDefaultZweck
cluster.gossip-interval1sWie oft Gossip mit einem zufälligen Peer ausgetauscht wird.
cluster.seed-retry-interval3sWie oft Seed-Verbindungen während des Joins wiederholt werden.
cluster.leader-election"lowest-address"Strategie zur Auswahl eines neuen Leaders.
cluster.failure-detector.heartbeat-interval500msWie oft Heartbeats gesendet werden.
cluster.failure-detector.unreachable-after2sVerdachtsschwelle für unreachable-Status.
cluster.failure-detector.down-after5sVerdachtsschwelle für erzwungenes Down.
KeyDefaultZweck
remote.transport"tcp"Derzeit nur "tcp" und der In-Memory-Test-Transport.
remote.tcp.hostname"0.0.0.0"TCP-Bind-Adresse.
remote.tcp.port2552TCP-Bind-Port.
remote.tls.enabledfalseTLS auf dem Cluster-Transport umschalten.
remote.max-frame-size1MMaximal erlaubte Wire-Frame-Größe.
KeyDefaultZweck
http.backend"fastify"Einer von fastify / bun / express.
http.shutdown-grace-period5sZeit, um in-flight Requests beim Shutdown leerlaufen zu lassen.
KeyDefaultZweck
persistence.journal.plugin"...in-memory"Voll qualifizierter Key zur Konfig des Journals.
persistence.snapshot-store.plugin"...in-memory"Voll qualifizierter Key zur Konfig des Snapshot Stores.
persistence.recovery.mode"eager"eager (Default) — alle Events bei preStart wieder abspielen. parallel — in Chunks wieder abspielen.

Die Plugin-Keys zeigen auf einen anderen Config-Abschnitt, der die Settings dieses Plugins enthält. Z. B. enthält actor-ts.persistence.journal.sqlite die path, pragmas etc. des SQLite-Journals. Siehe jede Journal-Seite in Persistence für die per-Plugin-Keys.

KeyDefaultZweck
sharding.number-of-shards64In wie viele Shards der Entity-Raum geteilt wird.
sharding.rebalance-interval2sAbstand zwischen koordinator-getriebenen Rebalance-Passes.
sharding.hand-off-timeout10sWie lange auf HandOffComplete gewartet wird, bevor zwangsumverteilt wird.
sharding.remember-entitiesfalsePersistiere die Menge aktiver Entity-IDs.
sharding.passivation-idle0msAuto-Passiviere eine Entität nach diesem Idle-Fenster. 0 = deaktiviert.
KeyDefaultZweck
coordinated-shutdown.default-phase-timeout5sDefault-Timeout pro Phase.
coordinated-shutdown.terminate-actor-systemtrueOb in der finalen Phase system.terminate() aufgerufen wird.
coordinated-shutdown.exit-jvmfalseOb nach dem Shutdown process.exit() aufgerufen wird.
KeyDefaultZweck
worker.count"auto"Anzahl Worker — "auto" verwendet navigator.hardwareConcurrency.
worker.restart-policy"on-failure"always / on-failure / never.

Jeder Broker-Actor liest aus seinem eigenen Subtree. Siehe die per-Protokoll-Seiten für die Keys:

SubtreeSeite
io.broker.kafkaKafka
io.broker.mqttMQTT
io.broker.amqpAMQP
io.broker.natsNATS
io.broker.jetstreamJetStream (gleiche Seite, JetStream-Variante)
io.broker.redis-streamsRedis Streams
io.broker.grpc.{client,server}gRPC
io.broker.websocketWebSocket Client
io.broker.sseSSE
io.broker.tcpTCP
io.broker.udpUDP
gossip-interval = 1s # 1000 ms
unreachable-after = 2.5s # 2500 ms
down-after = 5000ms # explizite ms
gc-cadence = 10m # Minuten
ttl = 24h # Stunden

Erkannte Einheiten: ns, us, ms, s, m, h, d.

max-frame-size = 1M # 1 048 576 Bytes
buffer = 64K
heap = 2G

Erkannte Einheiten: B, K, M, G, T — standardmäßig binär (1024).

port = ${?ACTOR_TS_PORT} # nutze env, falls gesetzt, sonst fallback
log-level = ${?LOG_LEVEL} # gleich
api-key = ${API_KEY} # required — Fehler, wenn env nicht gesetzt
fallback-port = ${?ENV_PORT}
fallback-port = ${fallback-port:-2552} # default-if-empty Syntax

Verwende ${?ENV} für optional, ${ENV} für required.

include "shared-cluster.conf"
actor-ts.cluster.failure-detector.heartbeat-interval = 250ms

Lädt shared-cluster.conf und legt Deinen lokalen Abschnitt darüber.

const system = ActorSystem.create('my-app', {
config: {
'actor-ts.cluster.gossip-interval': '500ms',
},
});
// Innerhalb eines Actors / einer Extension:
const cfg = system.config;
const interval = cfg.getDuration('actor-ts.cluster.gossip-interval');
// → 500 (in ms)

Das Config-Interface hat typisierte Getter: getString, getNumber, getBoolean, getDuration, getSize, getStringList, etc. Fehlende Keys werfen, es sei denn, Du prüfst zuerst mit hasPath.

1. REFERENCE_CONF ← gebündelte Defaults
2. application.conf (CWD) ← Projekt-Root, auto-geladen
3. Dateipfad aus `configFile`-Setting ← expliziter Override
4. ENV-Var ACTOR_TS_CONFIG ← Pfad oder inline HOCON
5. Konstruktor `config: { ... }` ← Code-Level-Override
6. Konstruktor-Feld-Overrides ← explizite Felder schlagen Config
(logLevel, dispatcher, scheduler, …)

Jede Schicht überlagert die vorherige. Schicht 6 (Konstruktor-Felder) gewinnt immer für die Felder, die sie abdeckt; alles andere fließt durch den HOCON-Merge.