サーバー負荷を軽減する遅延リベイクスクリプト

そのため、全体の再ベイクが完了するのを待たずにライブに移行する必要がありました。ライブに移行した後、サーバーを停止させてしまうため、再ベイクを実行できませんでした。通知などの他のすべてのプロセスを遅延させてしまうため、デフォルトのキューで再ベイクを実行することはできませんでした。

そこで、このスクリプトを使用して、すべての再ベイクタスクを超低優先度のSidekiqキューにエンキューしました。他の誰かの役に立つかもしれないので、ここに共有します。

# slow_rebake_resumer_ultralow.rb
# 特定の時点から再ベイクジョブのエンキューを再開し、それらを送信します
# :ultra_low 優先度キューに直接送信します。
# コンテナ内で実行するには -> rails runner slow_rebake_resumer_ultralow.rb

# --- 設定 ---
BATCH_SIZE = 500
SLEEP_DURATION = 5
# --- 前回の更新からの開始点 ---
last_processed_id = 1952526 
# --------------------

start_time = Time.now
total_posts = Post.count

puts ":ultra_low キューに #{total_posts} 件の投稿の再ベイクジョブを再開してエンキューしています..."
puts "投稿 ID #{last_processed_id} の後から開始します。"
puts "---"

loop do
  # 次の投稿バッチを効率的に検索します
  posts_to_enqueue = Post.where("id "> ?", last_processed_id).order(id: :asc).limit(BATCH_SIZE)

  # 投稿がなくなったらループを終了します
  break if posts_to_enqueue.empty?

  posts_to_enqueue.each do |post|
    begin
      # ターゲットキューを含むすべてのオプションを単一のハッシュで定義します
      options = {
        post_id: post.id,
        cook: true,
        bypass_bump: true,
        queue: :ultra_low
      }

      # 正しい、検証済みの構文でジョブをエンキューします
      Jobs.enqueue(:process_post, options)

    rescue ="> e"
      puts "!!! ERROR enqueuing job for post ID #{post.id}: #{e.message}"
    end
  end

  # 現在のバッチの最後の投稿 ID に位置を更新します
  last_processed_id = posts_to_enqueue.last.id
  
  # 進捗レポートのためにより正確なカウントを取得します
  enqueued_count = Post.where("id "> ?", last_processed_id).count

  # --- 進捗レポート ---
  percentage = (enqueued_count.to_f / total_posts * 100).round(2)
  elapsed_minutes = ((Time.now - start_time) / 60).round(2)

  puts "投稿 ID #{last_processed_id} までエンキューしました。合計エンキュー数: ~#{enqueued_count} / #{total_posts} (#{percentage}%)"
  puts "経過時間(このセッション): #{elapsed_minutes} 分"
  puts "ジョブは :ultra_low キューに送信されています。"

  # 負荷を低く保つためにバッチ間に一時停止します
  if enqueued_count < total_posts
    puts "#{SLEEP_DURATION} 秒間スリープします..."
    sleep(SLEEP_DURATION)
    puts "---"
  end
end

puts "\n残りのすべての再ベイクジョブが :ultra_low キューに正常にエンキューされました!"

「いいね!」 3

リストアスクリプトでも言及されている、ほとんど同じことをするプロセスが常に実行されていると思うのですが、本番サーバーでマイグレーションを実行して、それに気づかなかったのかもしれません。

はい、あります。標準の移行スクリプトインポートを実行しませんでした。Discourse の無限スクロールと全体的に悪い散らかったユーザーエクスペリエンスについて、ユーザーの不満が収まったら、後でもっと投稿します。:upside_down_face:

しかし、一般的に、ドメインの変更、検索と置換の実行など、完全なリベイクが必要になる場合もあります。

投稿にぶつかってすみません。私のDiscourseも同様の状況です。

このスクリプトを実行するためのアドバイスはありますか?

スクリプトはどこに作成し、どのように呼び出せばよいでしょうか?

事前にありがとうございます。

slow_rebake_resumer_ultralow.rb というファイルを共有ディレクトリ内の tmp ディレクトリ配下に作成し、コード全体を貼り付けてください。

次に、コンテナ内で rails runner slow_rebake_resumer_ultralow.rb を使用してそのファイルを一度実行してください。

yousite.com/sidekiq で進捗状況を確認してください。

「いいね!」 1