[Rails] ActionController::Liveの遅延読み込みとload hookの導入
背景
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を活用することで、機能の利用可否に応じた柔軟なモジュール読み込みが実現されています。