そのため、全体の再ベイクが完了するのを待たずにライブに移行する必要がありました。ライブに移行した後、サーバーを停止させてしまうため、再ベイクを実行できませんでした。通知などの他のすべてのプロセスを遅延させてしまうため、デフォルトのキューで再ベイクを実行することはできませんでした。
そこで、このスクリプトを使用して、すべての再ベイクタスクを超低優先度の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 キューに正常にエンキューされました!"