[Ruby on Rails] Stoppen Sie "Looping bis ..."

Warum schreiben?

Es ist einen ganzen Monat her, seit ich angefangen habe zu arbeiten. In Zusammenarbeit mit der Synchronisation haben wir eine Funktion freigegeben und konnten normal arbeiten. Tatsächlich hatte ich jedoch einmal das Problem, dass der Prozess in der Produktionsumgebung nicht abgeschlossen werden konnte. Ich werde es als Memorandum ausgeben, um zu verhindern, dass dasselbe erneut passiert.

Warum es passiert ist

Einfach ausgedrückt, weil Sie in eine "Endlosschleife" geraten sind. Die Implementierung dieser Zeit besteht darin, die auf Sidekiq ausgeführten Jobs zu überwachen, die Verdoppelung oder den Verlust von Jobs zu erkennen und Slack zu warnen.

Das erste was ich traf war ・ Aus Zeitplan ausführen ・ Wird nicht ausgeführt Wenn ein Job zum Zeitpunkt dieser beiden Aufgaben erfasst und geprüft wird, wird er häufig als Fehler erkannt.

Es gab eine Verzögerung von 1 Sekunde bis zu 5 Sekunden bei der Geschwindigkeit des Kommens und Gehens (in der lokalen Umgebung überprüft). Wenn der neue Funktionsüberwachungsjob zu diesem Zeitpunkt ausgeführt wird, wird er auch dann als Fehler erkannt, wenn der Job normal ausgeführt wird.

Die Maßnahmen, die ich dagegen ergriffen habe ** Drehen Sie beim Erfassen eines Auftrags eine Schleife. Wenn alle Daten gleich sind, nehmen Sie sich beim 10-fachen Erfassen 5 Sekunden "Schlaf" und übergeben Sie sie an den nächsten Prozess. ** Es war das. Das war nicht gut ...

Wie es sich verbessert hat

In der Produktionsumgebung wird es alle 30 Sekunden ausgeführt und der Vorgang in etwa 10 Sekunden abgeschlossen. Dabei werden der Zeitplan und die Ausführung in einem schwindelerregenden Tempo verschoben, was eine lebhafte Aufgabe ist.

Es dauert mehr als 50 Sekunden, um es zu erhalten, während die Schleife gedreht wird (ich habe es absichtlich gemacht). Der Grund dafür ist, dass die in 10 Erfassungen erhaltenen Daten nicht für immer gleich sind. Es war eine Endlosschleife.

Bei Korrekturen hörte ich auf, ** Schleifen zu sagen, bis alle Daten gleich sind **. Aber ich wusste, dass ich Slacks Warnungen durcheinander bringen würde, wenn ich die Erfassung nicht richtig überprüfen würde.

Aus diesem Grund haben wir die Obergrenze der ** Schleife festgelegt und in die ** Spezifikation geändert, die die meisten erhaltenen Daten an den nächsten Prozess weitergibt.

monitoring_sidekiq.rb


#Kürzung
def sidekiq_logs_arr_in
  consistency_check_sidekiq_logs = []
  #Früher habe ich while-Anweisung und Redo verwendet, aber ich habe eine klare Obergrenze festgelegt
  50.times do
    queues = []
    #Vermeiden Sie die Verwendung von Schlaf aufgrund von zeitlichen Abweichungen von Termin zu Ausführung und Ausführung zu Termin
    sleep 2
    #Holen Sie sich einen Job bei Sidekiq
    Sidekiq::Workers.new.each { |_process_id, _thread_id, job| queues << job["queue"] }
    Sidekiq::ScheduledSet.new.each { |job| queues << job["queue"] }
    queues = queues.sort
    consistency_check_sidekiq_logs << queues
  end
  #Gibt schließlich die meisten Daten in der Schleife durch Zählen zurück
  consistency_check_sidekiq_logs.max_by { |x| consistency_check_sidekiq_logs.count x }
end
#Kürzung

