26 ポイント 投稿者 xguru 2024-11-02 | 4件のコメント | WhatsAppで共有
  • 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件のコメント

 
readiz 2024-11-06

おお……いろいろなことを何でも屋みたいにやっているうちに、両方を少しずつ使うようになったのですが、とても参考になる情報ですね。

 
johnnydev 2024-11-04

最近Rustを見ているんですが、興味深い記事ですね。

 
cosine20 2024-11-04

かなり良い記事ですね。こういうのが Rust をきちんと使った例でしょう。

 
regentag 2024-11-02

以前はC/C++で解決していた領域でも、確実にRustの人気が高まっているようですね。