Script de rebake lento para evitar sobrecargar tu servidor

Así que tuve que salir en vivo sin esperar a que terminara el rebake completo. Después de salir en vivo, no pude ejecutar el rebake ya que mataría el servidor. Podría ejecutar el rebake en la cola predeterminada, ya que retrasaría todos los demás procesos como las notificaciones.

Así que usé este script para poner en cola todas las tareas de rebake en la cola sidekiq de prioridad ultrabaja. Lo comparto aquí por si alguien más lo necesita.

# slow_rebake_resumer_ultralow.rb
# Reanuda la puesta en cola de trabajos de rebake desde un punto específico y los envía
# directamente a la cola de prioridad :ultra_low.
# ejecutar dentro del contenedor con -> rails runner slow_rebake_resumer_ultralow.rb

# --- Configuración ---
BATCH_SIZE = 500
SLEEP_DURATION = 5
# --- Punto de inicio de tu última actualización ---
last_processed_id = 1952526 
# --------------------

start_time = Time.now
total_posts = Post.count

puts "Reanudando y poniendo en cola trabajos de rebake para #{total_posts} publicaciones en la cola :ultra_low..."
puts "Comenzando después de la publicación ID #{last_processed_id}."
puts "---"

loop do
  # Encuentra eficientemente el siguiente lote de publicaciones a procesar
  posts_to_enqueue = Post.where("id "> ?", last_processed_id).order(id: :asc).limit(BATCH_SIZE)

  # Sal del bucle si no quedan más publicaciones
  break if posts_to_enqueue.empty?

  posts_to_enqueue.each do |post|
    begin
      # Define todas las opciones en un único hash, incluida la cola de destino
      options = {
        post_id: post.id,
        cook: true,
        bypass_bump: true,
        queue: :ultra_low
      }

      # Poner en cola el trabajo con la sintaxis correcta y verificada
      Jobs.enqueue(:process_post, options)

    rescue ="> e"
      puts "!!! ERROR al poner en cola el trabajo para el ID de publicación #{post.id}: #{e.message}"
    end
  end

  # Actualiza nuestra posición al último ID de publicación del lote actual
  last_processed_id = posts_to_enqueue.last.id
  
  # Obtén un recuento más preciso para el informe de progreso
  enqueued_count = Post.where("id "> ?", last_processed_id).count

  # --- Informes de progreso ---
  percentage = (enqueued_count.to_f / total_posts * 100).round(2)
  elapsed_minutes = ((Time.now - start_time) / 60).round(2)

  puts "Puestas en cola hasta la publicación ID #{last_processed_id}. Total puestas en cola: ~#{enqueued_count} / #{total_posts} (#{percentage}%)"
  puts "Tiempo transcurrido (esta sesión): #{elapsed_minutes} minutos."
  puts "Los trabajos se envían a la cola :ultra_low."

  # Pausa entre lotes para mantener la carga baja
  if enqueued_count < total_posts
    puts "Durmiendo durante #{SLEEP_DURATION} segundos..."
    sleep(SLEEP_DURATION)
    puts "---"
  end
end

puts "\n¡Todos los trabajos de rebake restantes se han puesto en cola con éxito en la cola :ultra_low!"

3 Me gusta

Estoy bastante seguro de que ya hay un proceso ejecutándose todo el tiempo que hace prácticamente lo mismo y que se menciona en el script de restauración, pero tal vez ejecutaste la migración en el servidor en vivo y no la viste…

Sí, la hay. No hice la importación del script de migración estándar. Publicaré más información al respecto más tarde, una vez que los usuarios dejen de quejarse del desplazamiento infinito y de la mala experiencia de usuario general y desordenada en Discourse. :cara_invertida:

Pero, en general, también se podría necesitar un rebake completo como cambiar el dominio, hacer algunas búsquedas y reemplazos, etc.

Disculpen por el aviso, estoy en una situación similar con mi Discourse.

¿Alguna sugerencia sobre cómo ejecutar este script?

¿Dónde crear el script y cómo llamarlo?

Gracias de antemano

Crea un archivo slow_rebake_resumer_ultralow.rb en el directorio tmp dentro del directorio shared y pega todo el código en él.

Luego, ejecuta ese archivo una vez dentro del contenedor con rails runner slow_rebake_resumer_ultralow.rb.

Observa el progreso en yousite.com/sidekiq.

1 me gusta