Ruby on rails 如何在rails中以编程方式启动/停止heroku workers?
大约6年前,有一家rails gem-caled雇佣公司,负责根据需要启动和停止工人的后台工作,因此工人并不总是在运行,也不总是在积累费用 HireFire似乎已经不存在了(作为一块宝石),我想知道这些天我怎么能像这样自动缩放heroku员工 我不想为此支付服务费 我环顾四周,惊讶地发现解决方案似乎并不明显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,因此构建自己的服务来实现这一点非常简单 创建另一个
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的。我想大多数人