WASM 함수

WASM 함수는 WebAssembly 코드를 실행하는 레지스트리 엔트리입니다. 인라인 WAT 소스용 function.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 설정 필드

Field Required Description
source Yes 인라인 WAT 소스 또는 file:// 참조
method Yes 호출할 내보내기된 함수 이름
wit No Raw/Core 모듈용 WIT 시그니처
pool No 워커 풀 설정
transport No 입출력 매핑 (기본값: payload)
imports No 활성화할 호스트 임포트 (예: wasi:cli, wasi:io)
wasi No WASI 설정 (args, env, mounts)
limits No 실행 제한

사전 컴파일된 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 설정 필드

Field Required Description
fs Yes 바이너리가 포함된 파일시스템 엔트리 ID
path Yes 파일시스템 내 .wasm 파일 경로
hash Yes 무결성 검증을 위한 SHA-256 해시 (sha256:...)
method Yes 호출할 내보내기된 함수 이름
wit No Raw/Core 모듈용 WIT 시그니처
pool No 워커 풀 설정
transport No 입출력 매핑 (기본값: payload)
imports No 활성화할 호스트 임포트
wasi No WASI 설정
limits No 실행 제한

워커 풀

각 WASM 함수는 사전 컴파일된 인스턴스 풀을 사용합니다. 풀 타입은 동시성과 리소스 사용을 제어합니다.

Type Description
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 Description
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
Field Description
args 게스트에 전달되는 커맨드라인 인자
cwd 게스트 내부의 작업 디렉터리 (절대 경로여야 함)
env 레지스트리 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를 사용한 비동기 슬립

wasi:clockswasi:io를 임포트하는 WASM 컴포넌트는 클럭과 폴링을 사용할 수 있습니다. 비동기 양보 메커니즘은 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-mstest-sleep 인터페이스의 sleep-ms 함수를 호출합니다.

참고