【Rust】ウェブフレームワーク比較: axum vs actix-web vs rocket

本記事では、Rustで最も人気のある3大ウェブフレームワーク「axum」「actix-web」「rocket」について、それぞれの特徴、利点・欠点、パフォーマンス、使いやすさなどを2025年最新の情報に基づいて徹底比較します。

## 比較するフレームワークの概要

まずは3つのフレームワークの基本情報を簡単に整理します。

| 特性 | axum | actix-web | rocket |
|------|------|-----------|--------|
| 初リリース | 2021年7月 | 2017年10月 | 2016年 |
| 最新バージョン | 0.7.x（2025年5月現在） | 4.4.x（2025年5月現在） | 0.6.x（2025年5月現在） |
| GitHub Stars | 9,000+ | 19,000+ | 21,000+ |
| crates.ioダウンロード数 | 8.5M+ | 11M+ | 6M+ |
| 開発者/組織 | Tokioチーム | Actixプロジェクト | Sergio Benitez他 |
| 非同期ランタイム | Tokio | Tokio | Tokio（0.5以降） |
| ルーティング方式 | 関数ベース | マクロベース | マクロベース |
| 依存関係 | Tokio, Hyper, Tower | 独自抽象化（一部Tokio） | 独自HTTP型と抽象化 |
| マクロ依存度 | 低（型ベース） | 中 | 高（宣言的スタイル） |
| 安定版Rust対応 | はい | はい | はい（0.5以降） |

## フレームワークの特徴と適性

各フレームワークの詳細な特徴と、それぞれがどのようなプロジェクトに適しているかを見ていきましょう。

### axum

#### 強み

- **Tokioエコシステムとの統合**: TokioとHyperを基盤としており、これらのライブラリとのシームレスな統合が可能
- **Tower Middlewareサポート**: レート制限やトレーシングなどの機能を簡単に追加可能
- **型安全なAPI**: マクロに頼らず、Rustの型システムを活かした設計でコンパイル時エラー検出が可能
- **モジュール性**: 小さなコンポーネントを組み合わせて構築する設計哲学
- **開発の活発さ**: Tokioチームによって活発に開発・メンテナンスされている
- **最新のやり方に沿った設計**: 「今後の方向性を示している（"where the puck is headed"）」と言われており、非同期エコシステムとの相互運用性に優れる

#### 弱み

- **複雑なコンパイルエラー**: 高度な型システムの活用により、初心者にはエラーメッセージが理解しづらいことがある
- **比較的若いフレームワーク**: 2021年に登場したため、他の二つに比べるとエコシステムがやや小さい
- **エンタープライズ向け機能**: 一部の機能は自分で実装するか、サードパーティのクレートに頼る必要がある
- **ローレベルなフレームワーク**: 足場組み（scaffolding）やOpenAPI連携などの機能が標準では不足
- **タイムアウト機能の欠如**: スロリス（Slowloris）攻撃などに対する保護機能が標準では不足

#### 適したプロジェクト

- Tokioエコシステムを活用したいプロジェクト
- マイクロサービスやAPIサーバー
- 高いパフォーマンスと柔軟性が求められるプロジェクト
- モジュール性とテスト容易性を重視するプロジェクト

### actix-web

#### 強み

- **最高レベルのパフォーマンス**: 多くのベンチマークでRustウェブフレームワークで最速とされる
- **成熟度と安定性**: 2017年から開発されており、多くの本番環境での使用実績がある
- **豊富な機能**: WebSocketsやHTTP/2、TLSなど、多くの機能が標準で組み込まれている
- **スケーラビリティ**: アクターモデルの恩恵を受けた設計により、高い並行性と耐障害性を持つ
- **広範なエコシステム**: 長い歴史から派生した多くのプラグインや拡張が利用可能
- **高い耐障害性**: 「過酷な条件下でも耐えるように設計されている大型マシン」と表現される堅牢性

#### 弱み

- **学習曲線**: アクターモデルの概念や独自のライフサイクルがあり、初心者には理解しづらい部分がある
- **過去のセキュリティ課題**: 過去にはunsafeコードの使用について批判を受けた（現在は解決済み）
- **他のライブラリとの統合**: 独自の実装が多いため、一部ライブラリとの連携が複雑になることがある
- **WebSocketの扱いにくさ**: WebSocketの実装は高スループットを重視しており、メッセージ配信の認識が難しい場合がある

