Vercel Functionsは、インフラ管理やサーバープロビジョニング、ハードウェアのアップグレードなしでオンデマンドでコードを実行できるサービス。今回、内部でRustを採用し、高速化を実現した。
新しいデプロイには段階的に適用され、数週間以内に全ての顧客が新しいRust製のfunctionsを利用できるようになる。ユーザー側で必要な作業はない。
新システムではこれまでに数十億回の実行を処理。実行速度が向上し、コストも若干低下した。Rustへの移行により以下のような改善が見られた:
- 小規模なワークロードでコールドスタートが30%高速化
- 大規模なワークロードで平均80ms、99パーセンタイルで500ms高速化
Rust採用した理由
Vercel Functionsには、レスポンスのストリーミング、Web APIベースのシグネチャ、自動再帰防止など、新機能が追加されてきた。
パフォーマンス改善のため、起動時と実行時のロジックを低レベル言語で書き直す機会が見られた。Node.jsからRustに移行することで、大幅なパフォーマンス向上が期待できることが早期の実験で明らかになった。
以下の部分がRustで最適化された。
- 環境変数の読み込みとアタッチ
- Node.jsプロセスの起動
- チャンク化されたレスポンスのストリーミングと暗号化
- 関数呼び出し完了前の
waitUntil
APIの使用
どれくらい高速化されたのか
合成ベンチマークでは、Rustを採用したVercel Functionsが平均150ms高速だった。
実際のワークロードでテストしたところ、Node.jsからRustにロジックを移行することで、大規模なワークロードで平均80ms、99パーセンタイルで500msの高速化を達成。
ストリーミング時、functionsは最寄りのVercel Edge Networkリージョンに接続する。Rustにより、この接続時間が平均47%(21ms→11ms)、99パーセンタイルで77%(120ms→27ms)短縮された。
その結果、顧客に請求される実行時間が若干短くなり、同じワークロードでコストが少し下がる。Next.js App Routerなどストリーミングレスポンスを生成するフレームワークや、スタンドアロンのVercel Functionsも高速化される。
また、新しいデプロイにおけるリージョナルルーティングも改善され、レイテンシーがさらに減少。ダッシュボードからCPUとメモリオプションも簡単に選択できるようにもなった。