2017-07-09 2 views
1

Vor ungefähr 6 Jahren gab es einen Rails-gemieteten HireFire, der mit Hintergrundjobs arbeitete, um Arbeiter nach Bedarf zu starten und zu stoppen, so dass der Arbeiter nicht immer rannte und immer Gebühren anhäufte.Wie programmiere ich Heroku-Arbeiter in Schienen programmatisch?

HireFire scheint nicht mehr (wie ein Juwel) zu sein, und ich frage mich, wie ich Heroku-Arbeiter heutzutage so skalieren kann?

Ich bin nicht daran interessiert, dafür einen Service zu bezahlen.

Ich habe mich umgesehen und bin überrascht, dass die Lösung nicht offensichtlich erscheint.

Hat Heroku diese Art der automatischen Skalierung implementiert, oder gibt es einen anderen Rails-Edelstein, der das für mich tun wird? Danke

+1

Heroku einen Dienst für diese hat: https://devcenter.heroku.com/articles/scaling #autoscaling, aber es ist für Performance-Tier-Dynos und -Dynos, die auf privaten Räumen laufen. – jdgray

+0

Ich schätze, die meisten Leute haben eine offensichtliche Lösung, um dafür einen Service zu bezahlen. –

Antwort

2

Update: Ich konnte nicht eine vorhandene Bibliothek/gem/plugin finde dies für mich zu tun, so dass ich beschlossen, zu versuchen, es selbst zu lösen.

Ich habe mich entschlossen, hier zu posten, nachdem ich eine Lösung gefunden habe. Vielleicht wird es für andere hilfreich sein.

DelayedJob hat ein Plugin-System (ich musste meine Perle Version auf die neueste Upgrade)

Dies ist das Plugin ich geschrieben habe. Ich denke nicht, dass es Preise für Schönheit gewinnen wird, aber es scheint den Trick zu machen. Bitte posten Sie Kommentare, wenn ich etwas Dummes mache.

Ich habe es auch so gemacht, dass es nach Produktion/Entwicklung env sucht und das lokale DelayedJob-Skript ausführt, wenn es in Entwicklung ist.

class HerokuWorkerDelayedJobPlugin < Delayed::Plugin 
    callbacks do |lifecycle| 
    lifecycle.before(:enqueue) do |job, *args, &block| 
     Rails.logger.info "----before enqueue -----" 
     self.start 
    end 

    lifecycle.after(:enqueue) do |job, *args, &block| 
     Rails.logger.info "----after enqueue -----" 
    end 

    lifecycle.after(:invoke_job) do |job, *args, &block| 
     Rails.logger.info "----after invoke_job -----" 
    end 

    lifecycle.after(:perform) do |worker, job, *args, &block| 
     Rails.logger.info "----after perform-----" 
     self.stop 
    end 

    def self.start 
     if Rails.env.production? 
     self.set_heroku_workers 1 
     else 
     `script/delayed_job start` 
     end 
    end 

    def self.stop 
     if Rails.env.production? 
     self.set_heroku_workers 0 
     else 
     `script/delayed_job stop` 
     end 
    end 

    def self.set_heroku_workers(num) 
     heroku = PlatformAPI.connect_oauth(ENV['PLATFORM_API_OAUTH_TOKEN']) #https://github.com/heroku/platform-api 
     heroku.formation.update('my-app', 'worker', {quantity: num}) #https://devcenter.heroku.com/articles/platform-api-reference#formation 
    end 
    end 
end 

Sie wollen das Plugin hinzufügen, wie dies in Ihrem initializer DelayedJob:

Delayed::Worker.plugins << HerokuWorkerDelayedJobPlugin 
+0

Genau was ich brauchte. Vielen Dank! –

0

Sie können Heroku-Dynos mit dem CLI skalieren, also kann der Aufbau Ihres eigenen Dienstes dafür ziemlich einfach sein. Erstellen Sie eine weitere App, die den Scheduler verwendet, um jede Stunde zu starten, ein CLI mithilfe eines Unix-Shell-Skripts herunterzuladen und zu installieren und Anmeldeinformationen als ENV-Variablen zu verwenden, um die Befehle scale an andere Apps zu senden.

Hier ist eine Code-Basis als ein Beispiel für die Technik: https://github.com/kbaum/heroku-database-backups

+0

einen Job jede Stunde zu laufen ist nicht wirklich Auto-Skalierung, für meine Bedürfnisse. Ich brauche den Arbeiter, der gestartet wird, wenn der verzögerte Job hinzugefügt wird, und stoppt, wenn es keine Jobs mehr gibt. – pixelearth

Verwandte Themen