Langsamer Rebake-Skript, um Ihren Server nicht zu überlasten

Ich musste also live gehen, ohne auf den Abschluss des gesamten Rebake zu warten. Nachdem ich live gegangen war, konnte ich Rebake nicht ausführen, da dies den Server zum Absturz gebracht hätte. Ich konnte Rebake in der Standardwarteschlange ausführen, da dies alle anderen Prozesse wie Benachrichtigungen verzögert hätte.

Daher habe ich dieses Skript verwendet, um alle Rebake-Aufgaben in die Sidekiq-Warteschlange mit ultra-niedriger Priorität einzureihen. Ich teile es hier, falls jemand anderes es benötigt.

# slow_rebake_resumer_ultralow.rb
# Setzt das Einreihen von Rebake-Jobs von einem bestimmten Punkt fort und sendet sie
# direkt an die :ultra_low Prioritätswarteschlange.
# Führen Sie dies im Container mit -> rails runner slow_rebake_resumer_ultralow.rb aus

# --- Konfiguration ---
BATCH_SIZE = 500
SLEEP_DURATION = 5
# --- Startpunkt von Ihrem letzten Update ---
last_processed_id = 1952526 
# --------------------

start_time = Time.now
total_posts = Post.count

puts "Setze das Einreihen von Rebake-Jobs für #{total_posts} Beiträge in die :ultra_low Warteschlange fort..."
puts "Beginne nach Beitrags-ID #{last_processed_id}."
puts "---"

loop do
  # Effizientes Finden des nächsten Stapels von Beiträgen zur Verarbeitung
  posts_to_enqueue = Post.where("id 

  # Beenden Sie die Schleife, wenn keine Beiträge mehr vorhanden sind
  break if posts_to_enqueue.empty?

  posts_to_enqueue.each do |post|
    begin
      # Definieren Sie alle Optionen in einem einzigen Hash, einschließlich der Zielwarteschlange
      options = {
        post_id: post.id,
        cook: true,
        bypass_bump: true,
        queue: :ultra_low
      }

      # Reihen Sie den Job mit der korrekten, verifizierten Syntax ein
      Jobs.enqueue(:process_post, options)

    rescue =
      puts "!!! FEHLER beim Einreihen des Jobs für Beitrags-ID #{post.id}: #{e.message}"
    end
  end

  # Aktualisieren Sie unsere Position auf die letzte Beitrags-ID im aktuellen Stapel
  last_processed_id = posts_to_enqueue.last.id
  
  # Holen Sie sich eine genauere Zählung für den Fortschrittsbericht
  enqueued_count = Post.where("id 

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

  puts "Eingereiht bis Beitrags-ID #{last_processed_id}. Insgesamt eingereiht: ~#{enqueued_count} / #{total_posts} (#{percentage}%)"
  puts "Verstrichene Zeit (diese Sitzung): #{elapsed_minutes} Minuten."
  puts "Jobs werden an die :ultra_low Warteschlange gesendet."

  # Pause zwischen den Stapeln, um die Last gering zu halten
  if enqueued_count 
    puts "Warte #{SLEEP_DURATION} Sekunden..."
    sleep(SLEEP_DURATION)
    puts "---"
  end
end

puts "\nAlle verbleibenden Rebake-Jobs wurden erfolgreich in die :ultra_low Warteschlange eingereiht!"

3 „Gefällt mir“

Ich bin ziemlich sicher, dass bereits ein Prozess ständig läuft, der so ziemlich dasselbe tut und der im Wiederherstellungsskript erwähnt wird, aber vielleicht haben Sie die Migration auf dem Live-Server durchgeführt und sie nicht gesehen. . .

Ja, das gibt es. Ich habe das Standard-Migrationsskript nicht importiert. Ich werde später mehr darüber posten, sobald sich die Benutzer beruhigt haben, nachdem sie sich über das unendliche Scrollen und die insgesamt schlechte, überladene Benutzererfahrung auf Discourse beschwert haben. :upside_down_face:

Aber im Allgemeinen muss man manchmal auch einen vollständigen Re-Bake durchführen, wie z. B. die Änderung der Domain, das Suchen und Ersetzen usw.

Entschuldigung, dass ich den Beitrag wieder nach oben schiebe, ich befinde mich in einer ähnlichen Situation mit meinem Discourse.

Haben Sie Tipps, wie man dieses Skript ausführt?

Wo erstellt man das Skript und wie ruft man es auf?

Vielen Dank im Voraus

Erstellen Sie eine Datei slow_rebake_resumer_ultralow.rb im Verzeichnis tmp innerhalb des gemeinsamen Verzeichnisses und fügen Sie den gesamten Code dort ein.

Führen Sie diese Datei dann einmal innerhalb des Containers mit rails runner slow_rebake_resumer_ultralow.rb aus.

Beobachten Sie den Fortschritt unter yousite.com/sidekiq.

1 „Gefällt mir“