Langzaam herbak-script om te voorkomen dat uw server wordt overweldigd

Ik moest dus live gaan zonder te wachten tot de hele rebake klaar was. Na live te zijn gegaan, kon ik de rebake niet uitvoeren, omdat dit de server zou uitschakelen. Ik kon de rebake niet op de standaard wachtrij uitvoeren, omdat dit alle andere processen, zoals meldingen, zou vertragen.

Dus ik gebruikte dit script om alle rebake-taken in de ultralow priority sidekiq-wachtrij te plaatsen. Ik deel het hier voor het geval iemand anders het nodig heeft.

# slow_rebake_resumer_ultralow.rb
# Hervat het in de wachtrij plaatsen van rebake-taken vanaf een specifiek punt en stuurt ze
# rechtstreeks naar de :ultra_low prioriteitswachtrij.
# voer uit binnen de container met -> rails runner slow_rebake_resumer_ultralow.rb

# --- Configuratie ---
BATCH_SIZE = 500
SLEEP_DURATION = 5
# --- Startpunt vanaf uw laatste update ---
last_processed_id = 0
# --------------------

start_time = Time.now
total_posts = Post.count

puts "Hervatten en in de wachtrij plaatsen van rebake-taken voor #{total_posts} posts naar de :ultra_low wachtrij..."
puts "Start na post ID #{last_processed_id}."
puts "---"

loop do
  # Vind efficiƫnt de volgende batch posts om te verwerken
  posts_to_enqueue = Post.where("id > ?", last_processed_id).order(id: :asc).limit(BATCH_SIZE)

  # Verlaat de lus als er geen posts meer zijn
  break if posts_to_enqueue.empty?

  posts_to_enqueue.each do |post|
    begin
      # Definieer alle opties in ƩƩn hash, inclusief de doelwachtrij
      options = {
        post_id: post.id,
        cook: true,
        bypass_bump: true,
        queue: :ultra_low
      }

      # Plaats de taak in de wachtrij met de juiste, geverifieerde syntaxis
      Jobs.enqueue(:process_post, options)

    rescue => e
      puts "!!! FOUT bij het in de wachtrij plaatsen van taak voor post ID #{post.id}: #{e.message}"
    end
  end

  # Werk onze positie bij naar de laatste post ID in de huidige batch
  last_processed_id = posts_to_enqueue.last.id

  # Verkrijg een nauwkeurigere telling voor het voortgangsrapport
  enqueued_count = Post.where("id <= ?", last_processed_id).count

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

  puts "Geplaatst tot post ID #{last_processed_id}. Totaal geplaatst: ~#{enqueued_count} / #{total_posts} (#{percentage}%)"
  puts "Verstreken tijd (deze sessie): #{elapsed_minutes} minuten."
  puts "Taken worden naar de :ultra_low wachtrij gestuurd."

  # Pauzeer tussen batches om de belasting laag te houden
  if enqueued_count < total_posts
    puts "Slaapt voor #{SLEEP_DURATION} seconden..."
    sleep(SLEEP_DURATION)
    puts "---"
  end
end

puts "\nAlle resterende rebake-taken zijn succesvol naar de :ultra_low wachtrij geplaatst!"

3 likes

Ik weet vrij zeker dat er al een proces draait dat vrijwel hetzelfde doet en dat wordt vermeld door het herstelscript, maar misschien heb je de migratie op de live server uitgevoerd en heb je het niet gezien. . .

Yes there is. I did not do the standard migration script import. Will post more about it later, once the users have settled down from complaining about infinite scroll and overall bad cluttered user experience on Discourse. :upside_down_face:

But in general also once might need a full rebake like changing the domain, doing some find and replace etc.

Sorry for bumping into post, I am kind of same situation with my Discourse.

Any tips how to run this script ?

Where to create script and how to call it

Thanks in advanced

Create a file slow_rebake_resumer_ultralow.rb under tmp directory within the shared directory and paste the entire code in it.

Then execute that file once inside the container with rails runner slow_rebake_resumer_ultralow.rb

Observe the progress under yousite.com/sidekiq

1 like