Beim Neustart oder bei der Bereitstellung erhalten wir eine Anzahl von Resque-Jobs in der fehlgeschlagenen Warteschlange mit Resque::TermException (SIGTERM)
oder Resque::DirtyExit
.Sicheres Wiederherstellen von Resque :: TermException oder SIGTERM auf Heroku
wir die neue TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10
in unserem procfile verwenden, damit unsere Arbeiter Linie wie folgt aussieht:
worker: TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10 bundle exec rake environment resque:work QUEUE=critical,high,low
Wir auch resque-retry
mit denen dachte, ich könnte Auto-Wiederholung auf diese beiden Ausnahmen? Aber es scheint nicht zu sein.
Also ich denke, zwei Fragen:
- Wir manuell von
Resque::TermException
in jedem Job retten konnte, und dies den Job neu zu planen nutzen. Aber gibt es einen sauberen Weg, dies für alle Jobs zu tun? Sogar ein Affenfleck. - Sollte es nicht erneut versuchen, diese automatisch erneut zu versuchen? Kannst du dir irgendeinen Grund vorstellen, warum es nicht wäre?
Vielen Dank!
Bearbeiten: Alle Jobs in weniger als 10 Sekunden abgeschlossen zu sein scheint unverhältnismäßig im Maßstab. Es scheint so, als müsste es eine Möglichkeit geben, diese Jobs automatisch neu einzureihen, wenn die Resque :: DirtyExit-Ausnahme ausgeführt wird.
upvoted und akzeptiert - ich bin ehrlich gesagt nicht sicher, ob wir sie alle unter 10 Sekunden, obwohl erhalten. Wir haben einige große Exporte usw., die eine Datei erzeugen müssen. Re-Enqueueing scheint das zu lösen? Können Sie den Unterschied zwischen 'Resque :: TermException' und' Resque :: DirtyExit' teilen? Ich habe dort eine Rettung für 'Resque :: DirtyExit', aber es scheint nicht immer wieder in die Warteschlange zu kommen. Vielen Dank! –
Als ein Update retten sie diese Ausnahmen seltsamerweise manchmal nicht sauber, obwohl sie 'resize Resque :: DirtyExit' im Job haben. Ich konnte nicht herausfinden warum. Dies macht unsere Jobs unzuverlässig, da wir sie immer noch mit Resque :: DirtyExit-Ausnahmen in der fehlgeschlagenen Warteschlange finden. Es wird wirklich ein Problem –
Kann jemand empfehlen, wie der Arbeiter das SIGTERM innerhalb des Arbeiters behandeln sollte, also kann der Arbeiter sich sauber schließen? Soll der (Resque-) Worker beispielsweise auch SIGTERM abfangen und eine Variable festlegen, die der Schleifencode regelmäßig überprüft? Ich gehe davon aus, dass die TermException oder DirtyException nur nach RESQUE_TERM_TIMEOUT gesendet wird. –