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.
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 ...
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. ..
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