Freigeben über


Konfigurieren von WebAssembly (WASM)-Diagrammdefinitionen für Datenflussdiagramme

Graphdefinitionen sind für die WASM-Entwicklung von zentraler Bedeutung, da sie definieren, wie Ihre Module mit Verarbeitungsworkflows verbunden sind. Wenn Sie die Beziehung zwischen Diagrammdefinitionen und Datenflussdiagrammen verstehen, können Sie effektiv entwickeln.

WebAssembly (WASM)-Diagrammdefinitionen für Datenflussdiagramme sind allgemein verfügbar.

Dieser Artikel konzentriert sich auf das Erstellen und Konfigurieren der YAML-Diagrammdefinitionen. Informationen zum Bereitstellen und Testen von WASM-Datenflussdiagrammen finden Sie unter Verwenden von WebAssembly mit Datenflussdiagrammen.

Von Bedeutung

Datenflussdiagramme unterstützen derzeit nur MQTT-, Kafka- und OpenTelemetry-Endpunkte. Andere Endpunkttypen wie Data Lake, Microsoft Fabric OneLake, Azure Data Explorer und lokaler Speicher werden nicht unterstützt. Weitere Informationen finden Sie unter Bekannte Probleme.

Diagrammdefinitionsstruktur

Graph-Definitionen folgen einem formalen JSON-Schema , das die Struktur überprüft und die Kompatibilität gewährleistet. Die Konfiguration umfasst:

  • Modulanforderungen für API- und Hostbibliotheksversionskompatibilität
  • Modulkonfigurationen für Laufzeitparameter und Operatoranpassung
  • Vorgänge, die Verarbeitungsknoten in Ihrem Workflow definieren
  • Verbindungen, die datenflussweiterleitung zwischen Vorgängen angeben
  • Schemas für optionale Datenüberprüfung

Grundlegende Diagrammstruktur

metadata:
  $schema: "https://www.schemastore.org/aio-wasm-graph-config-1.0.0.json"
  name: "Simple graph"
  description: "A simple graph with a source, a map module, and a sink"
  version: "1.0.0"
  vendor: "Microsoft"

moduleRequirements:
  apiVersion: "1.1.0"
  runtimeVersion: "1.1.0"

operations:
  - operationType: "source"
    name: "data-source"
  - operationType: "map"
    name: "my-operator/map"
    module: "my-operator:1.0.0"
  - operationType: "sink"
    name: "data-sink"

connections:
  - from: { name: "data-source" }
    to: { name: "my-operator/map" }
  - from: { name: "my-operator/map" }
    to: { name: "data-sink" }

Versionskompatibilität

Der moduleRequirements Abschnitt stellt die Kompatibilität mithilfe der semantischen Versionsverwaltung sicher:

moduleRequirements:
  apiVersion: "1.1.0"          # WASI API version for interface compatibility
  runtimeVersion: "1.1.0"     # Runtime version providing runtime support
  features:                    # Optional features required by modules
    - name: "wasi-nn"

Tipp

Anleitungen zum Aktivieren von In-Band-ONNX-Rückschlüssen mit dem wasi-nn Feature finden Sie unter Ausführen von ONNX-Inference in WebAssembly-Datenflussdiagrammen.

Beispiel 1: Einfache Diagrammdefinition

Die einfache Diagrammdefinition veranschaulicht eine einfache dreistufige Pipeline, die Temperaturdaten von Fahrenheit in Celsius konvertiert:

metadata:
  name: "Simple graph"
  description: "A graph that transforms temperature from Fahrenheit to Celsius"
  version: "1.0.0"
  $schema: "https://www.schemastore.org/aio-wasm-graph-config-1.0.0.json"
  vendor: "Microsoft"

moduleRequirements:
  apiVersion: "1.1.0"
  runtimeVersion: "1.1.0"

moduleConfigurations:
  - name: module-temperature/map
    parameters:
      key1:
        name: key2
        description: key2
