Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在rails中以编程方式启动/停止heroku workers?_Ruby On Rails_Heroku_Worker - Fatal编程技术网

Ruby on rails 如何在rails中以编程方式启动/停止heroku workers?

Ruby on rails 如何在rails中以编程方式启动/停止heroku workers?,ruby-on-rails,heroku,worker,Ruby On Rails,Heroku,Worker,大约6年前,有一家rails gem-caled雇佣公司,负责根据需要启动和停止工人的后台工作,因此工人并不总是在运行,也不总是在积累费用 HireFire似乎已经不存在了(作为一块宝石),我想知道这些天我怎么能像这样自动缩放heroku员工 我不想为此支付服务费 我环顾四周,惊讶地发现解决方案似乎并不明显 heroku是否实现了这种类型的自动缩放,或者是否有其他rails gem可以为我实现?谢谢,您可以使用CLI扩展Heroku dynos,因此构建自己的服务来实现这一点非常简单 创建另一个

大约6年前,有一家rails gem-caled雇佣公司,负责根据需要启动和停止工人的后台工作,因此工人并不总是在运行,也不总是在积累费用

HireFire似乎已经不存在了(作为一块宝石),我想知道这些天我怎么能像这样自动缩放heroku员工

我不想为此支付服务费

我环顾四周,惊讶地发现解决方案似乎并不明显


heroku是否实现了这种类型的自动缩放,或者是否有其他rails gem可以为我实现?谢谢,您可以使用CLI扩展Heroku dynos,因此构建自己的服务来实现这一点非常简单

创建另一个应用程序,使用调度程序每小时运行一次,使用unix shell脚本下载并安装CLI,并使用存储为ENV变量的凭据向其他应用程序发送
scale
命令


这里有一个代码库作为该技术的示例:

您可以使用CLI扩展Heroku dynos,因此构建自己的服务来实现这一点非常简单

创建另一个应用程序,使用调度程序每小时运行一次,使用unix shell脚本下载并安装CLI,并使用存储为ENV变量的凭据向其他应用程序发送
scale
命令


这里有一个代码库作为该技术的一个示例:

更新:我找不到一个现有的库/gem/插件来为我做这件事,所以我决定自己尝试解决它

在我想出一个解决方案后,我决定回到这里。也许这对其他人会有帮助

DelayedJob有一个插件系统(我必须将我的gem版本升级到最新版本)

这就是我写的插件。我不认为它会赢得美貌奖,但它似乎做到了。如果我做了傻事,请发表评论

我还这样做,以便它在开发时检查生产/开发环境并运行本地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
类HerokuWorkerDelayedJobPlugin
您需要将插件添加到DelayedJob,如初始值设定项中所示:

Delayed::Worker.plugins << HerokuWorkerDelayedJobPlugin

Delayed::Worker.plugins更新:我找不到一个现有的库/gem/plugin来为我做这件事,所以我决定自己解决它

在我想出一个解决方案后,我决定回到这里。也许这对其他人会有帮助

DelayedJob有一个插件系统(我必须将我的gem版本升级到最新版本)

这就是我写的插件。我不认为它会赢得美貌奖,但它似乎做到了。如果我做了傻事,请发表评论

我还这样做,以便它在开发时检查生产/开发环境并运行本地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
类HerokuWorkerDelayedJobPlugin
您需要将插件添加到DelayedJob,如初始值设定项中所示:

Delayed::Worker.plugins << HerokuWorkerDelayedJobPlugin

Delayed::Worker.plugins截至2019年,Heroku gem已落日。因此,请改用web api。在我的例子中,我使用了rest客户端。可以使用从heroku cli检索授权凭据

heroku授权:创建

          if Rails.env.production?
            response = RestClient::Request.execute(
            method: :delete,
            url: 'https://api.heroku.com/apps/yourappname/dynos/worker.1',
            headers: {Authorization: 'Bearer xxxx-xxx-xxx-xxx-xxxxx',accept:'application/vnd.heroku+json; version=3'}
            )   
          end   

截至2019年,Heroku gem是日落。因此,请改用web api。在我的例子中,我使用了rest客户端。可以使用从heroku cli检索授权凭据

heroku授权:创建

          if Rails.env.production?
            response = RestClient::Request.execute(
            method: :delete,
            url: 'https://api.heroku.com/apps/yourappname/dynos/worker.1',
            headers: {Authorization: 'Bearer xxxx-xxx-xxx-xxx-xxxxx',accept:'application/vnd.heroku+json; version=3'}
            )   
          end   

Heroku确实为此提供了服务:,但它是针对运行在私人空间上的性能层dynos和dynos的。我想大多数人的明显解决方案是为这样做的服务付费。Heroku确实为此提供了服务:,但它是针对运行在私人空间上的性能层dynos和dynos的。我想大多数人