概要
- WASI 0.3 が公式リリースされ、 WebAssembly Components でasyncがネイティブ対応
- WASI Subgroup がWASI 0.3.0を承認、仕様は安定版として確定
- Component Model のasyncプリミティブに基づく新しいABI設計
- 言語バインディング 生成やマイクロサービス連携が大幅に簡素化
- 今後、各種ツールチェーンやランタイムで WASI 0.3 サポートが拡大予定
WASI 0.3正式リリースとネイティブAsync対応
- WASI 0.3.0 が公式リリース、WebAssembly Component Modelの asyncプリミティブ に基づく設計
- 仕様が 安定版 となり、今後のプログラム互換性が保証
- wasi:io (WASI 0.2で利用されていたpollables、input-streams、output-streams)は、Component Modelの 標準ABI に統合
- これにより、 インターフェースの記述や署名が簡素化、ほとんどの変更は機械的なもの
- asyncプリミティブ (stream、future、async)がComponent Modelの標準ABIとして導入
Component ModelのAsync ABIとイベントループの統合
- WASI 0.2では 各コンポーネントが独自のイベントループ/asyncランタイム を必要とした
- WASI 0.3では ホスト側が単一イベントループ を管理し、全コンポーネントで共有
- stream と future はリソース型のように所有権を持つハンドルとして動作
- ランタイムがスケジューリング を制御し、値がfutureに届いた時点で対応タスクを実行
- asyncモデルは完了ベース であり、Linuxのio_uringやWindowsのIOCP/IoRingに類似
- async関数のエクスポート/インポート が直接可能となり、WASI 0.2のstart/finish/subscribe手順が不要に
WASI 0.2から0.3へのインターフェース変更
- 0.2でのasync対応のための複雑な記述が、 0.3ではネイティブasync化により大幅に簡素化
- 例:
- WASI 0.2 :resource pollable → WASI 0.3 :future
- WASI 0.2 :resource input-stream/output-stream → WASI 0.3 :stream
- WASI 0.2 :pollやsubscribe → WASI 0.3 :futureへのawaitやasync関数の直接返却
- ストリームの状態管理 も改善され、エラーとクローズの区別が容易に
言語バインディングの進化
- Component Model により、各言語向けの asyncバインディング生成 が容易に
- 例: wasi:http/handler インターフェースはasync関数としてRustのtraitにマッピング
- Rustでは wit-bindgen クレートでasync fnとして実装可能
- Python、JavaScript、C#、C などでもasync対応バインディングが進行中
- Go ではgoroutineによる仮想スレッドで非同期/同期呼び出しの変換が可能
- componentize-go を利用し、HTTPサーバの非同期ストリーミング実装が可能
WASI 0.3でのwasi:httpインターフェースの刷新
- wasi:http は機械的な変換だけでなく、 コア抽象の再設計 を実施
- wasi:http/service と wasi:http/middleware の2つのworldを提供
- service :HTTPクライアント/ハンドラの基礎
- middleware :他のハンドラへリクエストを転送できる拡張
- サービスチェイニング が可能となり、 マイクロサービス間の連携が高効率化
- 通信遅延がミリ秒単位からナノ秒単位へと大幅短縮
今後の展望とまとめ
- WASI 0.3 は WASI Subgroup の承認を経て安定版リリース
- Wasmtime 45/46 や jco など主要ランタイム・ツールチェーンが順次対応
- Rust、Go、JavaScript、Python など多様な言語でのサポート拡大見込み
- WebAssembly Components の学習には「Wasm Component Model book」が推奨
- 詳細な変更点 はWASI 0.3.0リリースノートを参照
- 今後のロードマップ や1.0化の情報は「The Road to Component Model 1.0」で確認可能
- コミュニティ主導 による開発、ツールチェーン・ランタイム貢献者やユーザーに感謝
- ネイティブasync と コンポーザビリティ が標準となり、あらゆる言語で同じプリミティブが利用可能な新時代の到来
これには愛憎があるなぁ。どうやってこれに従えばよかったんだ?試してみたけど、ほとんどのことが公に見えなかったのが約2年。最後に確認したのは3月で、進展が全くなかったみたい。だから、wasiv3にはすごく疑いを持ってる。面白いことに、もういくつかの約束(意図的じゃないけど)を実装しちゃったし、カスタム統合を持つ独立したwasmが未来の可能性が高いと思ってる。wasiコンポーネントの約束は果たされてない。市場はアーティファクトを動的にホットロードしてリンクしたいんだよ。wasiプロジェクトはその使い方をするには内部の魔法が必要で、提供されるものは出荷前にコンポーネントを静的にリンクすることになってる。これじゃ99%のユースケースが無駄になっちゃう。影で作業されているのが気に入らない。