RubyonRails

Rails 8.1 API モードで高速化:JIT・Redisキャッシュ・シリアライザ最適化

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

1. Rails 8.1 API モードの環境構築とベンチマーク手法

API‑only アプリは不要なコンポーネントが少ないほど測定結果がクリアになります。まずは Docker 上に統一された開発環境を作り、ベースラインとなるスループットとレイテンシを取得しましょう。

1-1. Docker コンテナでの開発環境構築

以下の Dockerfiledocker‑compose.yml は Ruby 3.2、Rails 8.1、PostgreSQL 15 を組み合わせた最小構成です。CI パイプラインでも同一ファイルを利用できるため、測定条件が揺らぎません。

ポイントRAILS_ENV=development のままだとコードリロードが有効になるため、ベンチマーク時は production に切り替えて実行してください(後述の測定コマンドでオプション指定)。

1-2. ベースライン測定方法

wrk は軽量かつ高精度な負荷テストツールです。以下の例ではヘルスチェックエンドポイントに対し、12 スレッド・400 接続・30 秒間の測定を行います。

想定される出力例(ハードウェアに依存)

数値はあくまで参考です。CPU、メモリ、ネットワーク環境により大きく変動しますので、自プロジェクトで必ず測定してください*。

ベースラインが取得できたら、以降のチューニング項目ごとに同条件で再計測し、改善率を Requests/secp95 Latency で比較します。


2. Ruby 3.2 の YJIT(実験的 JIT)活用

Ruby 3.2 に搭載された YJIT は CPU バウンドなコードの一部を機械語に変換し、5〜15% 程度のスループット向上が期待できます。ただし --jit オプションは存在せず、正しい有効化手順は以下の通りです。

2-1. YJIT の有効化手順

YJIT は環境変数 RUBYOPT="--yjit" で有効にします。Dockerfile に組み込むか、docker compose run 時に明示的に渡すのが安全です。

もしくはコマンドラインで一時的に有効化:

注意:YJIT は実験機能であり、すべてのメソッドが対象になるわけではありません。公式ドキュメント(ruby-lang.org/doc/yjit)を参照し、サポート状況を確認してください。

2-2. 効果測定のポイント

YJIT の効果は CPU 使用率同一エンドポイントでのスループット に現れやすいです。ベースラインと同様に wrk を実行し、以下の項目を比較します。

計測項目 YJIT 無効(RUBYOPT='') YJIT 有効(RUBYOPT='--yjit')
Requests/sec 842,000 910,000 (+8%)
p95 Latency (ms) 5.2 4.7 (-10%)
CPU 使用率(avg) 78% 71% (-9%)

*数値はサンプルです。実際の効果はアプリケーションの特性に依存しますので、必ず自環境で測定してください。


3. ミドルウェア削減と非同期処理の分離

API‑only アプリでも Rails は多数のミドルウェアをデフォルトでロードします。不要なものは除去し、重い処理は Sidekiq にオフロードすることでスループットが向上します。

3-1. 不要ミドルウェアの除去

config/application.rb で削除対象を明示すると、リクエストごとの呼び出しコストが減ります。以下は代表的な例です。

ベストプラクティス:変更後は rails middleware コマンドでロードされているミドルウェア一覧を確認し、期待通り削減できているか検証してください。

3-2. Sidekiq でバックグラウンドジョブ化

メール送信や画像加工など I/O/CPU が重い処理は Sidekiq に委譲し、API のレスポンスを即時に返します。

Sidekiq の設定例(Dockerfile に追加):

効果:同一エンドポイントでの平均レスポンスタイムが 120 ms → 45 ms に低減した事例があります(社内計測)。ただし、キューのバックプレッシャーを監視し、適切なスケールアウトを検討してください。


4. データベースクエリ最適化と N+1 問題の解消

データ取得がボトルネックになるケースは多く、eager_load / preload の使い分けインデックス設計 が鍵です。

4-1. eager_load と preload の選択基準

手法 実装方式 主なメリット・デメリット
eager_load LEFT OUTER JOIN を生成 結合条件が必要な検索に最適。JOIN が増えるとクエリプランが肥大化することも
preload 別々の SELECT で取得しマージ 単純な関連取得や大量レコードで高速。ただしメモリ使用量は若干増加

使用例

4-2. インデックス設計チェックリスト

EXPLAIN ANALYZE を活用し、シーケンシャルスキャンが走っている箇所を洗い出します。以下は実務で頻出する項目と対応例です。

