100日後にRustをちょっと知ってる人になる: [Day 53]wasm-workers-server-kit クレート
Day 53 のテーマ
Day 50 〜 Day 52 と Wasm Workers Server について見てみました。
WebAssembly を用いたサーバーレスなアプリケーションを動作させる HTTP サーバーの導入、そしてサーバーレスなアプリケーションな ハンドラ の作成を行い、実際に動かしてみました。
さて、この Wasm Workers Server の目指しているコンセプトは、互換性とシンプルさでした。そのため、作成するワーカーは互換性ある標準準拠したものになります。
Rust によるハンドラを作成する場合、wasm-workers-server-kit クレートを使用する必要があります。今回は、このwasm-workers-server-kit について見てみようと思います。
wasm-workers-server-kit クレート
Day 50 と Day 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)]
の実装
- Macros 1.1による
-
serde_json
- JSON シリアライズファイルフォーマット
-
glob
- Unix シェル形式のパターンに対するファイルパスのマッチングサポート
-
toml
- TOML 形式のファイルやストリームのネイティブな Rust エンコーダおよびデコーダ
-
clap_derive
- 構造体を定義してコマンドライン引数を解析しクレートの導出
この Wasm Workers Server が Wasmtime ベースで作られ動作していることが分かります。
ワークスペース
ワークスペースを使用したプロジェクト構成になっていることが分かります。
[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 を使って複数のクレートをまとめる方法 (ワークスペース) についても確認することが出来ました。
Discussion