【问题标题】:Heroku Cedar: How to scale WEB dynos based on time of dayHeroku Cedar:如何根据一天中的时间扩展 WEB dynos
【发布时间】:2012-02-29 11:52:28
【问题描述】:

我希望我的 Rails 3.1 应用在早上 8 点扩展到 1 个网络测功机,然后在下午 5 点缩小到 0 个网络测功机。

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

似乎 Heroku 调度程序应该让这变得微不足道。任何快速的解决方案或链接?

【问题讨论】:

  • 澄清/简化:如何从 ruby​​ 向现有应用添加 1 个新的 web dyno?

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


【解决方案1】:

作为@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>}]
})

【讨论】:

    【解决方案2】:

    所以我决定在 2017 年实现这一点,并看到已被接受的答案使用的 Heroku gem 已被弃用,取而代之的是 'platform-api' gem。我只是想我会发布对我有用的东西,因为我还没有看到任何其他具有更新答案的帖子。

    这是我的 rake 文件,它将我的 web dynos 扩展到 2。我使用“httparty”gem 在“Formation”中根据他们的docs 向平台 API 发出带有适当标头的 PATCH 请求部分。

    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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        刚刚实现了这种方法(@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)

        【讨论】:

          【解决方案5】:

          答案是“是”,您可以从调度程序中执行此操作,一旦您知道答案,这将是微不足道的:

          1. 使用您的应用名称添加 heroku 配置变量:heroku config:add APP_NAME:blah
          2. 将 gem '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. 添加调度器插件:heroku addons:add scheduler:standard

          6. 使用调度程序 Web 界面随时添加“rake spin_up”
          7. 添加一个 rake spin_down 任务并随时安排它。

          注意事项: 需要第 1 步,因为我找不到任何其他方法来确定应用程序名称(并且我为我的应用程序使用了“暂存”和“生产”环境。

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

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

          希望这对其他人有帮助!

          【讨论】:

          • 这会返回错误“RestClient::UnprocessableEntity: 422 Unprocessable Entity”
          • 您是否跳过了第 3 步?否则,我不知道会导致什么(假设相同的堆栈和所有堆栈)。但是您可以尝试挽救错误并查看它的含义。
          • 如果你得到一个 422 这意味着你还没有告诉 heroku 你的工作进程是做什么的。看看这里的 heroku 文档devcenter.heroku.com/articles/delayed-job 它会告诉你创建一个包含你的工人定义的 Procfile。
          【解决方案6】:

          您可以通过

          将您的网络流程缩放到零

          heroku ps:scale web=0

          或通过返回 1

          heroku ps:scale web=1

          然后,您必须将任务设置为在 8 处运行以扩大规模,而在 17 处运行以缩小规模。 Heroku 可能会要求您验证您的帐户(即输入信用卡详细信息)以使用 Heroku Scheduler plus,然后您必须在您的应用程序中拥有 Heroku gem 和您的 Heroku 凭据,以便它可以打开或关闭您的应用程序。

          但就像 Neil 所说的那样 - 您每月可以免费使用 750 小时,但不能滚动到下个月,那么为什么不让它一直运行呢?

          【讨论】:

          • 我的错,我的意思是从 1 dyno 扩展到 2。我的目标是避免工作日中烦人的 20 秒启动时间(并通过支付费用来支持 Heroku,而不是黑客攻击与 Pingdom 等)。
          【解决方案7】:

          如果您在 cedar 堆栈上运行,您将无法在不更改 procfile 和部署的情况下将 Web dyno 扩展到零。

          另外,如果您每月获得一个免费的测功机(750 个测功机小时,实际上是一个月多一点),何必费心呢?

          【讨论】:

            猜你喜欢
            • 2012-06-30
            • 2013-04-28
            • 2017-09-01
            • 2012-02-29
            • 2015-05-04
            • 2020-11-30
            • 2021-02-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多