#### 適したプロジェクト

- 極限のパフォーマンスが求められるプロジェクト
- 高トラフィックのウェブサイトやAPIサーバー
- 複雑なHTTP機能を必要とするアプリケーション
- スケーラビリティと耐障害性が重要なミッションクリティカルなシステム

### rocket

#### 強み

- **優れた開発者体験**: マクロを活用した宣言的なAPIにより、少ないコードで多くのことができる
- **強力な型安全性**: リクエストガード、フォーム処理、JSONハンドリングなどで型安全性を重視
- **包括的な機能**: テンプレートエンジン、フォーム処理、ファイルアップロードなど、多くの機能が標準で利用可能
- **充実したドキュメント**: 初心者向けのガイドから高度な使用例まで、詳細なドキュメントが提供されている
- **Fairings**: フックポイントを提供するFairingsシステムにより、柔軟なミドルウェア機能を実現

#### 弱み

- **パフォーマンス**: 他の2つに比べるとやや性能が低い傾向がある（最近のバージョンで改善）
- **開発の不安定性**: 過去に長期間更新が止まった時期があり、開発のペースが不安定
- **独自のHTTP型**: 独自HTTP型のため、他のライブラリとの連携時に変換が必要になる
- **マクロ依存**: 多用されるマクロは学習曲線を高め、IDE連携やエラー理解を難しくする
- **非同期サポートの遅れ**: 非同期プログラミングのサポートが他のフレームワークより遅れていた

#### 適したプロジェクト

- 短期間で機能豊富なアプリケーションを構築したいプロジェクト
- 開発効率と保守性を重視するプロジェクト
- MonolithicなWebアプリケーション
- 型安全性を最大限に活用したいプロジェクト

## 詳細比較

### 機能比較

| 機能 | axum | actix-web | rocket |
|------|------|-----------|--------|
| ルーティング | 関数ベース | マクロベース | マクロベース |
| ミドルウェア | Tower | 独自 + Tower互換 | Fairings |
| Webソケット | 優れた統合 | 標準サポート（やや複雑） | 追加クレート必要 |
| 静的ファイル | tower-http経由 | 標準サポート | 標準サポート |
| フォーム処理 | あり（抽出機能） | あり | あり（強力） |
| JSONサポート | serde統合 | serde統合 | serde統合 |
| バリデーション | 外部クレート依存 | 外部クレート依存 | リクエストガード |
| テンプレートエンジン | 外部クレート依存 | 外部クレート依存 | 標準サポート |
| データベース統合 | 外部クレート依存 | 外部クレート依存 | 外部クレート依存 |
| HTTP/2サポート | hyper経由 | あり | あり |
| TLSサポート | rustls経由 | rustls/native-tls | rustls |
| OpenAPI統合 | 外部クレート | 外部クレート | 外部クレート |

### パフォーマンス比較

2025年5月の最新ベンチマークに基づくパフォーマンス比較です。

#### リクエスト処理速度 (req/sec)

| フレームワーク | シンプルリクエスト | JSONリクエスト | DB操作を含むリクエスト |
|------------|-------------|-------------|--------------------|
| actix-web  | 192,000     | 127,000     | 68,000            |
| axum       | 188,000     | 122,000     | 65,000            |
| rocket     | 140,000     | 98,000      | 52,000            |

#### メモリ使用量 (MB)

| フレームワーク | 静止時 | 負荷時 |
|------------|------|------|
| actix-web  | 22   | 48   |
| axum       | 18   | 45   |
| rocket     | 20   | 62   |

#### レイテンシ (ms、p99)

| フレームワーク | シンプルリクエスト | 複雑なリクエスト |
|------------|-------------|------------|
| actix-web  | 1.2         | 8.5        |
| axum       | 1.3         | 8.7        |
| rocket     | 1.8         | 11.2       |

### 学習と開発体験の比較

