Zum Inhalt springen

Supervision

Der Supervisor verwaltet Dienstlebenszyklen, behandelt die Startreihenfolge, automatische Neustarts und kontrolliertes Herunterfahren. Dienste mit auto_start: true werden beim Anwendungsstart gestartet.

Dienste registrieren sich beim Supervisor mit einem lifecycle-Block. Für Prozesse verwenden Sie process.service um eine Prozessdefinition zu umhüllen:

# Prozessdefinition (der Code)
- name: worker_process
kind: process.lua
source: file://worker.lua
method: main
# Überwachter Dienst (umhüllt den Prozess mit Lebenszyklus-Verwaltung)
- name: worker
kind: process.service
process: app:worker_process
host: app:processes
lifecycle:
auto_start: true
start_timeout: 30s
stop_timeout: 10s
stable_threshold: 5s
depends_on:
- app:database
restart:
initial_delay: 2s
max_delay: 60s
max_attempts: 10
FeldStandardBeschreibung
auto_startfalseAutomatisch starten wenn Supervisor startet
start_timeout10sMaximale erlaubte Zeit für den Start
stop_timeout10sMaximale Zeit für Graceful Shutdown
stable_threshold5sLaufzeit bevor Dienst als stabil gilt
depends_on[]Dienste die zuerst laufen müssen

Der Supervisor löst Abhängigkeiten aus zwei Quellen auf:

  1. Explizite Abhängigkeiten deklariert in depends_on
  2. Registry-extrahierte Abhängigkeiten aus Entry-Referenzen (z.B. database: app:db in Ihrer Konfiguration)
graph LR
A[HTTP Server] --> B[Router]
B --> C[Handler Funktion]
C --> D[Datenbank]
C --> E[Cache]

Abhängigkeiten starten vor Abhängigen. Wenn Dienst C von A und B abhängt, müssen sowohl A als auch B den Running-Zustand erreichen, bevor C startet.

Sie müssen Infrastruktur-Einträge wie Datenbanken nicht in depends_on deklarieren. Der Supervisor extrahiert Abhängigkeiten automatisch aus Registry-Referenzen in Ihrer Entry-Konfiguration.

Wenn ein Dienst fehlschlägt, versucht der Supervisor es mit exponentiell steigender Wartezeit erneut:

lifecycle:
restart:
initial_delay: 1s # Erste Wiederholungswartezeit
max_delay: 90s # Maximale Verzögerungsobergrenze
backoff_factor: 2.0 # Verzögerungsmultiplikator pro Versuch
jitter: 0.1 # ±10% Randomisierung
max_attempts: 0 # 0 = unendliche Wiederholungen
VersuchBasis-VerzögerungMit Jitter (±10%)
11s0.9s - 1.1s
22s1.8s - 2.2s
34s3.6s - 4.4s
48s7.2s - 8.8s
N90s81s - 99s (gedeckelt)

Wenn ein Dienst länger als stable_threshold läuft, wird der Wiederholungszähler zurückgesetzt. Dies verhindert, dass vorübergehende Fehler die Verzögerungen dauerhaft eskalieren.

Diese Fehler stoppen Wiederholungsversuche:

  • Context-Abbruch
  • Explizite Beendigungsanforderung
  • Als nicht wiederholbar markierte Fehler

Dienste können mit einer bestimmten Sicherheitsidentität laufen:

# Prozessdefinition
- name: admin_worker_process
kind: process.lua
source: file://admin_worker.lua
method: main
# Überwachter Dienst mit Sicherheitskontext
- name: admin_worker
kind: process.service
process: app:admin_worker_process
host: app:processes
lifecycle:
auto_start: true
security:
actor:
id: "service:admin-worker"
meta:
role: admin
groups:
- app:admin_policies
policies:
- app:data_access

Der Sicherheitskontext setzt:

FeldBeschreibung
actor.idIdentitäts-String für diesen Dienst
actor.metaSchlüssel-Wert-Metadaten (Rolle, Berechtigungen, etc.)
groupsAnzuwendende Richtliniengruppen
policiesAnzuwendende einzelne Richtlinien

Im Dienst laufender Code erbt diesen Sicherheitskontext. Das security-Modul kann dann Berechtigungen prüfen:

local security = require("security")
if security.can("delete", "users") then
-- erlaubt
end
Wenn kein Sicherheitskontext konfiguriert ist, läuft der Dienst ohne Actor. Im strikten Modus (Standard) schlagen Sicherheitsprüfungen fehl. Konfigurieren Sie einen Sicherheitskontext für Dienste, die Autorisierung benötigen.
stateDiagram-v2
[*] --> Inactive
Inactive --> Starting
Starting --> Running
Running --> Stopping
Stopping --> Stopped
Stopped --> [*]
Running --> Failed
Starting --> Failed
Failed --> Starting : retry

Der Supervisor überführt Dienste durch diese Zustände:

ZustandBeschreibung
InactiveRegistriert aber nicht gestartet
StartingStart in Bearbeitung
RunningLäuft normal
StoppingKontrolliertes Herunterfahren in Bearbeitung
StoppedSauber beendet
FailedFehler aufgetreten, kann wiederholt werden

Start: Erst Abhängigkeiten, dann Abhängige. Dienste auf derselben Abhängigkeitsebene können parallel starten.

Shutdown: Erst Abhängige, dann Abhängigkeiten. Dies stellt sicher, dass abhängige Dienste fertig werden, bevor ihre Abhängigkeiten stoppen.

Start: database → cache → handler → http_server
Shutdown: http_server → handler → cache → database