operations:
  - operationType: "source"
    name: "source"

  - operationType: "map"
    name: "module-temperature/map"
    module: "temperature:1.0.0"

  - operationType: "sink"
    name: "sink"

connections:
  - from:
      name: "source"
    to:
      name: "module-temperature/map"

  - from:
      name: "module-temperature/map"
    to:
      name: "sink"

Schrittweise Bereitstellungsanweisungen und Testanleitungen für dieses Beispiel finden Sie unter Beispiel 1: Grundlegende Bereitstellung mit einem WASM-Modul.

Funktionsweise des einfachen Diagramms

Dieses Diagramm erstellt eine einfache Datenverarbeitungspipeline:

  1. Quellvorgang: Empfängt Temperaturdaten vom Quellendpunkt des Datenflusses
  2. Kartenvorgang: Verarbeitet Daten mit dem Temperatur-WASM-Modul (temperature:1.0.0)
  3. Sink-Vorgang: Sendet konvertierte Daten an den Zielendpunkt des Datenflusses.

Das Temperaturmodul wandelt Fahrenheit mit der Standardformel (F - 32) × 5/9 = Cin Celsius um.

Eingabeformat:

{"temperature": {"value": 100.0, "unit": "F"}}

Ausgabeformat:

{"temperature": {"value": 37.8, "unit": "C"}}

Beispiel 2: Komplexe Diagrammdefinition

Die komplexe Diagrammdefinition veranschaulicht einen anspruchsvollen Multisensorverarbeitungsworkflow, der Temperatur-, Luftfeuchtigkeits- und Bilddaten mit erweiterten Analysen verarbeitet:

metadata:
  name: "Complex graph"
  description: "A graph that processes temperature and humidity data from sensors, along with snapshot data. The graph performs filtering, accumulation, and enrichment operations before sending the processed data to the sink."
  version: "1.0.0"
  $schema: "https://www.schemastore.org/aio-wasm-graph-config-1.0.0.json"
  vendor: "Microsoft"

moduleRequirements:
  apiVersion: "1.1.0"
  runtimeVersion: "1.1.0"

moduleConfigurations:
  - name: module-temperature/map
    parameters:
      key1:
        name: key2
        description: key2
  - name: module-snapshot/branch
    parameters:
      snapshot_topic:
        name: snapshot_topic
        description: Transform app snapshot_topic in snapshot branch's init routine
operations:
  - operationType: "source"
    name: "source"

  - operationType: delay
    name: module-window/delay
    module: window:1.0.0
  - operationType: "map"
    name: "module-format/map"
    module: "format:1.0.0"
  - operationType: map
    name: module-snapshot/map
    module: snapshot:1.0.0
  - operationType: branch
    name: module-snapshot/branch
    module: snapshot:1.0.0
  - operationType: accumulate
    name: module-snapshot/accumulate
    module: snapshot:1.0.0
  - operationType: map
    name: module-temperature/map
    module: temperature:1.0.0
  - operationType: branch
    name: module-temperature/branch
    module: temperature:1.0.0
  - operationType: filter
    name: module-temperature/filter
    module: temperature:1.0.0
  - operationType: accumulate
    name: module-temperature/accumulate
    module: temperature:1.0.0
  - operationType: accumulate
    name: module-humidity/accumulate
    module: humidity:1.0.0
  - operationType: concatenate
    name: concatenate1
    module:
  - operationType: accumulate
    name: module-collection/accumulate
    module: collection:1.0.0
  - operationType: map
    name: module-enrichment/map
    module: enrichment:1.0.0

  - operationType: "sink"
    name: "sink"

