1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Cloudflare WorkersのEmscripten対応が発表されたので試してみる

1
Posted at

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に移植しつつ、今回発表の機能を盛り込んでみました。

screenshot_top.png

認証不要・無料で、ブラウザ・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側の処理に渡し、進捗通知として送っています。実際に呼び出すと、時間を空けて文字列が順番に届き、最後に生成結果の一覧が返ってきました。

image.png

無事、Tokioが動いているようです :raised_hands:

ただ、ストリーミングはそのままでは動かないようでした。
レスポンスを返し始めた後も生成処理を続けられるよう、送信が終わるまでTokioのランタイムを保持する構成にしたようです。(おチャピさんが)
Rust側のデータをWorkers側のストリームへ渡す部分にも、橋渡しの処理が入っています。

Workersで時間待ちやストリーミングを行うこと自体は、以前から可能です。今回は、Tokioのタスク・タイマー・チャネルを使った処理を、MCPと組み合わせてWorkers上で動かせることを確認しました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?