- Non-Rustサーバー(JavaScript、Python、Java など)に段階的に Rust を追加する戦略を紹介
- CPU ボトルネックにより性能要件を満たせないホット関数を特定し、Rust で置き換え実装することが目標
- 戦略は Tier(Rust 採用レベル)で区分され、Tier 0 は Rust 未使用、最後の Tier はサーバー全体を Rust に書き換える
戦略
Tier 0: Rust未使用
- Node.js サーバーで QR コード生成エンドポイントを実装
- 基準性能: 1秒あたり1464リクエスト、平均レイテンシ68ms、p99レイテンシ96ms、平均レスポンスサイズ1506バイト、メモリ1353MB
Tier 1: Rust CLIツール
- QR コード生成関数を Rust で書き直し、CLI ツールとしてコンパイル
- ホストサーバーから CLI ツールを呼び出す
- 基準比の性能: 秒間リクエスト数1.76倍増加、平均レイテンシ0.57倍に減少、平均レスポンスサイズ0.52倍に減少、メモリ0.92倍に減少
Tier 2: Rust Wasmモジュール
- Rust 関数を Wasm モジュールにコンパイルし、ホストサーバーで Wasm ランタイムを使ってロードおよび実行
- Node.js サーバーでは
wasm-bindgen を使用
- 基準比の性能: 秒間リクエスト数2.03倍増加、平均レイテンシ0.50倍に減少
- Wasm バインディングを手動で作成する方法も説明(他言語ユーザー向け)
Tier 3: Rustネイティブ関数
- Rust で関数を作成し、ネイティブコードにコンパイルして、ホストランタイムでロードおよび実行
- Node.js では
napi-rs を使用
- 基準比の性能: 秒間リクエスト数3.75倍増加、平均レイテンシ0.26倍に減少
Tier 4: Rustへの書き換え
- ホストサーバー全体を Rust に書き換え
- 実際にはホストサーバーの一部だけを書き換えるのが現実的
- 基準比の性能: 秒間リクエスト数4.93倍増加、平均レイテンシ0.21倍に減少、メモリ0.01倍に減少(13MB使用)
結論
- どの戦略も有効だが、Tier 3 が最も効果的
- 既製のバインディング生成ライブラリを使えるなら、Rust でネイティブ関数を書くのは簡単で、性能への効果も大きい
4件のコメント
おお……いろいろなことを何でも屋みたいにやっているうちに、両方を少しずつ使うようになったのですが、とても参考になる情報ですね。
最近Rustを見ているんですが、興味深い記事ですね。
かなり良い記事ですね。こういうのが Rust をきちんと使った例でしょう。
以前はC/C++で解決していた領域でも、確実にRustの人気が高まっているようですね。