Cloudflareは9月28日、Workers上でネイティブ寄りのRustとTokioアプリケーションを動かす実験的プレビューを公開した。対象は、wasm-bindgenにおけるwasm32-unknown-emscriptenターゲットである。Emscriptenはタイマーやファイル、ソケットを仮想化し、WorkersはNode.js互換APIの上でそれを受ける。Googleの移植ツールチェーンチームとCloudflareが、wasm-bindgenの束縛とEmscriptenのリンカを同時に使えるよう双方へ変更を入れた。
障害だったのは実行モデルの差だ。Workersは単一スレッドのJavaScriptイベントループで、Tokioはスレッドを止めてI/Oを待つ。ブロッキングのままではイベントループが止まる。Cloudflareは、待機中のスタックを一時停止するJSPI方式と、ホストがdrive()で少しずつ進めるLocalEventLoop方式の両方を、上流前のTokioパッチで動かした。Emscriptenには40本超のプルリクエストで、Node.js互換のソケット層も追加している。
どこまで動いたか
検証として、Tokio製MinecraftサーバのPumpkinをDurable Object上で動かした。ワールド生成などのスレッドは協調タスクへ分解し、ファイルはDurable ObjectのSQLiteへ行として保存する。プレイヤー接続はWorkersのTCP入口から受け、サーバ側はLinux上と同様に待受できる。再起動後も同じワールドから復帰する。
公開されたのはパッチ一式と、Emscripten製Worker、Tokio、TCPソケットの例である。Tokioの本対応は上流レビューの途中で、例を動かすにはパッチが要る。実験的プレビューであり、既存のRustサービスをそのまま本番のWorkerへ移す発表ではない。