| 側面 | axum | actix-web | rocket |
|------|------|-----------|--------|
| 学習曲線 | 中程度 | 急 | 緩やか |
| コード量 | 中程度 | やや多い | 少ない |
| エラーメッセージの分かりやすさ | 中程度（debug_handler機能あり） | 中程度 | 初心者向け |
| ドキュメント品質 | 良い | 良い | 非常に良い |
| チュートリアル/例 | 増加中 | 多い | 非常に多い |
| IDE連携 | 良い | 良い | マクロにより一部制限あり |
| コミュニティサポート | 活発（急成長中） | 安定 | やや不安定 |
| エコシステム統合度 | 非常に高い（Tokio） | 中程度 | 独自世界 |

### コミュニティの動向と成長

| 指標 | axum | actix-web | rocket |
|------|------|-----------|--------|
| GitHub活動（年間コミット） | 多い | 中程度 | 少ない |
| 新規プロジェクトでの採用率 | 高い（増加中） | 中程度 | 低下傾向 |
| Stack Overflowの質問数 | 増加中 | 多い | 多い（やや停滞） |
| クレート依存者数 | 急増中 | 安定 | やや停滞 |
| 企業での採用例 | 増加中 | 多い | 中程度 |

## 開発者の声

各所で収集した、実際に複数のフレームワークを使用した開発者の声を紹介します。

### すべてのフレームワークを使用した開発者の声

3つのフレームワークすべてを使用した開発者は次のように述べています：

> 「actix-webは最も昔に使用し、使いこなすのが一番難しかった。各リクエストはシングルスレッドコンテキストで処理されるモデルを持っており、多くのライブラリでは期待される'Send'トレイトを実装できないため、使いづらかった。ただし、非常に高いスループットシナリオでは最速。」
>
> 「rocketは落ちついた期間中に使い始めた。今でも一部のアプリケーションで使用している。唯一煩わしいのは独自のHTTP型を持っているため、変換作業が多いこと。」
>
> 「axumは将来の方向性を示している。非同期エコシステムで定着したライブラリとの相互運用性が最も優れている。コンパイルエラーは特性マジックの多用により混乱することがあるが、WebSocketの設定が最も簡単だった。また、多くのマクロを必要としないのも良い点。」

### actix-webの本番環境での経験

actix-webを本番環境で使用した開発者は、パフォーマンス面での優位性がビジネスロジックに与える影響についてやや否定的な意見を述べています：

> 「actix-webでの本番環境経験から言えることは、ビジネスロジックで意味のあることを行っている限り、HTTPパフォーマンスで上限に達することは不可能だ。おそらくaxumも同様だろう。rocketはその限りではないかもしれないが。」

この開発者はまた、WebSocketについてはaxumを推奨しています：

> 「WebSocketを使用したい場合は、axumを選ぶべきだ。actix-webでのWS体験は良くない。すべてのライブラリがスループットに偏っており、HTTPサーバーがメッセージの実際の配信を認識できない。」

### チーム採用の観点から

あるチームのメンバーは、フレームワーク選択の過程について次のように共有しています：

> 「チームが最初にRustに取り組み始めた時、いくつかの異なるバックエンドを試してみたが、どれも本当に気に入るものはなかった。axumが登場したとき、切り替えて以来、振り返ることはなかった。」

### コミュニティの傾向

コミュニティ全体の傾向としては：

> 「axumは明らかにコミュニティのお気に入りになっている。特別な理由がない限り、axumを使うべきだ - より多くの例、より多くの開発者の投資、より多くのライブラリの相互運用性の恩恵を受けられる。」

> 「Tokioのプロジェクトであるaxumが主役だ。機能を拡張するためのライブラリも豊富にある。基本的に必要なものはすべてaxumで実現できる。唯一の欠点は、低レベルなフレームワークであることかもしれない。Ruby on RailsやLaravelのようなものを期待しないこと。」

### rocketの開発状況に関する懸念

rocketの開発状況については：

> 「0.5は既に18ヶ月経過しており、開発は再び停滞気味になり、ほぼ死にかけている」

> 「長い不在の後、いくつかの遅れを取り戻す必要がある」

## ユースケース別の推奨フレームワーク

各フレームワークがどのようなユースケースに適しているかを表にまとめました。

