J’ai donc dû passer en production sans attendre la fin du rebake complet. Après être passé en production, je ne pouvais pas exécuter le rebake car cela aurait arrêté le serveur. Je pouvais exécuter le rebake sur la file d’attente par défaut car cela aurait retardé tous les autres processus comme les notifications.
J’ai donc utilisé ce script pour mettre en file d’attente toutes les tâches de rebake dans la file d’attente sidekiq à priorité ultra-basse. Je le partage ici au cas où quelqu’un d’autre en aurait besoin.
# slow_rebake_resumer_ultralow.rb
# Reprend la mise en file d'attente des jobs de rebake à partir d'un point spécifique et les envoie
# directement dans la file d'attente prioritaire :ultra_low.
# exécuter dans le conteneur avec -
> rails runner slow_rebake_resumer_ultralow.rb
# --- Configuration ---
BATCH_SIZE = 500
SLEEP_DURATION = 5
# --- Point de départ de votre dernière mise à jour ---
last_processed_id = 1952526
# --------------------
start_time = Time.now
total_posts = Post.count
puts "Reprise et mise en file d'attente des jobs de rebake pour #{total_posts} posts dans la file :ultra_low..."
puts "Début après le post ID #{last_processed_id}."
puts "---"
loop do
# Trouve efficacement le prochain lot de posts à traiter
posts_to_enqueue = Post.where("id
> ?", last_processed_id).order(id: :asc).limit(BATCH_SIZE)
# Sort de la boucle s'il n'y a plus de posts
break if posts_to_enqueue.empty?
posts_to_enqueue.each do |post|
begin
# Définit toutes les options dans un seul hash, y compris la file d'attente cible
options = {
post_id: post.id,
cook: true,
bypass_bump: true,
queue: :ultra_low
}
# Met en file d'attente le job avec la syntaxe correcte et vérifiée
Jobs.enqueue(:process_post, options)
rescue =
> e
puts "!!! ERREUR lors de la mise en file d'attente du job pour le post ID #{post.id}: #{e.message}"
end
end
# Met à jour notre position vers le dernier ID de post du lot actuel
last_processed_id = posts_to_enqueue.last.id
# Obtient un compte plus précis pour le rapport de progression
enqueued_count = Post.where("id
<= ?", last_processed_id).count
# --- Rapport de progression ---
percentage = (enqueued_count.to_f / total_posts * 100).round(2)
elapsed_minutes = ((Time.now - start_time) / 60).round(2)
puts "Mis en file d'attente jusqu'au post ID #{last_processed_id}. Total mis en file d'attente : ~#{enqueued_count} / #{total_posts} (#{percentage}%)"
puts "Temps écoulé (cette session) : #{elapsed_minutes} minutes."
puts "Les jobs sont envoyés dans la file :ultra_low."
# Pause entre les lots pour maintenir une charge faible
if enqueued_count
<
total_posts
puts "Pause pendant #{SLEEP_DURATION} secondes..."
sleep(SLEEP_DURATION)
puts "---"
end
end
puts "\nTous les jobs de rebake restants ont été mis en file d'attente avec succès dans la file :ultra_low !"