Cloudflare WorkersでネイティブRustコードをサポートする新しいEmscriptenターゲット
Supporting native Rust in Workers with the new Emscripten target for wasm-bindgen
Cloudflareは、Workers上でネイティブRustコードやTokioベースのアプリケーションをより良くサポートするための新機能を実験的にプレビュー公開しました。これは、wasm-bindgenオープンソースツールチェーンとCloudflareのRust WorkersにおけるEmscripten wasm32-unknown-emscripten Rustコンパイラターゲットのファーストクラスサポートを可能にするものです。この機能は、Googleが1年以上前に開始し、Cloudflareのエンジニアがレビューとサポートを行った長期的な取り組みの結果です。この新しいワークフローにより、Web、Node.js、およびCloudflareのグローバルWorkersプラットフォーム上でEmscriptenを使用したネイティブwasm-bindgen Rustアプリケーションを実行できるようになります。テストでは、Rust Workersのライブラリ互換性が大幅に向上しました。具体例として、TokioとTCPイングレスを使用してDurable Object内でネイティブRustのMinecraftサーバー(Pumpkin)を動作させることに成功しました。Emscriptenは、ネイティブコードとWebプラットフォームを連携させ、タイマー、ファイルシステム操作、ソケットなどのネイティブ機能を仮想化するオープンソースのWebAssemblyコンパイラツールチェーンです。Cloudflare WorkersはNode.js互換性もサポートしているため、EmscriptenをWorkers上でサポートし、既存のNode.js API上にネイティブプラットフォーム機能を仮想化しています。また、Tokioサポートにより、Tokioの非同期ランタイムエコシステム上で構築されたRustコードも、このEmscriptenターゲットを通じてJavaScriptベースのホスト環境に統合できるようになりました。これらの実験的なパッチセットとサンプルアプリケーションが提供されており、Emscripten Rust Workersの構築、Worker内でのTokio非同期ランタイムの実行、EmscriptenとTokioを使用したWorker上でのTCPソケットサポートなどが含まれます。GoogleのポータブルツールチェーンチームのMitch Foley氏が、Google内部チームがwasm-bindgenとC++ライブラリの相互運用性を必要としたことから、この機能の必要性を認識しました。この連携は、Emscriptenがビルドを主導し、wasm-bindgenがJavaScriptバインディングを生成する形で行われました。この結果、wasm-bindgenとEmscriptenツールチェーンは、新しい-sWASM_BINDGEN設定の下でシームレスな相互運用性を実現しました。RustライブラリのEmscriptenサポートも進んでおり、多くのライブラリがそのまま動作しましたが、libc、socket2、Mioなどの低レベルライブラリにはパッチが必要でした。特にTokioのサポートは重要で、Cloudflare Workersのシングルスレッド環境とTokioの非同期ランタイムの互換性を確保するために、WebAssembly JavaScript Promise Integration (JSPI) またはイベントループランタイム統合のいずれかのアプローチが必要でした。JSPIサポートでは、スレッドローカルコンテキストの管理が重要となり、イベントループランタイム統合では、Tokioのランタイムをホストのイベントループと協調させる設計が採用されました。ソケットとepollのサポートについては、Emscriptenがepoll_wait()を直接サポートしていないため、Node.jsのnode:net APIを利用する-sNODERAWSOCKETSオプションが導入されました。これにより、Emscriptenアプリケーションでepoll、TCP、UDP、Unixソケットがサポートされるようになりました。Minecraftサーバーの実行テストでは、PumpkinサーバーがDurable Object上で動作し、ファイルシステム操作はworker-fs-mountライブラリを通じてDurable ObjectのSQLiteストレージに保存され、ネットワーク通信はWorkers TCPイングレスを通じて行われました。このネイティブ互換性は、新しいEmscriptenターゲットによって可能になった高度な機能を示しています。
- CloudflareがWorkers上でネイティブRustコードとTokioベースアプリを動かすEmscripten wasm32-unknown-emscriptenターゲット対応を実験的にプレビュー公開した
- Minecraftサーバー(Pumpkin)をTokioとTCPイングレス経由でDurable Object内で動作させることに成功し、ファイルシステムはworker-fs-mountでDurable ObjectのSQLiteストレージに保存された
- Emscriptenがepoll_wait()を直接サポートしないため、Node.jsのnode:net APIを利用する-sNODERAWSOCKETSオプションを導入し、epoll・TCP・UDP・Unixソケットを扱えるようにした
- wasm-bindgenとEmscriptenツールチェーンが新しい-sWASM_BINDGEN設定で相互運用し、Emscriptenがビルドを主導しwasm-bindgenがJavaScriptバインディングを生成する形になった
- GoogleのポータブルツールチェーンチームのMitch Foley氏がwasm-bindgenとC++ライブラリの相互運用性の必要性から起点を作り、Cloudflareエンジニアがレビューとサポートを担当した
- libc、socket2、Mioなどの低レベルRustライブラリはそのままでは動作せずパッチが必要だった
Cloudflare WorkersがEmscripten wasm32-unknown-emscriptenターゲットを実験的にサポートし、ネイティブRustやTokio製アプリをエッジ上で動かせるようになった点は、エッジコンピューティング基盤の実行環境競争における差別化材料になる。特にNode.js互換API上にepoll/TCP/UDP/Unixソケットを仮想化し、Durable Object内でMinecraftサーバー(Pumpkin)を実際に動作させた実証は、これまでCDNエッジでは難しかったステートフルなサーバーワークロードを取り込む可能性を示す。Googleのポータブルツールチェーンチームとの長期協業やwasm-bindgen/Emscriptenの相互運用改善は、Workersのライブラリ互換性を高め開発者ロックインを強める効果が期待でき、Cloudflareのエッジ事業の付加価値と競合(AWS Lambda@Edge、Fastly、Deno Deploy等)に対する優位性を注視したい。ただし現段階は実験的プレビューであり、商用化・収益化のタイムラインは不透明。