Techioz Blog

gem では、どのように設定すればよいでしょうか?

概要

コレクションが ActiveRecord::Relation を返す場合、各「バッチ」に制限を設定するにはどうすればよいでしょうか?ジョブ反復のベスト プラクティスによると、デフォルトは 100 です。高価なクエリや大規模なデータセットにとって、100 は小さすぎます。

ここに伝わったようです。

ただし、コレクション メソッドで maintenance_tasks gem を使用する場合、列挙子を明示的に構築しません。では、どのようにして @batch_size を渡したり、設定したりできるのでしょうか?私は、MaintenanceTasks::Task 内で @batch_size@of、defbatch_size、def of などのいくつかの推測を試してみました。

解決策

maintenance_tasks gem には、@batch_size インスタンス変数を直接設定する方法がありません。ただし、コレクション メソッドの :batch_size オプションを指定して find_each メソッドを使用すると、バッチ サイズを制御できます。

タスクごとに異なるバッチ サイズを設定する場合は、各タスクの収集メソッドで find_each メソッドを :batch_size オプションとともに使用する必要があります。 find_each メソッドは、レコードのバッチを生成する Enumerator を返します。これは、maintenance_tasks gem が期待するものです。

find_each メソッドは ActiveRecord の一部であり、その機能は maintenance_tasks gem に直接関連していないことに注意してください。これはデータベースからレコードをバッチでフェッチするために使用され、大規模なデータセットを扱うときのパフォーマンスを向上させることができます。

以下は、収集メソッドでバッチ サイズを設定する方法の例です。

module Maintenance
class UpdatePostsThrottledTask < MaintenanceTasks::Task
  throttle_on(backoff: 1.minute) do
    DatabaseStatus.unhealthy?
  end

  def collection
    Post.find_each(batch_size: 1000)
  end

  def process(post)
    post.update!(content: "New content added on #{Time.now.utc}")
  end
end

終わり