2017-07-09 5 views
1

約6年前に、必要に応じてバックグラウンドジョブを使用して作業者を開始および停止するために働いたレール宝石「HireFire」がありました。そのため、作業員は常に稼働していたわけではありませんでした。ヒロクの作業員をプログラムで開始/停止するにはどうすればいいですか?

HireFireは(宝石など)故人のようだ、と私は、これらの日、このようなHerokuの労働者を自動スケールすることができますどのように思ったんだけど?

私はこのサービスの支払いには興味がありません。

私は周りを見回して、その解決策が明らかではないと驚いています。

は、Herokuのは、自動スケーリングのこのタイプを実装している、または私のためにそれを行います別のレールの宝石はありますか?おかげ

+1

Herokuのは、このためのサービスを持っている:https://devcenter.heroku.com/articles/scaling #autoscalingですが、プライベートスペースで実行されるパフォーマンス層のdynosとdynos用です。 – jdgray

+0

私はほとんどの人の明白な解決策は、それを行うサービスを支払うことだと思います。 –

答えて

2

アップデート:私は私のためにこれを行うには、既存のライブラリ/宝石/プラグインを見つけることができませんでしたので、私はそれを自分で解決しようとすることを決めました。

私は解決策を考え出した後、ここに投稿することにしました。多分それは他人のために役立つでしょう。

DelayedJobは、これは私が書いたプラグインですプラグインシステム(私は最新のものに私の宝石のバージョンをアップグレードする必要がありました)

を持っています。私はそれが美のための賞を獲得するとは思わないが、それはトリックを行うようだ。私が何かばかげているとコメントを投稿してください。

それが生産/開発ENVをチェックしたときに、開発中のローカルDelayedJobスクリプトを実行しますので、私もそれを作りました。

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 

あなたの初期化子でこのようDelayedJobするプラグインを追加することをお勧めします:

Delayed::Worker.plugins << HerokuWorkerDelayedJobPlugin 
+0

ちょうど私が必要としていたもの。ありがとう! –

0

あなたはとてもきれい単純なことができ、これを行うために、独自のサービスを構築し、CLIを使用してHerokuののdynosを拡張することができます。

UNIXシェルスクリプトを使用してCLIをダウンロードしてインストールし、ENV変数として保存された資格情報を使用してscaleコマンドを他のアプリケーションに送信するスケジューラを使用する別のアプリケーションを作成します。ここで

は、技術の一例として、コードベースです:https://github.com/kbaum/heroku-database-backups

+0

毎時ジョブを実行していても、自分のニーズに合わせて自動的にスケーリングするわけではありません。遅れた仕事が追加されたときに作業員を始めて、仕事がなくなったら停止させる必要があります。 – pixelearth

関連する問題