Zum Inhalt springen

Prozessgruppen

Prozessgruppen ermöglichen es Prozessen, benannten Gruppen beizutreten und Broadcasts zu empfangen, die an eine Gruppe gerichtet sind, wobei die Mitgliedschaft über jeden Knoten im Cluster verfolgt wird. Das Modell folgt Erlang/OTP pg: Gruppen werden beim ersten Beitritt erstellt, ein Prozess kann vielen Gruppen angehören (und einer Gruppe mehrmals beitreten), und die Mitgliedschaft ist dezentral — jeder Knoten pflegt seinen eigenen Zustand und gleicht ihn mit Peers über das Internode-Mesh ab.

Die Lua-API ist in Prozessgruppen dokumentiert; diese Seite behandelt den Scope-Eintragstyp und seine Konfiguration. Siehe den Cluster-Leitfaden für das umgebende Mitgliedschaftsmodell.

TypBeschreibung
pg.scopeEin 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

Alle Felder sind optional und haben auf einen typischen Cluster abgestimmte Standardwerte.

FeldTypStandardBeschreibung
protocol_timeoutduration5sTimeout für Inter-Knoten-Sync-/Discover-Operationen
broadcast_timeoutduration5sTimeout für die Zustellung eines Broadcasts an ein einzelnes Mitglied
anti_entropy_intervalduration30sTakt der Reconcile-Schleife; ein Peer wird pro Tick synchronisiert (0 deaktiviert)
circuit_breaker_failuresint3Aufeinanderfolgende Sendefehler zu einem Knoten, bevor sein Circuit öffnet
circuit_breaker_reset_timeduration10sWartezeit, bevor ein offener Circuit in den Half-Open-Zustand für einen Test-Send wechselt
max_retriesint3Wiederholungsversuche für einen fehlgeschlagenen Broadcast (0 deaktiviert Wiederholungen)
retry_base_delayduration100msInitiale Backoff-Verzögerung zwischen Wiederholungen
retry_max_delayduration1sMaximale Backoff-Verzögerung
action_queue_sizeint256Tiefe, bei der eine “nähert sich der Kapazität”-Warnung protokolliert wird
action_queue_max_sizeint1024Harte Kapazität der internen Event-Loop-Queue; Operationen werden bei Überfüllung verworfen
monitor_bufferint64Event-Channel-Kapazität pro Abonnement; Ereignisse werden für einen Abonnenten verworfen, dessen Puffer voll ist
max_groupsint0Maximale Anzahl unterschiedlicher Gruppen (0 = unbegrenzt)
max_members_per_groupint0Maximale 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

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.

Ein Liveness-Health-Check (pg.broadcast_recent.<scope>) meldet Ungesundheit, wenn ein Scope für einen längeren Zeitraum keinen Broadcast-Verkehr sieht, was eine blockierte Event-Loop oder eine anhaltende Partition anzeigt. Siehe den Observability-Leitfaden.