Heroku Cedar:如何根据时间缩放WEB dynos

时间:2012-02-08 01:32:16

标签: ruby-on-rails-3 heroku automation

我希望我的Rails 3.1应用程序在早上8点扩展到1个web dyno,然后在下午5点扩展到0个web dynos。

但是,我不想报名参加付费服务,而且我不能指望我的家用电脑连接到互联网。

似乎Heroku Scheduler应该让这个变得微不足道。任何快速解决方案或链接?

8 个答案:

答案 0 :(得分:11)

答案是'是'你可以从调度程序那里做到这一点,一旦你知道了答案,这是微不足道的:

  1. 使用您的应用名称添加heroku config var:heroku config:添加APP_NAME:blah
  2. 将宝石'heroku'添加到您的Gemfile
  3. 为了验证,请手动放大/缩小您的应用:heroku ps:scale web = 2
  4. 将一个rake任务添加到lib / tasks / scheduler.rake:

    desc "Scale up dynos"
    task :spin_up => :environment do
      heroku = Heroku::Client.new('USERNAME', 'PASSWORD')
      heroku.ps_scale(ENV['APP_NAME'], :type=>'web', :qty=>2)
    end
    # Add a similar task to Spin down
    
  5. 添加Scheduler插件:heroku插件:添加调度程序:标准

  6. 使用Scheduler Web界面随时添加“rake spin_up”
  7. 添加rake spin_down任务并随时安排。
  8. 备注: 需要步骤1,因为我找不到任何其他方式来确定应用程序名称(我为我的应用程序使用'staging'和'production'环境。

    步骤3是必需的,因为否则ruby命令会出错,因为它要求您首先同意(通过是/否响应)您将因此操作而向您收取费用。

    在第4步中,我找不到任何关于如何通过heroku gem使用API​​密钥执行此操作的文档,因此看起来需要user / pass。

    希望这有助于其他人!

答案 1 :(得分:11)

刚刚实现了这种方法(@dnszero上面的答案很好),我想我会用Heroku的新API更新答案。

将您的应用名称添加为heroku配置变量

 require 'heroku-api'
  desc "Scale UP dynos"
   task :spin_up => :environment do
     heroku = Heroku::API.new(:api_key => 'YOUR_ACCOUNT_API_KEY')
     heroku.post_ps_scale(ENV['APP_NAME'], 'web', 2)
   end

这是heroku(2.31.2),heroku-api(0.3.5)

答案 2 :(得分:3)

您可以通过

将网络流程扩展为零

heroku ps:scale web=0

或通过

返回1

heroku ps:scale web=1

然后你必须设置一个任务设置为8,它可以扩展它,另一个设置为17,可以缩小它。 Heroku可能会要求您验证您的帐户(即输入信用卡详细信息)以使用Heroku Scheduler plus,然后您必须在您的应用程序中使用Heroku gem以及Heroku凭据,以便它可以打开或关闭您的应用程序。 / p>

但是就像尼尔说的那样 - 你每个月可以免费获得750小时的费用,但是为什么不能让它一直运行?

答案 3 :(得分:1)

另请参阅此完整要点,该要点还涉及Heroku调度程序中使用的正确命令:https://gist.github.com/maggix/8676595

答案 4 :(得分:1)

所以我决定在2017年实现这一点,并且看到已接受的答案所使用的Heroku gem已被弃用,以支持'platform-api'gem。我只是觉得我会发布对我有用的内容,因为我没有看到任何其他帖子更新的答案。

这是我的rake文件,它将我的网络dynos缩放到2个。我使用'httparty'gem来为Platform API发出一个PATCH请求,根据他们的docs,在“形成“部分。

require 'platform-api'
require 'httparty'

desc "Scale UP dynos"
task :scale_up => :environment do
  headers = {
    "Authorization" => "Bearer #{ENV['HEROKU_API_KEY']}",
    "Content-Type" => "application/json",
    "Accept" => "application/vnd.heroku+json; version=3"
  }

  params = {
    :quantity => 2,
    :size => "standard-1X"
  }

  response = HTTParty.patch("https://api.heroku.com/apps/#{ENV['APP_NAME']}/formation/web", body: params.to_json, headers: headers)

  puts response
end

答案 5 :(得分:0)

如果你在雪松堆上运行,你将无法在不改变proc文件和部署的情况下扩展到零web dynos。

另外,如果你每月获得一个免费的dyno(750 dyno小时,实际上是一个多月),为什么还要费心呢?

答案 6 :(得分:0)

或者,如果您想使用服务而不是实现自己的服务,请尝试http://scaledynos.herokuapp.com/ - 它会根据时间进行缩放

答案 7 :(得分:0)

作为对@ Ren的回答的更新,Heroku的Platform API gem使这非常简单。

heroku = PlatformAPI.connect_oauth(<HEROKU PLATFORM API KEY>)
heroku.formation.batch_update(<HEROKU APP NAME>, {"updates" => 
  [{"process" => <PROCESS NAME>, 
  "quantity" => <QUANTITY AS INTEGER>, 
  "size" => <DYNO SIZE>}]
})