2013-03-04 6 views
18

Ist es möglich, verzögerte Jobs auf Heroku kostenlos auszuführen?Verspätete Jobs auf Heroku kostenlos laufen lassen

Ich versuche delayed_job_active_record auf Heroku zu verwenden. Allerdings erfordert es eine worker dyno und es würde Geld kosten, wenn ich diesen Prüfstand für die volle Zeit eingeschaltet würde.

Ich dachte mit Unicorn und machen seine Mitarbeiter verzögerte Jobs statt der Heroku Arbeiter, würde nichts kosten, während alle Jobs erfolgreich ausgeführt werden. Unicorn-Arbeiter scheinen jedoch nicht automatisch zu "arbeiten".

Ich habe folgendes in meinem Procfile.

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb 
worker: bundle exec rake jobs:work 

und folgende Unterlagen in meinem unicorn.rb

worker_processes 3 
timeout 30 
preload_app true 

before_fork do |server, worker| 
    # Replace with MongoDB or whatever 
    if defined?(ActiveRecord::Base) 
    ActiveRecord::Base.connection.disconnect! 
    Rails.logger.info('Disconnected from ActiveRecord') 
    end 

    # If you are using Redis but not Resque, change this 
    if defined?(Resque) 
    Resque.redis.quit 
    Rails.logger.info('Disconnected from Redis') 
    end 

    sleep 1 
end 

after_fork do |server, worker| 
    # Replace with MongoDB or whatever 
    if defined?(ActiveRecord::Base) 
    ActiveRecord::Base.establish_connection 
    Rails.logger.info('Connected to ActiveRecord') 
    end 

    # If you are using Redis but not Resque, change this 
    if defined?(Resque) 
    Resque.redis = ENV['REDIS_URI'] 
    Rails.logger.info('Connected to Redis') 
    end 
end 

Verzögerte Arbeitsplätze scheinen nur zu arbeiten, wenn ich die Heroku Arbeiter von 0 bis 1 Wieder skalieren, ist es nicht möglich zu verwenden, Einhornarbeiter anstelle von Heroku-Arbeiter, um die verzögerten Jobs zu machen?

Muss ich ein Juwel wie workless verwenden, um verzögerte Jobs auf Heroku kostenlos auszuführen? (reference)

+2

Ich benutze arbeitslose Edelstein. Es sollte kein Problem geben, einen Edelstein zu benutzen, um einen Arbeiter nur dann zu feuern, wenn er gebraucht wird. Es funktioniert ein Juwel! ;-) – mjnissim

Antwort

14

Splitting der Prozess wie die Probleme entstehen können - die beste Wahl ist es aber so etwas wie http://hirefireapp.com/ nicht versuchen, es ‚frei‘ bekommen benutzen, die einen Arbeiter starten wird, wenn es Arbeitsplätze sind die Reduzierung auszuführen Kosten erheblich, anstatt einen Arbeiter rund um die Uhr laufen zu lassen.

Beachten Sie auch, dass Heroku nur automatisch einen 'Web'-Prozess für Sie startet, der Start anderer benannter Prozesse ist eine manuelle Aufgabe.

+0

+1 das ist in der Tat sehr hilfreich. Vielen Dank! – abhijit

+0

Welche Art von Problemen? – Zaz

+0

Ich habe es nicht verwendet, aber das arbeitslose Juwel sieht genauso aus wie diese Dienste: https://github.com/lostboy/workless –

5

Idealerweise gibt es keinen direkten Weg, um diese frei zu bekommen, aber Sie würden viele Workarounds finden, die man machen kann, um freie Hintergrundjobs zu genießen. Einer davon ist http://nofail.de/2011/07/heroku-cedar-background-jobs-for-free/

Auch wenn Sie resque verwenden möchten, die eine ausgezeichnete Wahl für Hintergrundjobs ist, müssten Sie redis, die kostenlos mit Nano-Version kommt =>https://addons.heroku.com/redistogo. https://devcenter.heroku.com/articles/queuing-ruby-resque

Einfache Lösung ist ein One-Dyna für den Arbeiter zu kaufen, während Ihr Web-Dyno frei wäre.

Lassen Sie mich, wenn Sie mehr Hilfe benötigen.

Dank

1

Wenn Sie nur einen Web-Mitarbeiter haben, schläft Heroku ihn, wenn er für eine Stunde inaktiv ist.

Außerdem wird Heroku alle Dynos mindestens einmal am Tag neu starten.

Dies macht es schwierig, einen In-Ruby-Scheduler zu machen. Es muss mindestens persistenten Speicher (z. B. Datenbank) verwenden.

+2

Man kann verhindern, dass Heroku im Leerlauf läuft. Installiere das kostenlose New Relic Add-on. Es verfügt über eine Verfügbarkeitsmonitorfunktion, die zweimal pro Minute die Site anpingt und so verhindert, dass der Prüfstand im Leerlauf läuft. – narzero

5

Sie Heroku Scheduler verwenden können, die Jobs mit dem Befehl

rake jobs:workoff 

diese Weise werden die Aufträge ausführen können in Ihrem Web-dyno laufen. Gemäß Delayed_Job docs führt dieser Befehl alle verfügbaren Jobs aus und wird beendet.

Sie können den Scheduler so konfigurieren, dass er diesen Befehl alle 10 Minuten ausführt, und er hat keine sinnvollen Auswirkungen auf die Leistung der Anwendung, wenn keine Jobs in der Warteschlange stehen. Eine andere gute Idee ist es, es so zu planen, dass es täglich mit niedrigeren Zugriffsraten läuft.