connections:
  - from:
      name: source
    to:
      name: module-window/delay

  - from:
      name: module-window/delay
    to:
      name: module-snapshot/branch

  - from:
      name: module-snapshot/branch
      arm: "False"
    to:
      name: module-temperature/branch

  - from:
      name: module-snapshot/branch
      arm: "True"
    to:
      name: module-format/map

  - from:
      name: module-format/map
    to:
      name: module-snapshot/map

  - from:
      name: module-snapshot/map
    to:
      name: module-snapshot/accumulate

  - from:
      name: module-snapshot/accumulate
    to:
      name: concatenate1

  - from:
      name: module-temperature/branch
      arm: "True"
    to:
      name: module-temperature/map

  - from:
      name: module-temperature/branch
      arm: "False"
    to:
      name: module-humidity/accumulate

  - from:
      name: module-humidity/accumulate
    to:
      name: concatenate1

  - from:
      name: module-temperature/map
    to:
      name: module-temperature/filter

  - from:
      name: module-temperature/filter
    to:
      name: module-temperature/accumulate

  - from:
      name: module-temperature/accumulate
    to:
      name: concatenate1

  - from:
      name: concatenate1
    to:
      name: module-collection/accumulate

  - from:
      name: module-collection/accumulate
    to:
      name: module-enrichment/map

  - from:
      name: module-enrichment/map
    to:
      name: sink

Schrittweise Bereitstellungsanweisungen und Testanleitungen für dieses Beispiel finden Sie unter Beispiel 2: Bereitstellen eines komplexen Diagramms.

Funktionsweise des komplexen Diagramms

Das komplexe Diagramm verarbeitet drei Datenströme und kombiniert sie in einer erweiterten Sensoranalyse:

Diagramm mit einem komplexen Datenflussdiagramm (Beispiel) mit mehreren Modulen.

Wie im Diagramm gezeigt, fließen Daten aus einer einzigen Quelle über mehrere Verarbeitungsphasen:

  1. Fenstermodul: Verzögert eingehende Daten für die zeitbasierte Verarbeitung
  2. Verzweigungsvorgang: Leitet Daten basierend auf dem Inhaltstyp (Sensordaten und Momentaufnahmen) weiter.
  3. Temperaturverarbeitungspfad:
    • Wandelt Fahrenheit in Celsius um.
    • Filtert ungültige Lesewerte.
    • Berechnet statistische Zusammenfassungen über Zeitfenster
  4. Luftfeuchtigkeitsverarbeitungspfad:
    • Sammelt Luftfeuchtigkeitsmessungen mit statistischer Analyse
  5. Bildverarbeitungspfad:
    • Formatiert Bilddaten für die Verarbeitung
    • Führt die Objekterkennung für Kameramomentaufnahmen aus.
  6. Endgültige Aggregation:
    • Verketten aller verarbeiteten Datenströme
    • Aggregiert Multisensorergebnisse
    • Hinzufügen von Metadaten und Übertemperaturwarnungen

Das Diagramm verwendet spezielle Module aus den Rust-Beispielen:

  • Fenstermodul für zeitbasierte Verarbeitungsverzögerungen
  • Temperaturmodule für Konvertierung, Filterung und statistische Analyse
  • Luftfeuchtigkeitsmodul für die Verarbeitung von Umweltdaten
  • Momentaufnahmenmodule für das Routing von Bilddaten und die Objekterkennung
  • Formatmodul für die Bildvorbereitung für die Verarbeitung
  • Sammlungsmodul für die Datenaggregation mit mehreren Sensoren
  • Anreicherungsmodul für Metadatenzugabe und Warnungsgenerierung

Verzweigungsvorgänge ermöglichen die parallele Verarbeitung verschiedener Sensoreingaben, sodass das Diagramm mehrere Datentypen effizient innerhalb eines einzelnen Workflows verarbeiten kann.

So werden Graphdefinitionen zu Datenflüssen

Hier erfahren Sie, wie Diagrammdefinitionen und Azure IoT Operations-Datenflussdiagramme zusammenhängen:

