DiffDaily

Deep & Concise - OSS変更の定点観測

[Rails] ActionController::Liveの遅延読み込みとload hookの導入

rails/rails

背景

Railsでは、ActionController::Liveを使用していない場合でも、ActionControllerがロードされると同時にActionController::Liveも読み込まれてしまう問題がありました。この変更は#56393のフォローアップとして、必要になるまでActionController::Liveの読み込みを遅延させることで、不要なモジュールの早期読み込みを回避します。

技術的な変更内容

load hookの追加

ActionController::Liveモジュールに新しいload hook action_controller_liveが導入されました。

actionpack/lib/action_controller/metal/live.rb:

ActiveSupport.run_load_hooks(:action_controller_live, self)

これにより、ActionController::Liveが実際に使用されるタイミングでload hookが実行されるようになります。

設定の遅延適用

initializer内での設定適用が、load hookでラップされるように変更されました。

変更前:

initializer "action_controller.live_streaming_excluded_keys" do |app|
  ActionController::Live.live_streaming_excluded_keys = app.config.action_controller.live_streaming_excluded_keys
end

変更後:

initializer "action_controller.live_streaming_excluded_keys" do |app|
  ActiveSupport.on_load(:action_controller_live) do
    ActionController::Live.live_streaming_excluded_keys = app.config.action_controller.live_streaming_excluded_keys
  end
end

この変更により、live_streaming_excluded_keysの設定はActionController::Liveが実際にロードされるまで適用されません。

利用方法

新しく追加されたaction_controller_live load hookは、以下のように使用できます。

ActiveSupport.on_load(:action_controller_live) do
  # ActionController::Liveがロードされた時点で実行される処理
  ActionController::Live.some_configuration = custom_value
end

パフォーマンスへの影響

この変更により、ActionController::Liveを使用しないアプリケーションでは、以下の利点があります。

  • 起動時のメモリ使用量の削減
  • 初期化時間の短縮
  • 不要なモジュールの読み込みを回避

SSE(Server-Sent Events)やストリーミングレスポンスを使用しないアプリケーションでは、ActionController::Liveは完全に読み込まれなくなります。

まとめ

この変更は、Railsの起動時のパフォーマンス最適化の一環として、必要なモジュールのみを遅延読み込みする取り組みの一部です。load hookを活用することで、機能の利用可否に応じた柔軟なモジュール読み込みが実現されています。