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
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
Ich schätze, die meisten Leute haben eine offensichtliche Lösung, um dafür einen Service zu bezahlen. –