| ユースケース | 推奨フレームワーク | 理由 |
|------------|--------------|------|
| 高トラフィックAPIサーバー | actix-web または axum | 最高レベルのパフォーマンスと安定性 |
| マイクロサービス | axum | Tokioエコシステムとの統合性、モジュール性 |
| フルスタックWebサイト | rocket | 組み込み機能の豊富さ、開発効率 |
| WebSocketベースアプリ | axum | WebSocket実装の扱いやすさ |
| 企業向け大規模システム | actix-web | 実績と安定性、耐障害性 |
| オープンソースプロジェクト | axum | コミュニティの勢い、最新技術との統合 |
| 教育・学習用プロジェクト | rocket | 易しい学習曲線、ドキュメントの充実 |
| プロトタイピング | rocket または axum | 少ないコード量、迅速な開発 |

## 導入負荷の比較

新しいプロジェクトを始める際の各フレームワークの導入負荷を比較します。

| 段階 | axum | actix-web | rocket |
|------|------|-----------|--------|
| 初期セットアップ | 簡単 | 簡単 | 非常に簡単 |
| 基本ルーティング | 少しコード必要 | マクロで簡単 | マクロで非常に簡単 |
| 認証実装 | 自前かライブラリ必要 | 複数の選択肢あり | 組み込み機能充実 |
| データベース接続 | 明示的な構成必要 | 明示的な構成必要 | 若干抽象化あり |
| テストの容易さ | 非常に良い | 良い | 良い |
| CI/CD構成 | 標準的 | 標準的 | 標準的 |
| 本番デプロイ | 柔軟 | 柔軟 | やや制約あり |

## 結論：どのフレームワークを選ぶべきか

これまでの比較と実際の開発者の声を踏まえて、プロジェクトの特性に基づいた選択指針をまとめます。

### axumを選ぶべき場合

- Tokioエコシステムを活用したい
- 型安全性と高いパフォーマンスの両方を求めている
- マクロよりも明示的なAPIを好む
- マイクロサービスやモジュール化されたアプリケーションを開発している
- コミュニティの成長と継続的な改善を重視している
- WebSocketsを重要視している

### actix-webを選ぶべき場合

- 最高レベルのパフォーマンスが最優先事項
- 成熟したエコシステムと長期的な安定性を求めている
- 高負荷環境での運用実績を重視している
- Rustに十分慣れており、学習曲線の急さが問題でない

### rocketを選ぶべき場合

- 開発効率と使いやすさを最優先している
- 短時間で機能豊富なWebアプリケーションを構築したい
- マクロを活用した宣言的なスタイルを好む
- 内蔵された多くの機能を活用したい
- Rust初心者で、学習曲線を緩やかにしたい

## 最終的な推奨

2025年現在の状況と実際の開発者の声を総合的に判断すると：

1. **新規プロジェクトのデフォルト選択**: axum
   - Tokioチームのサポート、活発な開発、優れたパフォーマンス、型安全なAPIのバランスが優れています。
   - コミュニティでも「明らかなお気に入り」として広く認識されており、多くの開発者がこのフレームワークに移行しています。

2. **極限のパフォーマンスが必要な場合**: actix-web
   - ベンチマークで常にトップクラスのパフォーマンスを示しています。
   - 「過酷な条件下でも耐えるように設計されたマシン」として、高負荷環境での実績があります。

3. **開発速度と使いやすさを優先する場合**: rocket
   - 特に小〜中規模のプロジェクトで、短期間で機能を実装したい場合に適しています。
   - ただし、開発の継続性については懸念があるため、長期的なプロジェクトでは慎重に検討する必要があります。

2000人程度のユーザーを想定した中規模プロジェクトであれば、パフォーマンスだけで見れば、どのフレームワークも十分な性能を持っているという意見もあります。開発チームの好みや既存のスキルセット、プロジェクトの特性に基づいて選択することが重要ではないでしょうか。

## 参考資料

- [axum公式リポジトリ](https://github.com/tokio-rs/axum)
- [actix-web公式サイト](https://actix.rs/)
- [rocket公式サイト](https://rocket.rs/)
- [Rust Web Framework Comparison](https://github.com/flosse/rust-web-framework-comparison)
- [TechEmpower Web Framework Benchmarks](https://www.techempower.com/benchmarks/)
- [Rust Web Framework Benchmark 2025](https://markaicode.com/rust-web-frameworks-performance-benchmark-2025/)