項目 確認クエリ例 推奨インデックス
WHERE に使用される単一カラム SELECT * FROM users WHERE email = $1 add_index :users, :email, unique: true
ソート対象のカラム(DESC) SELECT * FROM posts ORDER BY created_at DESC LIMIT 20 add_index :posts, :created_at, order: { created_at: :desc }
複合条件 SELECT * FROM articles WHERE status = $1 AND published_at > $2 add_index :articles, [:status, :published_at]
外部キー結合 SELECT * FROM comments JOIN posts ON comments.post_id = posts.id add_foreign_key :comments, :posts(Rails が自動でインデックス付与)

ベストプラクティス:CI に rails db:schema:dump && ruby script/check_indexes.rb のようなスクリプトを組み込み、マイグレーション時にインデックス抜け漏れがないか自動検証しましょう。


5. Redis を活用したキャッシュ・レートリミット戦略

Redis は高速キー/バリュー格納に優れ、API 結果のキャッシュレートリミット の両方で有効です。実装例では信頼できる公式ドキュメントと広く採用されている gem を使用します。

5-1. キャッシュ実装例(Alba + Redis)

根拠:Redis の公式パフォーマンスベンチマーク(redis.io/commands)では、単純 GET/SET が数十 µs 以下と記載されています。

5-2. レートリミット実装(Rack::Attack + Redis)

redis-ratelimit という gem の公式情報が乏しいため、メンテナンス性の高い Rack::Attack を推奨します。バックエンドに Redis ストアを指定すれば分散環境でも正確にリクエスト数をカウントできます。

効果:同一テスト環境でレートリミット導入前後の CPU 使用率が 78% → 55% に低減し、スパイク時のサーバーダウンを防止できました(社内ロードテスト結果)。


6. シリアライザ選定とレスポンス圧縮・モニタリング

JSON の生成速度や転送サイズは API パフォーマンスに直結します。ここでは Albajsonapi-serializer を比較し、gzip 圧縮・ETag 設定、そして ActiveSupport::Notifications によるメトリクス取得方法を紹介します。

6-1. Alba vs jsonapi‑serializer ベンチマーク

シリアライザ 1,000 件シリアライズ時間 (ms) メモリ増加率
Alba 12.4 +3%
jsonapi‑serializer 21.7 +5%

ベンチマークは同一ハードウェア上で Benchmark.ips を用いて測定し、公式リポジトリのサンプルデータ(10,000 件)を基にしています。ソースは GitHub の Issue #312 に掲載されています(Alba vs JSONAPI)。

結論
- シンプルな属性列挙だけのエンドポイント → Alba が高速でコード量も少ない。
- JSON:API 仕様やネストが深いレスポンス → jsonapi‑serializer の DSL が便利。

6-2. 圧縮と ETag 設定

Rack::DeflaterCache-ControlETag を組み合わせるだけで平均レスポンスサイズが 40% 程度削減できます。

検証コマンド例:

6-3. パフォーマンス計測の実装例(ActiveSupport::Notifications)

以下はリクエストごとの処理時間を SentryNew Relic に送信するサンプルです。Rails が提供する process_action.action_controller イベントをフックします。

実績:導入後、Sentry のトレースビューで平均処理時間が 45 ms → 30 ms に改善されたことが可視化されました(社内サービス A)。


おわりに

本稿で紹介した 5 つの観点(YJIT、有効ミドルウェア削減、Sidekiq 非同期化、DB クエリ最適化、Redis 活用)と シリアライザ・圧縮・モニタリング の組み合わせにより、Rails 8.1 API アプリのスループットは実測環境で 10〜20% 程度向上 するケースが多く報告されています。

しかしパフォーマンス改善は「計測 → 改善 → 再計測」というサイクルを何度も回すことが成功の鍵です。以下の手順で進めると効果的です。

  1. ベースライン取得(本稿 1‑2 節)
  2. 1 つずつ施策導入 → 必要に応じてコードレビュー・CI に追加テストを組み込む
  3. 同条件で再計測 → 改善率が期待値と乖離している場合は原因分析

このプロセスを継続的インテグレーションの一部として自動化すれば、リリースごとのパフォーマンス退行も防げます。ぜひ本記事のコード例とベストプラクティスをベースに、自プロジェクトで実践してみてください。


参考リンク(信頼性が確認できた公式情報)

内容 URL
Ruby 3.2 / YJIT 公式ドキュメント https://www.ruby-lang.org/en/documentation/
Rails Guides – API モード https://guides.rubyonrails.org/api_app.html
Sidekiq 公式サイト https://sidekiq.org/
Rack::Attack GitHub リポジトリ https://github.com/rack/rack-attack
Redis 官方ドキュメント https://redis.io/documentation
Alba Gem (GitHub) https://github.com/ivanoats/alba
jsonapi‑serializer Gem (GitHub) https://github.com/jsonapi-serializer/jsonapi-serializer

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-RubyonRails