你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

配置数据流图的 WebAssembly (WASM) 图定义(预览版)

重要

数据流图的 WebAssembly (WASM) 图定义现在为预览状态。 此功能具有限制,不适用于生产工作负载。

有关 beta 版本、预览版或尚未正式发布的版本的 Azure 功能所适用的法律条款,请参阅 Microsoft Azure 预览版的补充使用条款

图定义是 WASM 开发的核心,因为它们定义了模块如何连接到处理工作流。 了解图定义与数据流图之间的关系有助于你进行高效开发。

本文重点介绍如何创建和配置 YAML 图定义。 有关部署和测试 WASM 数据流图的信息,请参阅将 WebAssembly 与数据流图配合使用

重要

数据流图目前仅支持 MQTT、Kafka 和 OpenTelemetry 终结点。 不支持其他终结点类型,例如 Data Lake、Microsoft Fabric OneLake、Azure 数据资源管理器和本地存储。 有关详细信息,请参阅 已知问题

图定义结构

图定义遵循一种正式的 JSON 架构,该架构会验证结构并确保兼容性。 配置包括:

  • 针对 API 和主机库版本兼容性的模块要求
  • 针对运行时参数和运算符自定义的模块配置
  • 在工作流中定义处理节点的操作
  • 指定操作之间的数据流路由的连接
  • 用于可选数据验证的架构

基本图结构

moduleRequirements:
  apiVersion: "0.2.0"
  hostlibVersion: "0.2.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" }

版本兼容性

moduleRequirements 部分通过语义化版本控制来确保兼容性:

moduleRequirements:
  apiVersion: "0.2.0"          # WASI API version for interface compatibility
  hostlibVersion: "0.2.0"     # Host library version providing runtime support
  features:                    # Optional features required by modules
    - name: "wasi-nn"

小窍门

有关使用 wasi-nn 功能启用带内 ONNX 推理的指导,请参阅在 WebAssembly 数据流图中运行 ONNX 推理

示例 1:简单图定义

简单图定义演示了一个基本的三阶段管道,该管道将温度数据从华氏度转换为摄氏度:

有关此示例的分步部署说明和测试指南,请参阅示例 1:使用一个 WASM 模块进行基本部署

简单图的工作原理

此图会创建一个简单的数据处理管道:

  1. 源操作:从数据流的源终结点接收温度数据
  2. 映射操作:使用温度 WASM 模块 (temperature:1.0.0) 处理数据
  3. 接收器操作:将转换后的数据发送到数据流的目标终结点

温度模块使用标准公式 (F - 32) × 5/9 = C 将华氏度转换为摄氏度。

输入格式:

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

输出格式:

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

示例 2:复杂图定义

复杂图定义演示了一个复杂的多传感器处理工作流,该工作流使用高级分析处理温度、湿度和图像数据:

有关此示例的分步部署说明和测试指南,请参阅示例 2:部署复杂图

复杂图的工作原理

复杂图可处理三个数据流,并将其组合到扩充的传感器分析中:

显示包含多个模块的复杂数据流图示例的示意图。

如图所示,数据从单个源发出,经过多个处理阶段:

  1. 窗口模块:延迟传入数据以便进行基于时间的处理
  2. 分支操作:基于内容类型路由数据(传感器数据与快照)
  3. 温度处理路径
    • 将华氏度转换为摄氏度
    • 筛选无效读数
    • 计算一段时间内的统计摘要
  4. 湿度处理路径
    • 通过统计分析累积湿度度量值
  5. 图像处理路径
    • 设置图像数据的格式以供处理
    • 对相机快照执行对象检测
  6. 最终聚合
    • 连接所有已处理的数据流
    • 聚合多传感器结果
    • 添加元数据和超温警报

图形使用来自 Rust 示例的专用模块:

  • 基于时间的处理延迟的窗口模块
  • 用于转换、筛选和统计分析的温度模块
  • 用于环境数据处理的湿度模块
  • 用于图像数据路由和对象检测的快照模块
  • 用于图像处理准备的格式模块
  • 用于多传感器数据聚合的收集模块
  • 用于添加元数据和生成警报的扩充模块

分支操作支持对不同的传感器输入进行并行处理,从而允许图形在单个工作流中高效处理多个数据类型。

图定义如何成为数据流

下面显示了图定义与 Azure IoT 操作数据流图之间的关系:

YAML 文件以源/接收器操作作为抽象终结点,定义了内部处理逻辑。 这将成为图定义项目。 所引用的模块将实际处理运算符作为 WASM 模块实现。 图定义和 WASM 模块都作为注册表存储的 OCI 项目上传到容器注册表(例如 Azure 容器注册表)。

Azure 资源管理器或 Kubernetes 资源会“包装”图定义,并将其作为数据流图资源连接到实际终结点。 在运行时部署期间,数据流引擎会从注册表拉取项目并部署这些项目。 对于终结点映射,图中的抽象源/接收器操作会连接到实际的 MQTT 主题、Azure 事件中心或其他数据源。

例如,此示意图展示了图定义、WASM 模块和数据流图之间的关系:

显示图定义、WASM 模块和数据流图之间的关系的示意图。

注册表部署

必须先将图定义和 WASM 模块作为开放容器计划 (OCI) 项目上传到容器注册表,然后数据流图才能引用它们:

  • 图定义打包为 OCI 项目,其中媒体类型为 application/vnd.oci.image.config.v1+json
  • WASM 模块打包为 OCI 项目,其中包含已编译的 WebAssembly 二进制文件
  • 使用语义化版本控制(例如 my-graph:1.0.0temperature-converter:2.1.0)进行适当的依赖项管理
  • 注册表支持与 Azure 容器注册表、Docker Hub 和其他符合 OCI 的注册表兼容

这种分离实现可重用逻辑,其中使用不同的终结点部署相同的图定义。 它提供环境独立性,其中开发环境、过渡环境和生产环境使用不同的数据源。 它还支持模块化部署,在该部署中,无需更改处理逻辑即可更新终结点配置。

有关将图定义和 WASM 模块上传到注册表的详细说明,请参阅将 WebAssembly 与数据流图配合使用。 有关完整的部署工作流(包括注册表设置、身份验证和测试),请查看该指南中的示例。

模块配置参数

图定义可通过模块配置为 WASM 运算符指定运行时参数:

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

这些参数在运行时传递给 WASM 运算符的 init 函数,无需重新生成模块就能启用动态配置。 有关如何在 Rust 和 Python 代码中访问和使用这些参数的详细示例,请参阅模块配置参数

有关完整的实现示例,请参阅分支模块,其中演示了条件路由逻辑的参数用法。

后续步骤