Prozessgruppen
Ein pg.scope ermöglicht Prozessen, benannten Gruppen beizutreten und an eine Gruppe adressierte Broadcasts zu empfangen. Das Modell folgt Erlang/OTP pg: Gruppen entstehen beim ersten Beitritt, ein Prozess kann mehreren Gruppen angehören und derselben Gruppe mehrfach beitreten, und jeder Cluster-Knoten verwaltet seinen eigenen Mitgliedschaftszustand und gleicht ihn über das Internode-Mesh mit Peers ab. Diese Seite ist eine Konfigurations- und Verhaltensreferenz; die YAML-Blöcke sind Entry-Fragmente.
Die Lua-API ist unter Prozessgruppen dokumentiert; diese Seite behandelt den Scope-Entry-Typ und seine Konfiguration. Siehe den Cluster-Leitfaden für das umgebende Mitgliedschaftsmodell.
Eintragstyp
| Typ | Beschreibung |
|---|---|
pg.scope |
Ein unabhängiger Prozessgruppen-Namespace mit eigenem Mitgliedschaftszustand und Cluster-Mesh |
Jeder Scope ist isoliert: Gruppen und Mitglieder in einem Scope sind für einen anderen unsichtbar. Ein Prozess öffnet einen Scope über seine Eintrag-ID (pg.open("app:pg")) und operiert darin.
- name: pg
kind: pg.scope
lifecycle:
auto_start: true
Konfiguration
Alle Felder sind optional. Die Tabelle führt ihre Standardwerte auf.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
protocol_timeout |
duration | 5s | Timeout für Inter-Knoten-Sync-/Discover-Operationen |
broadcast_timeout |
duration | 5s | Timeout für die Zustellung eines Broadcasts an ein einzelnes Mitglied |
anti_entropy_interval |
duration | 30s | Takt der Reconcile-Schleife; pro Tick wird ein Peer synchronisiert |
circuit_breaker_failures |
int | 3 | Aufeinanderfolgende Sendefehler zu einem Knoten, bevor sein Circuit öffnet |
circuit_breaker_reset_time |
duration | 10s | Wartezeit, bevor ein offener Circuit in den Half-Open-Zustand für einen Test-Send wechselt |
max_retries |
int | 3 | Wiederholungsversuche für einen fehlgeschlagenen Broadcast |
retry_base_delay |
duration | 100ms | Initiale Backoff-Verzögerung zwischen Wiederholungen |
retry_max_delay |
duration | 1s | Maximale Backoff-Verzögerung |
action_queue_size |
int | 256 | Tiefe, bei der eine "nähert sich der Kapazität"-Warnung protokolliert wird |
action_queue_max_size |
int | 1024 | Harte Kapazität der internen Event-Loop-Queue; Operationen werden bei Überfüllung verworfen |
monitor_buffer |
int | 64 | Event-Channel-Kapazität pro Abonnement; Ereignisse werden für einen Abonnenten verworfen, dessen Puffer voll ist |
max_groups |
int | 0 | Maximale Anzahl unterschiedlicher Gruppen (0 = unbegrenzt) |
max_members_per_group |
int | 0 | Maximale Mitglieder pro Gruppe, inkl. Multi-Joins (0 = unbegrenzt) |
- name: pg
kind: pg.scope
anti_entropy_interval: 30s
circuit_breaker_failures: 3
max_members_per_group: 10000
lifecycle:
auto_start: true
Funktionsweise
Single-Writer-Zustand. Jeder Scope betreibt eine Single-Goroutine-Event-Loop (das gen_server-Muster). Alle Mutationen werden über sie serialisiert; Lesevorgänge von Mitgliedern und Gruppen werden aus atomar veröffentlichten Snapshots bedient, sodass sie die Loop niemals blockieren.
Beitritts-/Verlassens-Propagierung. Ein lokaler Beitritt oder Austritt wird auf die Loop angewendet und dann an die Vereinigung der lebenden Mitglieds-Peers und aller zuvor entdeckten Remote-Knoten ausgefächert. Das Senden an diese Vereinigung stellt sicher, dass ein frisch beigetretener oder noch nicht konvergierter Knoten die Änderung trotzdem erhält.
Broadcast. broadcast snapshottiert die vollständige cluster-übergreifende Mitgliederliste innerhalb der Loop und liefert dann außerhalb der Loop an jedes Mitglied, sodass ein langsamer Empfänger den Scope nicht blockieren kann. broadcast_local macht dasselbe, aber nur für Mitglieder auf dem lokalen Knoten.
Monitor und Events. Das Abonnieren und Snapshotting der aktuellen Mitglieder geschieht in einem Event-Loop-Tick, sodass ein Abonnent niemals eine Änderung verpasst oder doppelt zählt, die das Abonnement überholt. Abonnenten erhalten member.joined / member.left-Ereignisse; ein Austritt für einen Prozess, der N-mal beigetreten ist, meldet die PID N-mal und bewahrt so die Multiplizität.
Anti-Entropy und Discovery. Beim Start sendet ein Scope Discover-Nachrichten an eine kleine zufällige Teilmenge von Peers (begrenzt, um einen N²-Sturm zu vermeiden, wenn viele Knoten gleichzeitig neu starten). Wenn ein Knoten beitritt, erhält er einen vollständigen Zustandssync. Die Anti-Entropy-Schleife drückt dann periodisch einen vollständigen Sync zu einem Peer gleichzeitig, sodass jeder Broadcast, den ein Peer verpasst hat, schließlich konvergiert. Der Empfänger wendet einen differenziellen Sync an — nur tatsächlich hinzugefügte oder entfernte Mitglieder lösen Ereignisse aus.
Circuit Breaker. Ein knotenspezifischer Circuit Breaker verfolgt aufeinanderfolgende Sendefehler. Nach circuit_breaker_failures Fehlern öffnet er und Sends an diesen Knoten werden übersprungen, bis circuit_breaker_reset_time verstreicht, wonach ein Test-Send zugelassen wird. Beitritts-/Verlassens-Broadcasts, die auf einen offenen Breaker treffen, werden mit exponentiellem Backoff bis zu max_retries wiederholt.
Observability
Ein Liveness-Health-Check (pg.broadcast_recent.<scope>) meldet einen ungesunden Zustand, wenn ein Scope über längere Zeit keinen Broadcast-Verkehr erkennt, und macht dadurch eine blockierte Event-Loop oder anhaltende Partition sichtbar. Siehe den Observability-Leitfaden.
Siehe auch
- Prozessgruppen - Die Lua-API
- Cluster - Mitgliedschaft und das Clustering-Modell
- Prozessmodell - Prozesse, PIDs und Messaging