Wasmのサーバー? よく分かりませんが入れてみました。
ホンの2年前くらいからだったと思いますが、ウェブブラウザ内のサンドボックスでローカルネイティブコードを実行する WebAssemblyというのを目にするようになりました。
WebAssembly = WASM という文脈で語られる事が多くなってきたようですので、以降は WASMと書きます。
WASMは新しい開発言語ではなく、既存の開発言語のコードをそのまま WEBブラウザで実行する環境と捉えています。
そのプログラム自体と実行用のランタイムライブラリを共にサーバーから Web経由で配信するようになっています。
Webクライアントには、そこの OS上のネイティブコードに近い実行環境があり、高速動作する…とは聞いています。
その仕組みを見ると、今は亡き Java Appletを連想するのですが、最新技術ですのできっと大変に洗練されたものになっているのでしょう。
私は .NETで作れるようになった、Blazor WebAssembly というプロジェクト形態で初めて動くものを体験したのですが、最近では WebAssembly版の PostgreSQLデータベースやらが界隈を賑わしています。
これからの Webアプリ周りで上がってくるモノの一つになるのは間違いないと思います。
私がよく拝見している最新技術情報ブログの Plublic Key 殿の、2023年3月9日のエントリで、Wasm Workers Server なるものを知ることとなりました。
オープンソースのWebAssemblyサーバレス基盤「Wasm Workers Server 1.0」正式リリース。RubyとPythonのWASMランタイムに対応し、Ruby/Pythonでの記述が可能に
そこに記されているリンクはこちら。
Wasm Workers Server
「サーバーレスファンクションを提供するフレームワーク」と言っていてここからしてよく分からんのですが、OSに囚われないマルチプラットフォームの Webサーバーを作れる…と言ってるように思います。
「でもサーバーレスのサーバープログラムって何?」と思うので、どこで動かすことを念頭に置いているのか。
ドキュメントには「AWS Lambdaに似たもの」とか「Deno Deployのような環境」と書いてありますので、以下のような感じなのかと。
- いずれはパブリッククラウドの FaaS環境のような WASMサービスが展開される予定
- Wasm Workers Serverそのベースになる環境の1つ
- ローカルにインストールしてその環境を作れるから試してみてくれよな!
よく分かってませんが、勝手にこう理解しました。
こちらに導入手順がありますので、これに従って入れてみます。
Quickstart
環境は Ubuntu Server 22.04.2を使っています。
curlコマンドでインストールスクリプトをダウンロードして、パイプ bashに渡して実行しています。
subro@UbuntuServer2204-1:~$ curl -fsSL https://workers.wasmlabs.dev/install | bash
👋 Hello
I'm going to install Wasm Workers Server in your system
⚙ Downloading
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 10.6M 100 10.6M 0 0 2139k 0 0:00:05 0:00:05 --:--:-- 3104k
⚙ Decompressing
./
./README.md
./wws
./LICENSE
⚙ Installing
Wasm Workers Server will be installed in /usr/local/bin.
This requires sudo permissions. If you prefer to install it
in your current directory, run the installer with --local.
If you want it to be global, just type your password:
[sudo] subro のパスワード: パスワード
🧹 Cleaning up
🚀 Wasm Workers Server (wws) was installed correctly!
You can now try it: wws --help
最近流行りのようにインストールしようとしているユーザーのホームディレクトリ下に入るのかと思っていましたが、/usr/local/binに入るようで、sudoするためにパスワードを聞かれましたね。
/usr/local/binを見てみると
subro@UbuntuServer2204-1:~$ ls -l /usr/local/bin
合計 32420
-rwxr-xr-x 1 subro subro 33195336 3月 9 04:57 wws
wwsコマンド(これがサーバープログラムの本体のようです)だけ、ここに入っています。
ただユーザーとグループはちょっといただけない…。
とりあえずインストールは完了です。
上のドキュメントに沿って進めていくと、JavaScriptのプログラムを動かす例がありますのでやってみます。
ワーキングディレクトリとして、~/work/wws に移っています。
subro@UbuntuServer2204-1:~/work/wws$ curl https://raw.githubusercontent.com/vmware-labs/wasm-workers-server/main/examples/js-basic/index.js -o ./index.js
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1439 100 1439 0 0 3288 0 --:--:-- --:--:-- --:--:-- 3285
subro@UbuntuServer2204-1:~/work/wws$ ls -l
合計 4
-rw-rw-r-- 1 subro subro 1439 3月 10 14:58 index.js
index.jsというファイルがダウンロードされてきました。
内容は関数呼び出し元に HTMLのテキストを返すようなものです。
実行します。
GUIのないサーバーで動かしているので、クライアントからアクセスできるよう[--host 0.0.0.0]を追加しました。
subro@UbuntuServer2204-1:~/work/wws$ wws --host 0.0.0.0 .
⚙ Loading routes from: .
🗺 Detected routes:
- http://0.0.0.0:8080/
=> ./index.js (name: default)
🚀 Start serving requests at http://0.0.0.0:8080
8080/tcpで待ち受けているようですので、WEBブラウザでアクセスしてみます。
URLはファイルシステムルーティングに依るとドキュメントにありましたが、特に index.js というファイルを指定していません。
カレントディレクトリにある「index」という名のファイルに反応しているのでしょうか。
ドキュメントを読み進めていくと、wws内で発生する「fetch」というイベントをリスニングしていて、同イベントが発生した際にレスポンスを返す関数が実行されていました。
2つ以上のスクリプトが同じイベントに対してレスポンスを発生させるとどうなるのかは分かりませんでした。
どのような言語がサポートされているか(どの言語のWebAssemblyランタイムライブラリがあるか)はコマンドでリストを取れるようです。
既にインストールされているランタイムライブラリはこれ。
subro@UbuntuServer2204-1:~/work/wws$ wws runtimes check
┌───────────┬──────┬─────────┬──────┬───────────┬────────┐
│ Installed │ Name │ Version │ Tags │ Extension │ Binary │
└───────────┴──────┴─────────┴──────┴───────────┴────────┘
💡 Tip: you can check the available language runtimes by running `wws runtimes list`
何も入っていないようです。
JavaScriptはランタイムが無くても行けるのかな…?
インターネット上のリポジトリからインストールできるのはこれら。
subro@UbuntuServer2204-1:~/work/wws$ wws runtimes list
⚙ Fetching data from the repository...
┌────────┬─────────────────┬──────────────────────┬───────────┬─────────────┐
│ Name │ Version │ Tags │ Extension │ Binary │
├────────┼─────────────────┼──────────────────────┼───────────┼─────────────┤
│ ruby │ 3.2.0+20230215 │ latest, 3.2, 3.2.0 │ rb │ ruby.wasm │
├────────┼─────────────────┼──────────────────────┼───────────┼─────────────┤
│ python │ 3.11.1+20230217 │ latest, 3.11, 3.11.1 │ py │ python.wasm │
└────────┴─────────────────┴──────────────────────┴───────────┴─────────────┘
2023年3月10日現在は、Rubyと Python だけのようです。
Rustはコンパイル言語なのでランタイムは必要なく、WASM用にコンパイルしたものを配置するみたいですね。
Rust
ちょっとイジってみたらこんな感じでしたがいかがでしょうか。
C#でやる場合は Rustの例と同じようにするのかな?と思いますけど、WebAssemblyの .NETランタイムはどうすりゃ良いのかまでは分かってません。
私はサーバーレスの分散処理の効果自体が捉えきれてないのでいまいち理解が覚束ないですが、分かる人には何か大きなメリットが感じられるんでしょうね。
この感じだと、ファンクション毎にコンテナを立ち上げて、連携させる感じになるんだと思います。
Kubernetesのような環境と相性が良いのではないかと思いました。
JavaEE(現在はJakertaEEか)と競合する技術になるのかなぁ…。
思想は似ている気がしますが、こちらの方がインターフェイスが随分とシンプルな分、覚えやすいのでしょう。
今後の動静を見ておかなきゃって思う技術がまた1つ増えてしまった感じです。