Was könnte dazu führen, dass geplante aktive Rails-Jobs verschwinden?

8

Ich habe den Verdacht, dass einige unserer aktiven Jobs verschwinden, aber ich weiß nicht warum. Unten ist eine, ich habe die Beweise für sein Verschwinden gefunden, aber nicht den Grund dafür.

Unsere Website nutzt einen externen Cloud-Druckdienst. Wir kicken die Jobs ab und überprüfen dann ihren Status. Nachdem der Remote-Cloud-Druck erfolgreich erstellt wurde, erstellen wir einen aktiven Job, um den Status sofort zu überprüfen. Wenn es fertig ist (erfolgreich oder nicht), wird es als solches markiert. Wenn nicht, erstellt der Prüfstatus-Job mit leichter Verzögerung einen weiteren Job. Die Verzögerung erhöht sich jedes Mal.

Ein Status-Check heute, die Protokolle zeigen, dass die Wartezeit 128 Sekunden erreicht hat. Aber die nächste Statusüberprüfung ist nicht aufgetreten, und es gibt auch keine Fehler im Protokoll.

Wir verwenden aktiven Job, der durch einen verzögerten Job unterstützt wird. Der Code für den Job zur Statusprüfung ist unten. Es kann keinen Fehler in der Logik erkennen, der weder zu einer korrekt gesammelten Statusüberprüfung noch zu einem weiteren Versuch mit einer Wartezeit führen würde.

%Vor%     
Simmo 02.02.2017, 16:05
quelle

2 Antworten

4

Richtig, es gibt keinen Fehler in der angegebenen Logik, der entweder zu einer korrekt gesammelten Statusüberprüfung oder zu einem anderen Versuch mit einer Wartezeit führen würde.

Ich habe überprüft, dass sich Ihr Jobcode nach einer Wartezeit von 128 Sekunden erfolgreich mit dem folgenden Setup verhält:

  • rails new Projekt
  • delayed_job_active_record hinzugefügt zu Gemfile (läuft bundle install )
  • rails generate delayed_job:active_record und rake db:migrate , um Edelsteine ​​zu installieren und die Delayed Job DB-Tabelle zu erstellen
  • config.active_job.queue_adapter = :delayed_job in config/application.rb
  • ein grundlegendes CloudPrint < ApplicationRecord -Modell mit update_status , finished? und mark_as_failed -Methoden in app/models/cloud_print.rb
  • der angegebene Code in app/jobs/check_cloud_print_status_job.rb
  • Einen Job in die Warteschlange stellen, indem Sie CheckCloudPrintStatusJob.perform_later(CloudPrint.create) über die Rails-Konsole ( bin/rails c )
  • ausführen

Da sich die obige Sequenz ohne Probleme korrekt verhalten hat, müssen Sie Ihre Suche erweitern, indem Sie ein vollständiges und überprüfbares Beispiel zur Verfügung stellen reproduziert das Problem tatsächlich. Laden Sie Ihr gesamtes Rails-Projekt in ein GitHub-Repository hoch, sobald Sie Ihr Problem konsistent reproduzieren konnten, oder untersuchen Sie andere Aspekte Ihrer Umgebung und Projektkonfiguration. Hier sind einige Möglichkeiten:

  • Es könnte Logik in Ihrer Modellklasse geben, die möglicherweise Ausnahmen auslösen könnte;
  • Der Worker-Processing-Daemon könnte abgebrochen oder getötet worden sein;
  • Die Jobwarteschlange könnte gelöscht worden sein (z. B. über rake jobs:clear )
  • Ein anderer Prozess könnte das zu verarbeitende Modellobjekt modifiziert und / oder gelöscht haben;
  • finished? könnte true zurückgegeben haben, nachdem update_status aufgerufen wurde, was dazu führte, dass die endgültige Statusüberprüfung nicht gedruckt wurde, obwohl die Verarbeitung erfolgreich abgeschlossen wurde.

N.B. - Der verzögerte Job unterstützt das Wiederholen fehlgeschlagener Jobs mit einer Verzögerung von 5 seconds + N ** 4 , wobei N die Anzahl der Versuche ist. Diese Logik muss nicht erneut implementiert werden. Nur raise eine Ausnahme, wenn cloud_print.finished? falsch ist, und Sie sollten keinen anderen benutzerdefinierten Verzögerungscode benötigen:

%Vor%     
wjordan 08.02.2017, 20:52
quelle
0

Das Argument cloud_print ist eine Instanz einer Ruby-Klasse (scheint ActiveRecord :: Base). Im Allgemeinen ist es keine gute Idee, Objekte als Argumente für einen Hintergrundjob zu komplizieren, da diese Argumente in string, json oder yaml serialisiert werden müssen. DelayedJob verwendet YAML-serialisierte Objekte und manchmal ist es möglicherweise nicht möglich, eine Modellinstanz wiederherzustellen. Beispiel: Wenn der verzögerte Job als Callback ausgeführt wird before_create - Das Modellobjekt wurde nicht gespeichert und konnte nicht wiederhergestellt werden. Weitere Informationen finden Sie hier Ссылка

    
Semjon 06.02.2017 14:15
quelle