Cloudflareで、Tokioを使ったRustアプリケーションをWorkersで動かすための実験的な対応が発表されました。
(ブラウザ翻訳)本日、ネイティブのRustコード、さらにはWorkers上でネイティブに実行されるTokioベースのアプリケーションをより良くサポートするための機能の最初の公開実験プレビューを発表します。これは、wasm-bindgenオープンソースツールチェーンとCloudflareのRust WorkersにおけるEmscripten wasm32-unknown-emscripten Rustコンパイラターゲットのファーストクラスのサポートです。
仕組みはよく把握していませんが、なんとなくで試してみました。
できたもの
以前作った Haikunator Generator via Loco(Rust) ですが、ホストしていたShuttle.devがサービス終了していたので、これをCloudflare Workersに移植しつつ、今回発表の機能を盛り込んでみました。
認証不要・無料で、ブラウザ・REST API・MCPから利用できます。
サービスの本質とは無関係ですが、今回発表の機能を試すため、Tokioのタイマーを使って複数個の生成文字列が時間差で返ってくる機能を新たに追加しました。
試したこと
ビルドには、workers-rsのworker-buildに --emscripten を付ければよさそうでした。
worker-build --emscripten --release --locked
コンパイル先は wasm32-unknown-emscripten です。
今回は、workers-rsの experimental_tokio 機能を有効にし、Tokioのパッチも使っています。
まだ実験的な対応なので、利用するSDKやツールのリビジョンを固定した構成にしました。
Tokioは MCPツールの gen_continuous で使いました。
生成担当のタスクを tokio::spawn で開始し、次のように生成前に待ち時間を入れています。
tokio::time::sleep(Duration::from_millis(interval_ms)).await;
生成した文字列はチャネルでMCP側の処理に渡し、進捗通知として送っています。実際に呼び出すと、時間を空けて文字列が順番に届き、最後に生成結果の一覧が返ってきました。
無事、Tokioが動いているようです ![]()
ただ、ストリーミングはそのままでは動かないようでした。
レスポンスを返し始めた後も生成処理を続けられるよう、送信が終わるまでTokioのランタイムを保持する構成にしたようです。(おチャピさんが)
Rust側のデータをWorkers側のストリームへ渡す部分にも、橋渡しの処理が入っています。
Workersで時間待ちやストリーミングを行うこと自体は、以前から可能です。今回は、Tokioのタスク・タイマー・チャネルを使った処理を、MCPと組み合わせてWorkers上で動かせることを確認しました。

