EnglishGitHub
Prototyppackages/swarm/src

Swarm

@ralphschuler/swarm

Sendet an eine begrenzte Gruppe eindeutiger lokaler Worker und erhält Teilerfolge.

workersbroadcastcoordination

01 · Problem

Wofür braucht man das?

Mehrere verteilte Worker benötigen Identität, Transport, Lebenszyklus und definierte Regeln für Broadcast, Fehler sowie Teilantworten.

02 · Denkmodell

Das mentale Modell

Der Manager kennt aktive Knoten und delegiert Bytes über einen Transport. Ein Protokoll beschreibt Handshake, Anfrage-ID, Antwort und Timeout.

Im Repository

Sendet an eine begrenzte Gruppe eindeutiger lokaler Worker und erhält Teilerfolge. Der geprüfte Kern ist lokale Orchestrierung. Remote-Ausführung, Authentifizierung, Wiederholungen und Heartbeats benötigen einen Netzwerkadapter.

03 · Kontrollfluss

Was passiert in welcher Reihenfolge?

  1. Worker über einen Transport verbinden und per Handshake identifizieren.
  2. Nachrichten mit Version, Anfrage-ID und Deadline serialisieren.
  3. Broadcast parallel an einen stabilen Snapshot aktiver Worker senden.
  4. Ergebnisse, Timeouts und Transportfehler pro Worker getrennt zurückgeben.

04 · Bauteile

Die entscheidenden Verträge

Manager.registerNode / unregisterNodeVerwaltet eine begrenzte Registry eindeutiger Endpunkte.
Manager.broadcastSammelt Erfolge und Fehler je Endpunkt.
Worker.executeFührt einen lokalen typisierten Handler aus.

05 · Selbst bauen

Selbst implementieren

Definiere zuerst einen transportneutralen Vertrag; Netzwerk- oder Worker-Adapter kommen danach.

  1. Knoten mit stabiler ID und send-Methode modellieren.
  2. Beim Broadcast die aktuelle Map kopieren, damit Verbindungen parallel wechseln dürfen.
  3. Promise.allSettled verwenden und Teilerfolge sichtbar zurückgeben.
Konzeptskizze · kann ausgelassene Helfer verwenden
type Node = { id: string; send(message: Uint8Array): Promise<Uint8Array> };

class Swarm {
  private nodes = new Map<string, Node>();
  connect(node: Node) { this.nodes.set(node.id, node); }
  disconnect(id: string) { this.nodes.delete(id); }
  broadcast(message: Uint8Array) {
    return Promise.allSettled(
      [...this.nodes.values()].map((node) => node.send(message)),
    );
  }
}

06 · Verifizieren

Was solltest du testen?

  • Ein Broadcast erreicht genau den Snapshot der beim Start verbundenen Worker.
  • Ein fehlerhafter Worker verwirft erfolgreiche Antworten anderer Worker nicht.
  • Doppelte IDs, Timeout und Disconnect während einer Anfrage sind definiert.

Selbst ausprobieren

Formuliere die erste Prüfaussage als fehlschlagenden Test, implementiere die kleinste Korrektur und ergänze einen Grenzfall.

Ein Broadcast erreicht genau den Snapshot der beim Start verbundenen Worker.

Ansatz vergleichen

Dein Test sollte beim gezielten Verletzen der Invariante fehlschlagen und nach der Korrektur wieder bestehen. Halte den Aufbau deterministisch und prüfe ein beobachtbares Ergebnis.

07 · Grenzen

Kompromisse und Stolperfallen

  • Broadcast ist einfach, vervielfacht aber Last und Datenverkehr linear.
  • Teilergebnisse erhöhen Verfügbarkeit, zwingen Aufrufer jedoch zu Fehlerpolitik.
  • Transportneutralität erleichtert Tests und braucht dafür ein explizites Wire-Protokoll.
Wichtig

Der geprüfte Kern ist lokale Orchestrierung. Remote-Ausführung, Authentifizierung, Wiederholungen und Heartbeats benötigen einen Netzwerkadapter.

08 · Weiterdenken

Quellcode und verwandte Ideen

yarn tsx packages/swarm/examples/basic.ts