Script de re-cuisson lent pour éviter de submerger votre serveur

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 !"

3 « J'aime »

Je suis à peu près sûr qu’il existe déjà un processus qui fait à peu près la même chose en permanence et qu’il est mentionné par le script de restauration, mais peut-être avez-vous exécuté la migration sur le serveur en direct et ne l’avez-vous pas vue. . .

Oui, il y en a une. Je n’ai pas utilisé le script d’importation de migration standard. J’en posterai plus à ce sujet plus tard, une fois que les utilisateurs auront fini de se plaindre du défilement infini et de l’expérience utilisateur globalement mauvaise et encombrée sur Discourse. :upside_down_face:

Mais en général, il peut aussi être nécessaire de faire un « rebake » complet, comme changer le domaine, faire des recherches et remplacements, etc.

Désolé d’avoir relancé ce message, je suis dans une situation similaire avec mon Discourse.

Avez-vous des conseils pour exécuter ce script ?

Où créer le script et comment l’appeler ?

Merci d’avance

Créez un fichier slow_rebake_resumer_ultralow.rb dans le répertoire tmp du répertoire partagé et collez-y l’intégralité du code.

Ensuite, exécutez ce fichier une fois dans le conteneur avec rails runner slow_rebake_resumer_ultralow.rb.

Observez la progression sous yousite.com/sidekiq.

1 « J'aime »