WASM 函数

WASM 函数是执行 WebAssembly 代码的注册表条目。提供两种条目类型:function.wat 用于内联 WAT 源码,function.wasm 用于预编译二进制文件。

内联 WAT 函数

使用 WebAssembly Text 格式直接在 _index.yaml 中定义小型 WASM 函数:

entries:
  - name: answer
    kind: function.wat
    source: |
      (module
        (func (export "answer") (result i32)
          i32.const 42
        )
      )      
    wit: |
      answer: func() -> s32;      
    method: answer
    pool:
      type: inline

对于较大的 WAT 源码,使用文件引用:

  - name: answer
    kind: function.wat
    source: file://answer.wat
    wit: |
      answer: func() -> s32;      
    method: answer
    pool:
      type: inline

WAT 配置字段

字段 必填 描述
source 内联 WAT 源码或 file:// 引用
method 要调用的导出函数名
wit 原始/核心模块的 WIT 签名
pool 工作池配置
transport 输入/输出映射(默认:payload
imports 要启用的宿主导入(如 wasi:cliwasi:io
wasi WASI 配置(args、env、mounts)
limits 执行限制

预编译 WASM 函数

从文件系统条目加载已编译的 .wasm 二进制文件:

entries:
  - name: assets
    kind: fs.directory
    directory: ./wasm

  - name: compute
    kind: function.wasm
    fs: myns:assets
    path: /compute.wasm
    hash: sha256:292b796376f8b4cc360acf2ea6b82d1084871c3607a079f30b446da8e5c984a4
    method: compute
    pool:
      type: lazy
      max_size: 4

WASM 配置字段

字段 必填 描述
fs 包含二进制文件的文件系统条目 ID
path 文件系统中 .wasm 文件的路径
hash 用于完整性验证的 SHA-256 哈希(sha256:...
method 要调用的导出函数名
wit 原始/核心模块的 WIT 签名
pool 工作池配置
transport 输入/输出映射(默认:payload
imports 要启用的宿主导入
wasi WASI 配置
limits 执行限制

工作池

每个 WASM 函数使用一个预编译实例池。池类型控制并发和资源使用。

类型 描述
inline 同步,单线程。每次调用创建新实例。
lazy 零空闲工作者。按需扩展至 max_size
static 固定数量的工作者,带请求队列。
adaptive 自动伸缩的弹性池。

池配置

pool:
  type: static
  size: 4            # Total pool size
  workers: 2         # Worker threads
  buffer: 16         # Request queue buffer (default: workers * 64)
pool:
  type: lazy
  max_size: 8        # Maximum concurrent instances
pool:
  type: adaptive
  max_size: 16       # Upper scaling bound
  warm_start: true   # Pre-instantiate initial workers

未指定 max_size 时,默认弹性池最大值为 100 个工作者。

传输方式

传输方式控制运行时与 WASM 模块之间输入和输出的映射方式。

Transport 描述
payload 将运行时负载直接映射到 WASM 调用参数(默认)
wasi-http 将 HTTP 请求/响应上下文映射到 WASM 参数和结果

Payload 传输

默认传输直接传递参数。Lua 值被转码为 Go 类型,然后降低为 WIT 类型:

  - name: compute
    kind: function.wasm
    fs: myns:assets
    path: /compute.wasm
    hash: sha256:...
    method: compute
    pool:
      type: inline
-- Arguments passed directly as WASM function parameters
local result, err = funcs.call("myns:compute", 6, 7)
-- result: 42

WASI HTTP 传输

wasi-http 传输将 HTTP 请求映射到 WASM,并将结果写回 HTTP 响应。使用此传输将 WASM 函数暴露为 HTTP 端点:

  - name: greet_wasm
    kind: function.wasm
    fs: myns:assets
    path: /greet.wasm
    hash: sha256:...
    method: greet
    transport: wasi-http
    pool:
      type: inline

  - name: greet_endpoint
    kind: http.endpoint
    method: POST
    path: /api/greet
    func: greet_wasm

执行限制

为函数设置最大执行时间:

limits:
  max_execution_ms: 5000   # 5 second timeout

超过限制时,执行将被取消并返回错误。

WASI 配置

为客户端模块配置 WASI 能力:

wasi:
  args: ["--verbose"]
  cwd: "/app"
  env:
    - id: myns:api_key
      name: API_KEY
      required: true
    - id: myns:debug_mode
      name: DEBUG
  mounts:
    - fs: myns:data_files
      guest: /data
      read_only: true
    - fs: myns:output
      guest: /output
字段 描述
args 传递给客户端的命令行参数
cwd 客户端内的工作目录(必须为绝对路径)
env 从注册表环境条目映射的环境变量
mounts 从注册表文件系统条目映射的文件系统挂载

环境变量在调用时从环境注册表解析。必填变量未找到时将产生错误。

挂载路径必须为绝对路径且唯一。每个挂载将运行时文件系统条目映射到客户端目录路径。

示例

数据转换管道

entries:
  - name: wasm_binaries
    kind: fs.directory
    directory: ./wasm

  - name: transform_users
    kind: function.wasm
    fs: myns:wasm_binaries
    path: /mapper.wasm
    hash: sha256:7304fc7d19778605458ae5804dae9a7343dcd3f5fc22bcc9415e98b5047192dd
    method: transform-users
    pool:
      type: lazy
      max_size: 4

  - name: filter_active
    kind: function.wasm
    fs: myns:wasm_binaries
    path: /mapper.wasm
    hash: sha256:7304fc7d19778605458ae5804dae9a7343dcd3f5fc22bcc9415e98b5047192dd
    method: filter-active
    pool:
      type: lazy
      max_size: 4
local funcs = require("funcs")

local users = {
    {id = 1, name = "Alice", tags = {"admin", "dev"}, active = true},
    {id = 2, name = "Bob", tags = {"user"}, active = false},
    {id = 3, name = "Carol", tags = {"dev"}, active = true},
}

-- Transform: adds display field and tag count
local transformed, err = funcs.call("myns:transform_users", users)

-- Filter: returns only active users
local active, err = funcs.call("myns:filter_active", users)

使用 WASI Clocks 的异步 Sleep

导入 wasi:clockswasi:io 的 WASM 组件可以使用时钟和轮询。异步 yield 机制与 Wippy 调度器集成:

  - name: sleep_ms
    kind: function.wasm
    fs: myns:wasm_binaries
    path: /sleep_test.wasm
    hash: sha256:...
    method: "test-sleep#sleep-ms"
    imports:
      - wasi:io
      - wasi:clocks
    pool:
      type: inline

method 字段中的 # 分隔符引用接口方法:test-sleep#sleep-ms 调用 test-sleep 接口中的 sleep-ms 函数。

另请参阅