Ihre YAML-Datei definiert die interne Verarbeitungslogik mit Quell-/Sinkvorgängen als abstrakte Endpunkte. Dies wird zum Diagrammdefinitionsartefakt. Referenzierte Module implementieren die eigentlichen Verarbeitungsoperatoren als WASM-Module. Sowohl Graphdefinitionen als auch WASM-Module werden in eine Containerregistrierung (z. B. Azure Container Registry) als OCI-Artefakte für den Registrierungsspeicher hochgeladen.

Der Azure Resource Manager oder die Kubernetes-Ressource "umschließt" die Graphdefinition und verbindet sie mit realen Endpunkten als Datenflussdiagrammressource. Während der Laufzeitbereitstellung ruft das Datenflussmodul die Artefakte aus der Registrierung ab und stellt sie bereit. Bei der Endpunktzuordnung stellen die abstrakten Quell-/Sinkvorgänge in Ihrem Diagramm eine Verbindung mit tatsächlichen MQTT-Themen, Azure Event Hubs oder anderen Datenquellen her.

In diesem Diagramm wird beispielsweise die Beziehung zwischen Diagrammdefinitionen, WASM-Modulen und Datenflussdiagrammen veranschaulicht:

Diagramm, das die Beziehung zwischen Diagrammdefinitionen, WASM-Modulen und Datenflussdiagrammen zeigt.

Registrierungsbereitstellung

Sowohl Graphdefinitionen als auch WASM-Module müssen als Open Container Initiative (OCI)-Artefakte in eine Containerregistrierung hochgeladen werden, bevor Datenflussdiagramme darauf verweisen können:

  • Graphdefinitionen werden als OCI-Artefakte mit Medientyp verpackt. application/vnd.oci.image.config.v1+json
  • WASM-Module werden als OCI-Artefakte verpackt, die die kompilierte WebAssembly-Binärdatei enthalten
  • Verwenden der semantischen Versionsverwaltung (z my-graph:1.0.0. B. , temperature-converter:2.1.0) für die ordnungsgemäße Abhängigkeitsverwaltung
  • Die Registrierungsunterstützung ist mit Azure Container Registry, Docker Hub und anderen OCI-kompatiblen Registrierungen kompatibel.

Die Trennung ermöglicht wiederverwendbare Logik, bei der dieselbe Graphdefinition mit verschiedenen Endpunkten bereitgestellt wird. Sie ermöglicht die Unabhängigkeit der Umgebung, bei der Entwicklung, Staging und Produktion unterschiedliche Datenquellen verwenden. Sie unterstützt auch die modulare Bereitstellung, bei der Sie Endpunktkonfigurationen aktualisieren, ohne die Verarbeitungslogik zu ändern.

Ausführliche Anweisungen zum Hochladen von Diagrammdefinitionen und WASM-Modulen in Registrierungen finden Sie unter Verwenden von WebAssembly mit Datenflussdiagrammen. Vollständige Bereitstellungsworkflows, einschließlich Registrierungseinrichtung, Authentifizierung und Tests, finden Sie in den Beispielen in diesem Handbuch.

Modulkonfigurationsparameter

Graph-Definitionen können Laufzeitparameter für WASM-Operatoren über Modulkonfigurationen angeben:

moduleConfigurations:
  - name: my-operator/map
    parameters:
      threshold:
        name: temperature_threshold
        description: "Temperature threshold for filtering"
        required: true
      unit:
        name: output_unit
        description: "Output temperature unit"
        required: false

Diese Parameter werden zur Laufzeit an die Funktion des WASM-Operators init übergeben und ermöglichen die dynamische Konfiguration, ohne Module neu zu erstellen. Ausführliche Beispiele für den Zugriff auf diese Parameter in Ihrem Rust- und Python-Code finden Sie unter Modulkonfigurationsparameter.

Ein vollständiges Implementierungsbeispiel finden Sie im Verzweigungsmodul, das die Parameterverwendung für die Logik für das bedingte Routing veranschaulicht.

Nächste Schritte