LoginSignup
4
3

More than 1 year has passed since last update.

うまく使えばレスポンスが爆速に Rails 7から導入されたload_asyncについて解説

Posted at

今回はRails 7から導入された新機能 load_asyncについて解説します!

私のブログにも同じ内容を記載しておりますので、こちらも是非ご参照ください

load_asyncとは

Rails 7から追加された、「非同期的にクエリ実行するためのメソッド」です。

並列にクエリが実行されるため、うまく使うと これまで時間がかかっていた処理をかなり短縮できる「可能性」 があります。

load_asyncの使い方

以下のような場面を想像してみましょう。

mypageを取得するメソッドの中で、「お客様のプロフィール」「お客様の購入履歴」「お客様の獲得ポイント」の3つを取得しています。

def mypage
  @profile = Profile.find_by(user_id: params[:user_id])
  @orders = Order.where(user_id: params[:user_id])
  @points = Point.where(user_id: params[:user_id])
end

ここで、通常であればこの処理は上から順に「プロフィールの取得」=>「購入履歴の取得」=>「獲得ポイントの取得」の順番に進んでいきます。

図で表すと以下のような感じです。
image.png

では、load_asyncを使ってみます。使い方は以下のように各行の末尾にload_asyncをつけるだけです。

def mypage
  @profile = Profile.find_by(user_id: params[:user_id]).load_async
  @orders = Order.where(user_id: params[:user_id]).load_async
  @points = Point.where(user_id: params[:user_id]).load_async
end

ここで、処理は「プロフィールの取得」「購入履歴の取得」「獲得ポイントの取得」が 並列に走ります。

図で表すと以下のような感じです。
image.png

使い方によってはかなりの短縮ができそうですね!

load_asyncの設定

デフォルトでの並列数は 4つ です。これ以上増やす場合は、config.active_record.async_query_executorの設定が必要です

config.active_record.async_query_executor = 5  # クエリを5つ並列に

load_asyncの注意点

一見「全部これでいいのでは」と思えるほど便利なメソッドですが、意外な落とし穴もあります。

トランザクションの挙動に注意

トランザクション内ではload_asyncを使っても直列的な動きになることが考えられます。

参考リンク

データベースのメモリ使用量に注意

並列数をあまりに増やしすぎると、データベースのメモリを過度に使い、逆にパフォーマンスが低下する恐れもあります。
利用する際は、データベースのメモリ使用量に注意し、適度に監視を行いましょう。

まとめ

  1. load_async を末尾につけると, クエリの並列化が行える
  2. 並列にできるクエリ数はデフォルトでは4つ
  3. データベースのメモリや, トランザクションの挙動に注意

無闇に使わず、ボトルネックに適切に効かせて武器にしましょう🔥

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3