Auf diese Weise ist es auch während der normalen Verarbeitung während der nachfolgenden Verarbeitung nicht mehr erforderlich, eine Ausnahme auszulösen, und es ist jetzt möglich, ein konsistentes Protokoll zu erhalten, selbst wenn ein fehlerfreier Job vorliegt. ..

Was ist in Zukunft zu tun?

Wenn bestimmte Bedingungen nicht erfüllt sind, versuchen Sie zunächst, den Vorgang des Wiederherstellens im Schleifenprozess nicht so oft wie möglich durchzuführen. Mir war sehr bewusst, dass es äußerst wichtig ist, eine Obergrenze festzulegen und eine Schleife zu bilden, die unter allen Umständen entkommen kann.

Ich bin in Zukunft sehr vorsichtig, da das Verursachen einer Endlosschleife in einer Produktionsumgebung dem Unternehmen großen Schaden zufügen kann.

Recommended Posts

[Ruby on Rails] Stoppen Sie "Looping bis ..."
Ruby on Rails Elementary
Ruby On Rails Association
Rails neu in Ruby on Rails ~ Memorandum bis zur Bereitstellung 2
Rails neu in Ruby on Rails ~ Memorandum bis zur Bereitstellung 1
Ruby on Rails Lernrekord -2020.10.03
Portfolioerstellung Ruby on Rails
Ruby on Rails Lernrekord -2020.10.04
[Ruby on Rails] Debuck (bindend.pry)
Ruby on Rails Lernrekord -2020.10.05
Ruby on Rails Lernrekord -2020.10.09
Ruby on Rails lernen Rekord-2020.10.07 ②
Ruby on Rails lernen Rekord-2020.10.07 ①
Brechen Sie die Ruby on Rails-Migration ab
Ruby on Rails Lernrekord -2020.10.06
Zusammenfassung der Ruby on Rails-Validierung
Ruby on Rails Grundlegendes Memorandum
[Ruby on Rails] Leseversuch (: [],: Schlüssel)
Ruby on Rails-Variablen, konstante Zusammenfassung
Installation von Ruby + Rails unter Ubuntu 18.04 (rbenv)
[Ruby on Rails] Paging-Funktion eingeführt
Grundkenntnisse in Ruby on Rails
Progate Ruby on Rails5 Rückblick
Ruby on Rails Japanisch-Englisch kompatibler i18n
(Ruby on Rails6) Gepostete Inhalte "löschen"
[Ruby on Rails] CSV-Ausgabefunktion
[Ruby on Rails] Erstellung der Bestätigungsseite
Ruby On Rails entwickelt Routing-Konflikte
[Ruby on Rails] Implementierung der Kommentarfunktion
[Ruby on Rails] DM, Chat-Funktion
[Ruby on Rails] Praktische Hilfsmethode
Ich habe den Ablauf bis zur Implementierung von simple_calendar in Ruby on Rails zusammengefasst.
[Ruby on Rails] Einführung der Anfangsdaten
[Ruby on Rails] Suchfunktion (nicht ausgewählt)
Bis Rubin in Fenstern verwendet werden kann ...
[Rails] Hinzufügen der Ruby On Rails-Kommentarfunktion
[Ruby on Rails] Erstellen eines Anfrageformulars
Ruby on Rails6 Praktischer Leitfaden cp13 ~ cp15 [Memo]
[Ruby on Rails] Codeprüfung mit Rubocop-Airbnb
[Ruby on Rails] 1 Modell CRUD (Routing Main)
Ruby on Rails-Installationsmethode [Mac Edition]
Modell [Ruby on Rails], Befehl für Controller-Terminal
Befehl zum Erstellen / Löschen von Ruby on Rails-Modellen
Ruby on Rails in Visual Studio-Codespaces
Hinweise zur Verwendung von FCM mit Ruby on Rails
[Ruby on Rails] Controller-Test mit RSpec
Bereitstellen für Heroku [Ruby on Rails] Anfänger
[Ruby on Rails] Bild-Diashow mit Skippr
Befehl zum Erstellen / Löschen des Ruby on Rails-Controllers