🦀

100日後にRustをちょっと知ってる人になる: [Day 53]wasm-workers-server-kit クレート

2022/10/22に公開

Day 53 のテーマ

Day 50Day 52Wasm Workers Server について見てみました。

WebAssembly を用いたサーバーレスなアプリケーションを動作させる HTTP サーバーの導入、そしてサーバーレスなアプリケーションな ハンドラ の作成を行い、実際に動かしてみました。

さて、この Wasm Workers Server の目指しているコンセプトは、互換性シンプルさでした。そのため、作成するワーカーは互換性ある標準準拠したものになります。

Rust によるハンドラを作成する場合、wasm-workers-server-kit クレートを使用する必要があります。今回は、このwasm-workers-server-kit について見てみようと思います。

wasm-workers-server-kit クレート

Day 50Day 52 で作成したワーカーの中で、次のクレートを依存関係に追加しました。

  • wasm-workers-rs = { git = "https://github.com/vmware-labs/wasm-workers-server/" }

そのリポジトリに配置され参照している Cargo.toml を確認してみます。

[package]
name = "wasm-workers-server"
version = "0.5.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[[bin]]
name = "wws"
path = "src/main.rs"

[dependencies]
wasmtime = "1.0.1"
wasmtime-wasi = "1.0.1"
anyhow = "1.0.63"
wasi-common = "1.0.1"
actix-web = "4"
env_logger = "0.9.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0.85"
glob = "0.3.0"
toml = "0.5.9"
clap = { version = "4.0.10", features = ["derive"] }

[workspace]
members = [
  "kits/rust",
  "kits/rust/handler",
  "kits/javascript"
]
# Exclude examples
exclude = [
  "examples/rust-basic",
  "examples/rust-kv"
]

Dependencies

以下のクレートが Dependencies に追加されていました。

  • wasmtime
    • Wasmtimeランタイムを公開する高水準API
  • wasmtime-wasi
    • Rust による WASI の実装
  • wasi-common
    • Rust による WASI の実装
  • anyhow
    • std::error::Error をベースにした柔軟なエラー型
  • actix-web
    • Rust 用のパワフルで実用的、かつ非常に高速な Web フレームワーク
  • env_logger
    • 環境変数によって設定される log のロギング実装
  • serde_derive
    • Macros 1.1による #[derive(Serialize, Deserialize)] の実装
  • serde_json
    • JSON シリアライズファイルフォーマット
  • glob
    • Unix シェル形式のパターンに対するファイルパスのマッチングサポート
  • toml
    • TOML 形式のファイルやストリームのネイティブな Rust エンコーダおよびデコーダ
  • clap_derive
    • 構造体を定義してコマンドライン引数を解析しクレートの導出

この Wasm Workers ServerWasmtime ベースで作られ動作していることが分かります。

ワークスペース

ワークスペースを使用したプロジェクト構成になっていることが分かります。

[workspace]
members = [
  "kits/rust",
  "kits/rust/handler",
  "kits/javascript"
]
# Exclude examples
exclude = [
  "examples/rust-basic",
  "examples/rust-kv"
]

このワークスペースとは、複数のクレートをまとめるときに使用します。
つまり、ここでは次の3つのクレートをまとめているのです

  • kits/rust
[package]
name = "wasm-workers-rs"
version = "0.1.0"
edition = "2021"

[lib]
path = "src/lib.rs"

[dependencies]
anyhow = "1.0.63"
http = "0.2.8"
handler = { path = "./handler" }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0.85"
  • kits/rust/handler
[package]
name = "handler"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lib]
proc-macro = true
path = "src/lib.rs"

[dependencies]
quote = "1.0.21"
syn = { version = "1.0.99", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0.85"
http = "0.2.8"
anyhow = "1.0.63"
wasi = "0.11.0"
  • kits/javascript
[package]
name = "wasm-workers-quick-js-engine"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
anyhow = "1.0"
quickjs-wasm-rs = { version = "0.1.2", features = ["json"] }

このようにクレートを分割することによって、保守性や再利用性が向上するというメリットを得られます。
また、ビルド時間を短縮するということもできるそうです。

Day 53 のまとめ

今日はワーカーを作るときに参照する必要のある wasm-workers-server-kit について見てみました。
Wasmtime をベースに作られているということが改めて確認できました。
また、Cargo を使って複数のクレートをまとめる方法 (ワークスペース) についても確認することが出来ました。

GitHubで編集を提案

Discussion