本文へスキップ
MameTechNews
バックエンド

Cloudflare、WorkersでTokio製のRustを動かす実験的対応を公開

## POINTS

  • wasm-bindgenのEmscriptenターゲットを使い、Workersのイベントループ上でTokio製Rustを実験的に動かせる。
  • PumpkinをDurable Objectへ載せ、TCPのマルチプレイとSQLiteへのワールド保存まで確認した。
  • Tokioパッチは上流化の途中で、例の実行にはパッチが要る。本番移行の一般提供ではない。

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へ移す発表ではない。